GPX-Visualizer/camera/Camera.cpp

142 lines
2.1 KiB
C++

#include <stdio.h>
#include <math.h>
#include <GL/glut.h>
#include "Camera.h"
void Camera::Init()
{
m_yaw = 0.0;
m_pitch = 0.0;
target = Target::FORWARD;
t_x = t_y = t_z = 0.0f;
SetPos(0, 20, 0);
}
void Camera::Refresh()
{
// Camera parameter according to Riegl's co-ordinate system
// x/z for flat, y for height
m_lx = cos(m_yaw) * cos(m_pitch);
m_ly = sin(m_yaw) * cos(m_pitch);
m_lz = sin(m_pitch);
m_strafe_lx = cos(m_yaw - M_PI_2);
m_strafe_ly = sin(m_yaw - M_PI_2);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if(target == Target::FORWARD)
gluLookAt(m_x, m_y, m_z, // eye at
m_x + m_lx, m_y + m_ly, m_z + m_lz, // look at
0.0,1.0,0.0); // up
else
gluLookAt(m_x, m_y, m_z, // eye at
0.0f, 0.0f, 0.0f, // look at
0.0f, 1.0f, 0.0f); // up
// printf("Camera: %f %f %f Direction vector: %f %f %f\n", m_x, m_y, m_z, m_lx, m_ly, m_lz);
}
void Camera::SetPos(float x, float y, float z)
{
m_x = x;
m_y = y;
m_z = z;
Refresh();
}
void Camera::GetPos(float &x, float &y, float &z)
{
x = m_x;
y = m_y;
z = m_z;
}
void Camera::GetDirectionVector(float &x, float &y, float &z)
{
x = m_lx;
y = m_ly;
z = m_lz;
}
void Camera::SetTarget(Target t, float x, float y, float z)
{
target = t;
if(target == Target::POINT)
{
t_x = x;
t_y = y;
t_z = z;
}
Refresh();
}
void Camera::Move(float incr)
{
float lx = cos(m_yaw)*cos(m_pitch);
float ly = sin(m_yaw)*cos(m_pitch);
float lz = sin(m_pitch);
m_x = m_x + incr*lx;
m_y = m_y + incr*ly;
m_z = m_z + incr*lz;
Refresh();
}
void Camera::Strafe(float incr)
{
m_x = m_x + incr*m_strafe_lx;
m_y = m_y + incr*m_strafe_ly;
Refresh();
}
void Camera::Fly(float incr)
{
m_y = m_y + incr;
Refresh();
}
void Camera::RotateYaw(float angle)
{
m_yaw += angle;
Refresh();
}
void Camera::RotatePitch(float angle)
{
const float limit = 89.0 * M_PI / 180.0;
m_pitch += angle;
if(m_pitch < -limit)
m_pitch = -limit;
if(m_pitch > limit)
m_pitch = limit;
Refresh();
}
void Camera::SetYaw(float angle)
{
m_yaw = angle;
Refresh();
}
void Camera::SetPitch(float angle)
{
m_pitch = angle;
Refresh();
}