|
|
|
@ -1,4 +1,6 @@ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <cassert> |
|
|
|
|
|
|
|
|
|
|
|
#include <GL/glew.h> |
|
|
|
#include <GL/glew.h> |
|
|
|
|
|
|
|
|
|
|
|
#include "camera.h" |
|
|
|
#include "camera.h" |
|
|
|
@ -8,7 +10,6 @@ |
|
|
|
#define ROTATE_SPEED 0.005f |
|
|
|
#define ROTATE_SPEED 0.005f |
|
|
|
#define CAMERA_Z_CLAMP_ANGLE 85.f |
|
|
|
#define CAMERA_Z_CLAMP_ANGLE 85.f |
|
|
|
#define FOV 60.f |
|
|
|
#define FOV 60.f |
|
|
|
#define ASPECT_RATIO 16.f/9.f |
|
|
|
|
|
|
|
#define NEAR_CLIP_PLANE 20.f |
|
|
|
#define NEAR_CLIP_PLANE 20.f |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -19,20 +20,29 @@ inline glm::vec3 convertv3f(v3f v); |
|
|
|
// interface
|
|
|
|
// interface
|
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
cameraInitPerspective(camera& cam, glm::vec3 position, glm::vec3 target, glm::vec3 world_up) |
|
|
|
cameraInitPerspective(camera& cam, |
|
|
|
|
|
|
|
glm::vec3 position, |
|
|
|
|
|
|
|
glm::vec3 target, |
|
|
|
|
|
|
|
glm::vec3 world_up, |
|
|
|
|
|
|
|
float aspect_ratio) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
assert(aspect_ratio > 0); |
|
|
|
|
|
|
|
|
|
|
|
cam.position = position; |
|
|
|
cam.position = position; |
|
|
|
cam.target = target; |
|
|
|
cam.target = target; |
|
|
|
cam.world_up = world_up; |
|
|
|
cam.world_up = world_up; |
|
|
|
cam.projection = glm::infinitePerspective(glm::radians(FOV), ASPECT_RATIO, NEAR_CLIP_PLANE); |
|
|
|
cam.projection = glm::infinitePerspective(glm::radians(FOV), |
|
|
|
|
|
|
|
aspect_ratio, |
|
|
|
|
|
|
|
NEAR_CLIP_PLANE); |
|
|
|
|
|
|
|
|
|
|
|
cam.forward = glm::normalize(target - position); |
|
|
|
cam.forward = glm::normalize(target - position); |
|
|
|
cam.left = glm::normalize(glm::cross(cam.world_up, cam.forward)); |
|
|
|
cam.left = glm::normalize(glm::cross(cam.world_up, cam.forward)); |
|
|
|
cam.up = glm::normalize(glm::cross(cam.forward, cam.left)); |
|
|
|
cam.up = glm::normalize(glm::cross(cam.forward, cam.left)); |
|
|
|
|
|
|
|
|
|
|
|
cam.hAngle = glm::atan(cam.forward.x, cam.forward.y); |
|
|
|
cam.hAngle = glm::atan(cam.forward.x, cam.forward.y); |
|
|
|
// NOTE: using pythagoras' to get absolute value of relative axis for vAngle component
|
|
|
|
// NOTE: get absolute value of relative axis for vAngle component
|
|
|
|
real32 len = glm::sqrt(glm::pow(cam.forward.y, 2) + glm::pow(cam.forward.x, 2)); |
|
|
|
real32 len = glm::sqrt(glm::pow(cam.forward.y, 2) + |
|
|
|
|
|
|
|
glm::pow(cam.forward.x, 2)); |
|
|
|
cam.vAngle = glm::atan(cam.forward.z, len); |
|
|
|
cam.vAngle = glm::atan(cam.forward.z, len); |
|
|
|
|
|
|
|
|
|
|
|
cam.view = glm::lookAt(cam.position, cam.position + cam.forward, cam.up); |
|
|
|
cam.view = glm::lookAt(cam.position, cam.position + cam.forward, cam.up); |
|
|
|
|