From f5f224727419cdd2f2330589ec768e05de69bebc Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Tue, 13 Dec 2022 13:52:15 +0800 Subject: [PATCH] Update Camera class - remove roll - add constructor (position, yaw, pitch) - add API setPosition(pos) - set default zoom to 90 --- FinalProject/camera.cpp | 31 +++++++++++++++++++++++++++++-- FinalProject/camera.h | 24 ++++++++++-------------- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/FinalProject/camera.cpp b/FinalProject/camera.cpp index e834b51..9c0e83f 100644 --- a/FinalProject/camera.cpp +++ b/FinalProject/camera.cpp @@ -8,15 +8,42 @@ Camera::Camera() : Camera(defaultOrigin(), defaultTarget()) {} Camera::Camera(glm::vec3 position, glm::vec3 target) : _position(position) { - updateCameraState(); + glm::vec3 direction = glm::normalize(target - position); + glm::vec3 right = glm::normalize(glm::cross(direction, _worldUp)); + glm::vec3 up = glm::normalize(glm::cross(right, direction)); + _right = right; + _front = direction; + _up = up; + + _yaw = glm::degrees(glm::atan(direction.z, direction.x)); + _pitch = glm::degrees(glm::asin(direction.y)); } Camera::Camera(glm::vec3 position, glm::vec3 direction, glm::vec3 right, glm::vec3 up) : _position(position), _front(direction), _right(right), _up(up) +{ + _yaw = glm::degrees(glm::atan(direction.z, direction.x)); + _pitch = glm::degrees(glm::asin(direction.y)); +} + +Camera::Camera(glm::vec3 position, float yaw, float pitch) : + _position(position), _yaw(yaw), _pitch(pitch) { updateCameraState(); } void Camera::updateCameraState() { - // TODO: Implement vector update with roll pitch, and *roll* + + // Update front vector + glm::vec3 front; + front.x = cos(glm::radians(_yaw)) * cos(glm::radians(_pitch)); + front.y = sin(glm::radians(_pitch)); + front.z = sin(glm::radians(_yaw)) * cos(glm::radians(_pitch)); + _front = glm::normalize(front); + + // Update right vector + _right = glm::normalize(glm::cross(_front, _worldUp)); + + // Update up vector + _up = glm::normalize(glm::cross(_right, _front)); } \ No newline at end of file diff --git a/FinalProject/camera.h b/FinalProject/camera.h index 022895b..9ee0f87 100644 --- a/FinalProject/camera.h +++ b/FinalProject/camera.h @@ -1,6 +1,7 @@ #pragma once #include +#include class Camera { public: @@ -15,8 +16,7 @@ private: glm::vec3 _up; float _yaw = 0.0f; float _pitch = 0.0f; - float _roll = 0.0f; - float _zoom = 1.0f; + float _zoom = 90.0f; private: // Camera settings @@ -30,18 +30,19 @@ public: Camera(); Camera(glm::vec3 position, glm::vec3 target); Camera(glm::vec3 position, glm::vec3 direction, glm::vec3 right, glm::vec3 up); + Camera(glm::vec3 position, float yaw, float pitch); public: + inline float zoom() const { return _zoom; } inline glm::mat4 viewMatrix(); public: inline void move(glm::vec3 direction, float step); + inline void setPosition(glm::vec3 position); inline void pitch(float deltaAngle); inline void setPitch(float angle); inline void yaw(float deltaAngle); inline void setYaw(float angle); - inline void roll(float deltaAngle); - inline void setRoll(float angle); private: void updateCameraState(); @@ -56,6 +57,11 @@ inline void Camera::move(glm::vec3 direction, float step) { updateCameraState(); } +inline void Camera::setPosition(glm::vec3 position) { + _position = position; + updateCameraState(); +} + inline void Camera::pitch(float deltaAngle) { _pitch += deltaAngle; updateCameraState(); @@ -75,13 +81,3 @@ inline void Camera::setYaw(float angle) { _yaw = angle; updateCameraState(); } - -inline void Camera::roll(float deltaAngle) { - _roll += deltaAngle; - updateCameraState(); -} - -inline void Camera::setRoll(float angle) { - _roll = angle; - updateCameraState(); -}