#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(100), 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; m_UpVector=Vector(0,1,0); m_UpVector=m_UpVector.Rotate(Vector(0,0,1),m_Orientation.z); m_UpVector=m_UpVector.Rotate(Vector(0,1,0),m_Orientation.y); m_UpVector=m_UpVector.Rotate(Vector(1,0,0),m_Orientation.x); m_RightVector=Vector(1,0,0); m_RightVector=m_RightVector.Rotate(Vector(0,0,1),m_Orientation.z); m_RightVector=m_RightVector.Rotate(Vector(0,1,0),m_Orientation.y); m_RightVector=m_RightVector.Rotate(Vector(1,0,0),m_Orientation.x); m_ViewDirection=Vector(0,0,-1); m_ViewDirection=m_ViewDirection.Rotate(Vector(0,0,1),m_Orientation.z); m_ViewDirection=m_ViewDirection.Rotate(Vector(0,1,0),m_Orientation.y); m_ViewDirection=m_ViewDirection.Rotate(Vector(1,0,0),m_Orientation.x); m_LookAt=m_EyePosition+m_ViewDirection; } 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(m_UpVector,angle); m_RightVector=m_RightVector.Rotate(m_UpVector,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(); 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::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; } }