|
|
|
|
@ -3,30 +3,29 @@
|
|
|
|
|
|
|
|
|
|
#include "camera.h" |
|
|
|
|
|
|
|
|
|
// TODO: add these props to scene json
|
|
|
|
|
#define MOVE_SPEED 5.f |
|
|
|
|
#define ROTATE_SPEED 0.005f |
|
|
|
|
#define CAMERA_Z_CLAMP_ANGLE 85.f |
|
|
|
|
#define FOV 60.f |
|
|
|
|
#define ASPECT_RATIO 16.f/9.f |
|
|
|
|
#define NEAR_CLIP_PLANE 0.1f |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
cameraInitPerspective(camera& cam, glm::vec3 position, glm::vec3 target, glm::vec3 up) |
|
|
|
|
cameraInitPerspective(camera& cam, glm::vec3 position, glm::vec3 target, glm::vec3 world_up) |
|
|
|
|
{ |
|
|
|
|
cam.position = position; |
|
|
|
|
cam.target = target; |
|
|
|
|
cam.up = up; |
|
|
|
|
cam.world_up = world_up; |
|
|
|
|
cam.projection = glm::infinitePerspective(glm::radians(FOV), ASPECT_RATIO, NEAR_CLIP_PLANE); |
|
|
|
|
|
|
|
|
|
cam.hAngle = 0; |
|
|
|
|
cam.vAngle = glm::atan((cam.target.z - cam.position.z) / (cam.target.y - cam.position.y)); |
|
|
|
|
cam.forward = glm::normalize(target - position); |
|
|
|
|
cam.left = glm::normalize(glm::cross(cam.world_up, cam.forward)); |
|
|
|
|
cam.up = glm::normalize(glm::cross(cam.forward, cam.left)); |
|
|
|
|
|
|
|
|
|
// FIXME: bug, camera always starts with forward pointing at positive 'z' axis
|
|
|
|
|
// camera position also changes with change to window size
|
|
|
|
|
cam.forward = glm::normalize(glm::vec3( |
|
|
|
|
glm::cos(cam.vAngle) * glm::sin(cam.hAngle), |
|
|
|
|
glm::cos(cam.vAngle) * glm::cos(cam.hAngle), |
|
|
|
|
glm::sin(cam.vAngle) |
|
|
|
|
)); |
|
|
|
|
cam.left = glm::normalize(glm::cross(cam.up, cam.forward)); |
|
|
|
|
cam.up = glm::normalize(glm::cross(cam.forward, cam.left)); // get better "up" vector
|
|
|
|
|
cam.hAngle = glm::atan(cam.forward.x, cam.forward.y); |
|
|
|
|
cam.vAngle = glm::atan(cam.forward.z, cam.forward.y); |
|
|
|
|
|
|
|
|
|
cam.view = glm::lookAt(cam.position, cam.position + cam.forward, cam.up); |
|
|
|
|
cam.model = glm::mat4(1.0f); |
|
|
|
|
@ -119,8 +118,7 @@ cameraRotate(camera& cam, int32 xrel, int32 yrel)
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
glm::normalize(cam.forward); |
|
|
|
|
cam.up = glm::vec3(0,0,1); |
|
|
|
|
cam.left = glm::normalize(glm::cross(cam.forward, cam.up)); |
|
|
|
|
cam.left = glm::normalize(glm::cross(cam.forward, cam.world_up)); |
|
|
|
|
cam.up = glm::normalize(glm::cross(cam.left, cam.forward)); |
|
|
|
|
|
|
|
|
|
cam.view = glm::lookAt(cam.position, cam.position + cam.forward, cam.up); |
|
|
|
|
|