197 lines
5.0 KiB
C++
197 lines
5.0 KiB
C++
#include "camera.hpp"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CAMERA
|
|
//-----------------------------------------------------------------------------
|
|
Camera::Camera()
|
|
{
|
|
x = 0;
|
|
y = 0;
|
|
z = 0;
|
|
yaw = 0;
|
|
pitch = 0;
|
|
fov = 50;
|
|
near = 1;
|
|
far = 1000;
|
|
|
|
float fov_rad = to_rad(fov);
|
|
scale_coef = 64 * near * tanf(fov_rad);
|
|
cos_fov = SCALE_AI * cosf(fov_rad);
|
|
//sin_fov = SCALE_AI * sinf(fov_rad);
|
|
sin_fov = sinf(fov_rad);
|
|
cos_fov_square = cosf(fov_rad) * cosf(fov_rad);
|
|
//near_coef = - far / float(far - near);
|
|
//far_coef = - far * near * 128 / (far - near);
|
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// SET
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::set(float _x, float _y, float _z, float _yaw, float _pitch)
|
|
{
|
|
x = _x;
|
|
y = _y;
|
|
z = _z;
|
|
yaw = to_rad(_yaw);
|
|
pitch = to_rad(_pitch);
|
|
}
|
|
|
|
void Camera::set(Camera* _camera)
|
|
{
|
|
x = _camera->x;
|
|
y = _camera->y;
|
|
z = _camera->z;
|
|
yaw = _camera->yaw;
|
|
pitch = _camera->pitch;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// UPDATE_CAMERA
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::update()
|
|
{
|
|
if (look_at_duration)
|
|
{
|
|
yaw = (yaw * (look_at_duration - 1) + look_at_yaw) / look_at_duration;
|
|
look_at_duration -= 1;
|
|
}
|
|
|
|
cos_yaw = cosf(yaw);
|
|
sin_yaw = sinf(yaw);
|
|
cos_pitch = cosf(pitch);
|
|
sin_pitch = sinf(pitch);
|
|
|
|
//nx = SCALE_AI * cos_pitch * cos_yaw;
|
|
//ny = SCALE_AI * cos_pitch * sin_yaw;
|
|
//nz = SCALE_AI * sin_pitch;
|
|
|
|
nx = cos_pitch * cos_yaw;
|
|
ny = cos_pitch * sin_yaw;
|
|
nz = sin_pitch;
|
|
|
|
// a1 a2 a3
|
|
// a4 a5 a6
|
|
// a7 a8 a9
|
|
|
|
a1 = SCALE_AI * cos_pitch * cos_yaw;
|
|
a2 = SCALE_AI * cos_pitch * sin_yaw;
|
|
a3 = SCALE_AI * sin_pitch;
|
|
a4 = SCALE_AI * -sin_yaw;
|
|
a5 = SCALE_AI * cos_yaw;
|
|
a6 = SCALE_AI * 0;
|
|
a7 = SCALE_AI * -sin_pitch * cos_yaw;
|
|
a8 = SCALE_AI * sin_pitch * -sin_yaw;
|
|
a9 = SCALE_AI * cos_pitch;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// NORMAL_VECTOR
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::direction_vector(float* _x, float* _y)
|
|
{
|
|
*_x = cos_yaw;
|
|
*_y = sin_yaw;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MOVE_FRONT (valeur positive signifie devant)
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::move_front(float value)
|
|
{
|
|
x += value * cosf(yaw);
|
|
y -= value * sinf(yaw);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MOVE_SIDE (valeur positive signifie à droite)
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::move_side(float value)
|
|
{
|
|
x -= value * sinf(yaw);
|
|
y -= value * cosf(yaw);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MOVE_ALTITUDE (valeur positive signifie en haut)
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::move_altitude(float value)
|
|
{
|
|
z += value;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// TURN_YAW (valeur positive signifie a gauche)
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::turn_yaw(float value)
|
|
{
|
|
yaw += to_rad(value);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// TURN_PITCH (valeur positive signifie en haut)
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::turn_pitch(float value)
|
|
{
|
|
pitch += to_rad(value);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// SET_YAW (valeur positive signifie a gauche)
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::set_yaw(float value)
|
|
{
|
|
yaw = to_rad(value);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// SET_PITCH (valeur positive signifie en haut)
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::set_pitch(float value)
|
|
{
|
|
pitch = to_rad(value);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// LOOK_AT
|
|
//-----------------------------------------------------------------------------
|
|
void Camera::look_at(float look_at_x, float look_at_y, float look_at_z, float duration)
|
|
{
|
|
look_at_yaw = 0;//atan2f(look_at_y - y, look_at_x - x);
|
|
|
|
//look_at_pitch = atan2(look_at_z - z, look_at_x - x);
|
|
// calcule de sqrt ??
|
|
look_at_duration = duration;
|
|
}
|
|
|
|
/*
|
|
//-----------------------------------------------------------------------------
|
|
// MIN
|
|
//-----------------------------------------------------------------------------
|
|
int Camera::min(int a, int b)
|
|
{
|
|
return (a < b) ? a : b;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MAX
|
|
//-----------------------------------------------------------------------------
|
|
int Camera::max(int a, int b)
|
|
{
|
|
return (a > b) ? a : b;
|
|
}
|
|
*/
|
|
|
|
|
|
|
|
|
|
|