#include ".\camera.h" Camera::Camera(void): m_EyePosition(0,0,0), m_LookAt(0,0,-1), m_UpVector(0,1,0), m_RightVector(1,0,0), m_ViewDirection(0,0,-1), m_Orientation(0,0,0), m_AspectRatio(1), m_NearClipDistance(0.1), m_FarClipDistance(500), m_FovX(45), m_FovY(45), m_LeftCorner(-1), m_RightCorner(1), m_DownCorner(-1), m_TopCorner(1) { } Camera::~Camera(void) { } void Camera::Rotate(Vector rotvec) { m_Orientation+=rotvec; } void Camera::Rotate(Axis axis, double angle) { switch (axis) { case AXIS_X: m_UpVector=m_UpVector.Rotate(m_RightVector,angle); m_ViewDirection=m_ViewDirection.Rotate(m_RightVector,angle); UpdateCamera(); break; case AXIS_Y: m_ViewDirection=m_ViewDirection.Rotate(Vector(0,1,0),angle); m_RightVector=m_RightVector.Rotate(Vector(0,1,0),angle); UpdateCamera(); break; case AXIS_Z: m_RightVector=m_RightVector.Rotate(m_ViewDirection,angle); m_UpVector=m_UpVector.Rotate(m_ViewDirection,angle); break; } } void Camera::UpdateCamera(void) { m_LookAt=m_EyePosition+m_ViewDirection; } void Camera::SetProjection(void) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(m_FovY,m_AspectRatio,m_NearClipDistance,m_FarClipDistance); } void Camera::SetViewandProjection(void) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(m_FovY,m_AspectRatio,m_NearClipDistance,m_FarClipDistance); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); ////// m_UpVector=Vector(0,1,0); m_RightVector=Vector(1,0,0); m_ViewDirection=Vector(0,0,-1); m_UpVector=m_UpVector.RotateX(m_Orientation.x); m_ViewDirection=m_ViewDirection.RotateX(m_Orientation.x); m_UpVector=m_UpVector.RotateY(m_Orientation.y); m_ViewDirection=m_ViewDirection.RotateY(m_Orientation.y); m_RightVector=m_RightVector.RotateY(m_Orientation.y); m_LookAt=m_EyePosition+m_ViewDirection; ///// 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); /* glRotatef(-m_Orientation.y,0,1,0); glRotatef(-m_Orientation.x,1,0,0); //glRotatef(m_Orientation.z,0,0,1); glTranslatef(-m_EyePosition.x,-m_EyePosition.y,m_EyePosition.z);*/ } void Camera::SetViewandProjectionNew(void) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(m_FovY,m_AspectRatio,m_NearClipDistance,m_FarClipDistance); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); ////// m_UpVector=Vector(0,1,0); m_RightVector=Vector(1,0,0); m_ViewDirection=Vector(0,0,-1); m_UpVector=m_UpVector.RotateX(m_Orientation.x); m_ViewDirection=m_ViewDirection.RotateX(m_Orientation.x); m_UpVector=m_UpVector.RotateY(m_Orientation.y); m_ViewDirection=m_ViewDirection.RotateY(m_Orientation.y); m_RightVector=m_RightVector.RotateY(m_Orientation.y); m_UpVector=m_UpVector.RotateZ(m_Orientation.z); m_ViewDirection=m_ViewDirection.RotateZ(m_Orientation.z); m_RightVector=m_RightVector.RotateZ(m_Orientation.z); m_LookAt=m_EyePosition+m_ViewDirection; ///// 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); /* glRotatef(-m_Orientation.y,0,1,0); glRotatef(m_Orientation.z,0,0,1); glRotatef(-m_Orientation.x,1,0,0); glTranslatef(-m_EyePosition.x,-m_EyePosition.y,-m_EyePosition.z);*/ } void Camera::SetViewandProjectionOrto(void) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(m_LeftCorner,m_RightCorner,m_DownCorner,m_TopCorner,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 Camera::Move(Axis axis, double distance) { switch (axis) { case AXIS_X: m_EyePosition+=m_RightVector.UnitVector()*distance; m_LookAt+=m_RightVector.UnitVector()*distance; break; case AXIS_Y: m_EyePosition+=m_UpVector.UnitVector()*distance; m_LookAt+=m_UpVector.UnitVector()*distance; break; case AXIS_Z: m_EyePosition+=m_ViewDirection.UnitVector()*distance; m_LookAt+=m_ViewDirection.UnitVector()*distance; break; } }