#include ".\thirdpersoncamera.h" ThirdPersonCamera::ThirdPersonCamera(void) { rot=0; yaw=0; dist=1; m_RightVector=Vector(1,0,0); m_UpVector=Vector(0,1,0); m_EyePosition=Vector(0,0,-1); m_LookAt=Vector(0,0,0); m_ViewDirection=Vector(0,0,1); } ThirdPersonCamera::~ThirdPersonCamera(void) { } void ThirdPersonCamera::setViewforBbox() { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,0,-m_EyePosition.x, -m_EyePosition.y, -m_EyePosition.z, m_UpVector.x, m_UpVector.y, m_UpVector.z); } void ThirdPersonCamera::SetViewandProjection(void) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(m_FovY,m_AspectRatio,m_NearClipDistance,m_FarClipDistance); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(m_EyePosition.x, m_EyePosition.y, m_EyePosition.z, m_LookAt.x, m_LookAt.y, m_LookAt.z, m_UpVector.x, m_UpVector.y, m_UpVector.z); } void ThirdPersonCamera::Move(Axis axis, double distance) { switch (axis) { case AXIS_X: rot+=distance*3.14/40.0; break; case AXIS_Y: yaw+=distance*3.14/40.0; break; case AXIS_Z: dist-=distance; break; } Vector dir(cos(rot)*cos(yaw),sin(yaw),sin(rot)*cos(yaw)); Vector d=dir; if(d.y==0) { m_UpVector=Vector(0,1,0); } else { d.y=0; d.Normalize(); m_UpVector=dir-d; if(d.y<0)m_UpVector*=-1; m_UpVector.Normalize(); } m_RightVector=m_UpVector%dir; m_RightVector.Normalize(); dir=dir*dist; m_EyePosition=m_LookAt+dir; m_Orientation.y=rot/3.14*180.0; m_Orientation.x=-yaw/3.14*180.0; } void ThirdPersonCamera::SetPosition(Vector position) { m_EyePosition=position; Vector dir0=m_EyePosition-m_LookAt; dir0.Normalize(); Vector ddd; ddd.x=dir0.x; ddd.y=dir0.y; ddd.z=dir0.z; if(ddd.y==0) { m_UpVector=Vector(0,1,0); } else { ddd.y=0; ddd.Normalize(); m_UpVector=dir0-ddd; if(ddd.y<0)m_UpVector*=-1; m_UpVector.Normalize(); } m_RightVector=m_UpVector%(dir0*-1); m_RightVector.Normalize(); }