Add camera controls
This commit is contained in:
parent
e3a67c6d00
commit
59bd0c30b1
10
imgui.ini
10
imgui.ini
|
@ -4,8 +4,8 @@ Size=400,400
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Terrain Controls]
|
[Window][Terrain Controls]
|
||||||
Pos=868,19
|
Pos=863,19
|
||||||
Size=412,701
|
Size=417,701
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000002,0
|
DockId=0x00000002,0
|
||||||
|
|
||||||
|
@ -24,12 +24,12 @@ Collapsed=0
|
||||||
|
|
||||||
[Window][Scene Window]
|
[Window][Scene Window]
|
||||||
Pos=0,19
|
Pos=0,19
|
||||||
Size=866,701
|
Size=861,701
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000001,0
|
DockId=0x00000001,0
|
||||||
|
|
||||||
[Docking][Data]
|
[Docking][Data]
|
||||||
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,19 Size=1280,701 Split=X Selected=0x9F2D9299
|
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,19 Size=1280,701 Split=X Selected=0x9F2D9299
|
||||||
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=866,701 CentralNode=1 Selected=0x9F2D9299
|
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=861,701 CentralNode=1 Selected=0x9F2D9299
|
||||||
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=412,701 Selected=0xF69494A7
|
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=417,701 Selected=0xF69494A7
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
#ifndef CAMERA_H_
|
||||||
|
#define CAMERA_H_
|
||||||
|
|
||||||
|
#define GLM_ENABLE_EXPERIMENTAL
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
#include <glm/gtx/transform.hpp>
|
||||||
|
#include <glm/gtc/type_ptr.hpp>
|
||||||
|
|
||||||
|
#include "transform.h"
|
||||||
|
|
||||||
|
struct Camera {
|
||||||
|
Transform transform;
|
||||||
|
float focalLength; // In mm
|
||||||
|
float sensorHeight;
|
||||||
|
float nearPlane;
|
||||||
|
float farPlane;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace CameraControls {
|
||||||
|
void TranslateCamera(Camera& camera, const glm::vec3& translationDelta);
|
||||||
|
void RotateCamera(Camera& camera, const glm::vec3& rotationDelta);
|
||||||
|
|
||||||
|
void SetPosition(Camera& camera, const glm::vec3& position);
|
||||||
|
void SetRotation(Camera& camera, const glm::vec3& rotation);
|
||||||
|
|
||||||
|
glm::vec3 GetPosition(Camera& camera);
|
||||||
|
glm::vec3 GetCenter(Camera& camera);
|
||||||
|
float GetFOV(Camera& camera);
|
||||||
|
|
||||||
|
void AdjustFocalLength(Camera& camera, float focalLength);
|
||||||
|
void AdjustSensorHeight(Camera& camera, float sensorHeight);
|
||||||
|
void AdjustNearPlane(Camera& camera, float nearPlane);
|
||||||
|
void AdjustFarPlane(Camera& camera, float farPlane);
|
||||||
|
|
||||||
|
glm::mat4 GetViewMatrix(Camera& camera);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CAMERA_H_
|
|
@ -7,6 +7,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "fbo.h"
|
#include "fbo.h"
|
||||||
|
#include "camera.h"
|
||||||
|
|
||||||
struct Vertex {
|
struct Vertex {
|
||||||
glm::vec3 position;
|
glm::vec3 position;
|
||||||
|
@ -34,6 +35,7 @@ class Scene {
|
||||||
void InitQuadBuffers();
|
void InitQuadBuffers();
|
||||||
void InitShaders();
|
void InitShaders();
|
||||||
|
|
||||||
|
Camera activeCamera_;
|
||||||
Framebuffer geo_fbo_;
|
Framebuffer geo_fbo_;
|
||||||
Framebuffer lht_fbo_;
|
Framebuffer lht_fbo_;
|
||||||
GLuint shader_program_;
|
GLuint shader_program_;
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
#ifndef TRANSFORM_H_
|
||||||
|
#define TRANSFORM_H_
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
|
struct Transform {
|
||||||
|
glm::vec3 translation;
|
||||||
|
glm::vec3 rotation;
|
||||||
|
glm::vec3 scale;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace TransformControls {
|
||||||
|
void SetPosition(Transform& transform, const glm::vec3& newPosition);
|
||||||
|
void SetRotation(Transform& transform, const glm::vec3& newRotation);
|
||||||
|
void SetScale(Transform& transform, const glm::vec3& newScale);
|
||||||
|
|
||||||
|
void Translate(Transform& transform, const glm::vec3& translationDelta);
|
||||||
|
void Rotate(Transform& transform, const glm::vec3& rotationDelta);
|
||||||
|
void Scale(Transform& transform, const glm::vec3& scaleDelta);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TRANSFORM_H_
|
|
@ -0,0 +1,53 @@
|
||||||
|
#include "camera.h"
|
||||||
|
|
||||||
|
namespace CameraControls {
|
||||||
|
void TranslateCamera(Camera& camera, const glm::vec3& translationDelta) {
|
||||||
|
TransformControls::Translate(camera.transform, translationDelta);
|
||||||
|
}
|
||||||
|
void RotateCamera(Camera& camera, const glm::vec3& rotationDelta) {
|
||||||
|
TransformControls::Rotate(camera.transform, rotationDelta);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetPosition(Camera& camera, const glm::vec3& position) {
|
||||||
|
TransformControls::SetPosition(camera.transform, position);
|
||||||
|
}
|
||||||
|
void SetRotation(Camera& camera, const glm::vec3& rotation) {
|
||||||
|
TransformControls::SetRotation(camera.transform, rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 GetPosition(Camera& camera) {
|
||||||
|
return camera.transform.translation;
|
||||||
|
}
|
||||||
|
glm::vec3 GetRotation(Camera& camera) {
|
||||||
|
return camera.transform.rotation;
|
||||||
|
}
|
||||||
|
glm::vec3 GetCenter(Camera& camera) {
|
||||||
|
glm::vec3 forward;
|
||||||
|
forward.x = cos(camera.transform.rotation.y) * cos(camera.transform.rotation.x);
|
||||||
|
forward.y = sin(camera.transform.rotation.x);
|
||||||
|
forward.z = sin(camera.transform.rotation.y) * cos(camera.transform.rotation.x);
|
||||||
|
|
||||||
|
return GetPosition(camera) + GetRotation(camera);
|
||||||
|
}
|
||||||
|
float GetFOV(Camera& camera) {
|
||||||
|
return 2.0f * atan(camera.sensorHeight / (2.0f * camera.focalLength));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdjustFocalLength(Camera& camera, float focalLength) {
|
||||||
|
camera.focalLength = focalLength;
|
||||||
|
}
|
||||||
|
void AdjustSensorHeight(Camera& camera, float sensorHeight) {
|
||||||
|
camera.sensorHeight = sensorHeight;
|
||||||
|
}
|
||||||
|
void AdjustNearPlane(Camera& camera, float nearPlane) {
|
||||||
|
camera.nearPlane = nearPlane;
|
||||||
|
}
|
||||||
|
void AdjustFarPlane(Camera& camera, float farPlane) {
|
||||||
|
camera.farPlane = farPlane;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::mat4 GetViewMatrix(Camera& camera) {
|
||||||
|
//return glm::lookAt(glm::vec3(0.0f, 1.4f, 1.4f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
|
||||||
|
return glm::lookAt(GetPosition(camera), GetCenter(camera), glm::vec3(0.0f, 1.0f, 0.0f));
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,7 +48,7 @@ namespace {
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, textureId, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, textureId, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}; // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace FBO {
|
namespace FBO {
|
||||||
Framebuffer GenerateFramebuffer(int width, int height) {
|
Framebuffer GenerateFramebuffer(int width, int height) {
|
||||||
|
@ -102,4 +102,4 @@ namespace FBO {
|
||||||
glDeleteFramebuffers(1, &fbo.id);
|
glDeleteFramebuffers(1, &fbo.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}; // namespace
|
} // namespace FBO
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "scene.h"
|
#include "scene.h"
|
||||||
|
#include "camera.h"
|
||||||
#include "Uniforms.h"
|
#include "Uniforms.h"
|
||||||
#include "InitShader.h"
|
#include "InitShader.h"
|
||||||
#include "DebugCallback.h"
|
#include "DebugCallback.h"
|
||||||
|
@ -85,6 +86,13 @@ void Scene::Init() {
|
||||||
ReloadShader();
|
ReloadShader();
|
||||||
InitQuadBuffers();
|
InitQuadBuffers();
|
||||||
|
|
||||||
|
CameraControls::SetPosition(activeCamera_, glm::vec3(1.4f, 1.4f, 0.0f));
|
||||||
|
CameraControls::SetRotation(activeCamera_, -glm::normalize(CameraControls::GetPosition(activeCamera_)));
|
||||||
|
CameraControls::AdjustFocalLength(activeCamera_, 50.0f); // Temporary hardcode focal length
|
||||||
|
CameraControls::AdjustSensorHeight(activeCamera_, 24.0f); // Temporary hardcode focal length
|
||||||
|
CameraControls::AdjustNearPlane(activeCamera_, near_z_);
|
||||||
|
CameraControls::AdjustFarPlane(activeCamera_, far_z_);
|
||||||
|
|
||||||
UpdateCamera();
|
UpdateCamera();
|
||||||
Uniforms::Init();
|
Uniforms::Init();
|
||||||
}
|
}
|
||||||
|
@ -211,8 +219,7 @@ void Scene::Display(GLFWwindow* window) {
|
||||||
|
|
||||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
|
||||||
view_matrix_ = glm::lookAt(glm::vec3(0.0f, 1.4f, 1.4f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
|
Uniforms::SceneData.PV = projection_matrix_ * CameraControls::GetViewMatrix(activeCamera_); // Projection-View matrix
|
||||||
Uniforms::SceneData.PV = projection_matrix_ * view_matrix_; // Projection-View matrix
|
|
||||||
Uniforms::BufferSceneData();
|
Uniforms::BufferSceneData();
|
||||||
|
|
||||||
glm::mat4 model_matrix = glm::rotate(angle_, glm::vec3(1.0f, 0.0f, 0.0f)) * glm::scale(glm::vec3(scale_));
|
glm::mat4 model_matrix = glm::rotate(angle_, glm::vec3(1.0f, 0.0f, 0.0f)) * glm::scale(glm::vec3(scale_));
|
||||||
|
@ -366,7 +373,7 @@ std::vector<int16_t> Scene::LoadHGT(const std::string& filename, int width, int
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::UpdateCamera() {
|
void Scene::UpdateCamera() {
|
||||||
projection_matrix_ = glm::perspective(fov_, aspect_, near_z_, far_z_);
|
projection_matrix_ = glm::perspective(CameraControls::GetFOV(activeCamera_), aspect_, activeCamera_.nearPlane, activeCamera_.farPlane);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint Scene::CreateHeightmapTexture(std::vector<int16_t> data, int width, int height) {
|
GLuint Scene::CreateHeightmapTexture(std::vector<int16_t> data, int width, int height) {
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
#include "transform.h"
|
||||||
|
|
||||||
|
namespace TransformControls {
|
||||||
|
void SetPosition(Transform& transform, const glm::vec3& newPosition) {
|
||||||
|
transform.translation = newPosition;
|
||||||
|
}
|
||||||
|
void SetRotation(Transform& transform, const glm::vec3& newRotation) {
|
||||||
|
transform.rotation = newRotation;
|
||||||
|
}
|
||||||
|
void SetScale(Transform& transform, const glm::vec3& newScale) {
|
||||||
|
transform.scale = newScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Translate(Transform& transform, const glm::vec3& translationDelta) {
|
||||||
|
transform.translation += translationDelta;
|
||||||
|
}
|
||||||
|
void Rotate(Transform& transform, const glm::vec3& rotationDelta) {
|
||||||
|
transform.rotation += rotationDelta;
|
||||||
|
}
|
||||||
|
void Scale(Transform& transform, const glm::vec3& scaleDelta) {
|
||||||
|
transform.scale *= scaleDelta;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue