Almost figured out roll
This commit is contained in:
parent
d75f449538
commit
bcb8f8f4ea
33
Camera.cpp
33
Camera.cpp
@ -14,13 +14,17 @@ Camera::Camera(const Vec3& pos, const Vec3& tar, const Vec3& up) : _camera_type(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Camera::_calcLook() {
|
void Camera::_calcLook() {
|
||||||
_look = glm::lookAt(_pos, _tar, _world_up);
|
_look = glm::lookAt(_pos, _tar, _up);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 Camera::normCross(const Vec3& a, const Vec3& b) {
|
glm::vec3 Camera::normCross(const Vec3& a, const Vec3& b) {
|
||||||
return glm::normalize(glm::cross(a, b));
|
return glm::normalize(glm::cross(a, b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glm::vec3 Camera::transformVec(const Mat4& mat, const Vec3& vec) {
|
||||||
|
return Vec3(mat * glm::vec4(vec, 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
glm::vec3 Camera::getPos() const { return _pos; }
|
glm::vec3 Camera::getPos() const { return _pos; }
|
||||||
|
|
||||||
glm::vec3 Camera::getTarget() const { return _tar; }
|
glm::vec3 Camera::getTarget() const { return _tar; }
|
||||||
@ -51,7 +55,7 @@ void Camera::setPos(const Vec3& pos) {
|
|||||||
void Camera::setTarget(const Vec3& tar) {
|
void Camera::setTarget(const Vec3& tar) {
|
||||||
_tar = tar;
|
_tar = tar;
|
||||||
_dir = glm::normalize(_tar-_pos);
|
_dir = glm::normalize(_tar-_pos);
|
||||||
_right = normCross(_dir, _world_up);
|
_right = normCross(_dir, ((LockUp)?_world_up:_up));
|
||||||
_up = normCross(_right, _dir);
|
_up = normCross(_right, _dir);
|
||||||
_calcLook();
|
_calcLook();
|
||||||
}
|
}
|
||||||
@ -67,11 +71,15 @@ void Camera::setWorldUp(const Vec3& up) {
|
|||||||
_calcLook();
|
_calcLook();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Camera::resetUp() {
|
||||||
|
_up = _world_up;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void Camera::addPos(const Vec3& add) {
|
void Camera::addPos(const Vec3& add) {
|
||||||
_pos += add;
|
_pos += add;
|
||||||
_dir = glm::normalize(_tar-_pos);
|
_dir = glm::normalize(_tar-_pos);
|
||||||
_right = normCross(_dir, _world_up);
|
_right = normCross(_dir, ((LockUp)?_world_up:_up));
|
||||||
_up = normCross(_right, _dir);
|
|
||||||
_calcLook();
|
_calcLook();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,26 +95,33 @@ void Camera::panPosRelative(const Vec3& add) {
|
|||||||
void Camera::addTarget(const Vec3& add) {
|
void Camera::addTarget(const Vec3& add) {
|
||||||
_tar += add;
|
_tar += add;
|
||||||
_dir = glm::normalize(_tar-_pos);
|
_dir = glm::normalize(_tar-_pos);
|
||||||
_right = normCross(_dir, _world_up);
|
_right = normCross(_dir, (LockUp) ? _world_up : _up);
|
||||||
_up = normCross(_right, _dir);
|
_up = normCross(_right, _dir);
|
||||||
_calcLook();
|
_calcLook();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::roll(float ang) {
|
void Camera::roll(float ang) {
|
||||||
|
if (LockUp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Mat4 rot_mat = glm::rotate(Mat4(1.0f), ang, _dir);
|
||||||
|
_right = transformVec(rot_mat, _right);
|
||||||
|
_up = normCross(_right, _dir);
|
||||||
|
_calcLook();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::pitch(float ang) {
|
void Camera::pitch(float ang) {
|
||||||
Mat4 rot_mat = glm::rotate(Mat4(1.0f), ang, _right);
|
Mat4 rot_mat = glm::rotate(Mat4(1.0f), ang, _right);
|
||||||
_dir = Vec3(rot_mat * glm::vec4(_dir, 1.0f));
|
_dir = transformVec(rot_mat, _dir);
|
||||||
|
_up = normCross(_right, _dir);
|
||||||
_tar = _pos + _dir;
|
_tar = _pos + _dir;
|
||||||
_calcLook();
|
_calcLook();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::yaw(float ang) {
|
void Camera::yaw(float ang) {
|
||||||
Mat4 rot_mat = glm::rotate(Mat4(1.0f), ang, _up);
|
Mat4 rot_mat = glm::rotate(Mat4(1.0f), ang, _up);
|
||||||
_dir = Vec3(rot_mat * glm::vec4(_dir, 1.0f));
|
_dir = transformVec(rot_mat, _dir);
|
||||||
_right = Vec3(rot_mat * glm::vec4(_right, 1.0f));
|
_right = normCross(_dir, _right);
|
||||||
_tar = _pos + _dir;
|
_tar = _pos + _dir;
|
||||||
_calcLook();
|
_calcLook();
|
||||||
}
|
}
|
||||||
|
|||||||
15
funcs.cpp
15
funcs.cpp
@ -20,6 +20,12 @@ void processInput(GLFWwindow* window) {
|
|||||||
if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) {
|
if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) {
|
||||||
cam->pitch(-1.0f*deltaTime);
|
cam->pitch(-1.0f*deltaTime);
|
||||||
}
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_PERIOD) == GLFW_PRESS) {
|
||||||
|
cam->roll(1.0f*deltaTime);
|
||||||
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_COMMA) == GLFW_PRESS) {
|
||||||
|
cam->roll(-1.0f*deltaTime);
|
||||||
|
}
|
||||||
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
|
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
|
||||||
cam->panPosRelative(glm::vec3(-1.5f, 0.0f, 0.0f)*deltaTime);
|
cam->panPosRelative(glm::vec3(-1.5f, 0.0f, 0.0f)*deltaTime);
|
||||||
}
|
}
|
||||||
@ -41,6 +47,13 @@ void processInput(GLFWwindow* window) {
|
|||||||
if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) {
|
if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) {
|
||||||
cam->setPos(glm::vec3(0.0f, 0.0f, -2.0f));
|
cam->setPos(glm::vec3(0.0f, 0.0f, -2.0f));
|
||||||
cam->setTarget(glm::vec3(0.0f, 0.0f, 0.0f));
|
cam->setTarget(glm::vec3(0.0f, 0.0f, 0.0f));
|
||||||
cam->setWorldUp(glm::vec3(0.0f, 1.0f, 0.0f));
|
cam->resetUp();
|
||||||
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_L) == GLFW_PRESS) {
|
||||||
|
cam->LockUp=true;
|
||||||
|
cam->resetUp();
|
||||||
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_O) == GLFW_PRESS) {
|
||||||
|
cam->LockUp=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -22,6 +22,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
static Vec3 normCross(const Vec3&, const Vec3&);
|
static Vec3 normCross(const Vec3&, const Vec3&);
|
||||||
|
static Vec3 transformVec(const Mat4&, const Vec3&);
|
||||||
|
|
||||||
Camera(
|
Camera(
|
||||||
const Vec3& pos=Vec3(1.0f, 0.0f, 0.0f),
|
const Vec3& pos=Vec3(1.0f, 0.0f, 0.0f),
|
||||||
@ -29,6 +30,8 @@ public:
|
|||||||
const Vec3& up =Vec3(0.0f, 1.0f, 0.0f)
|
const Vec3& up =Vec3(0.0f, 1.0f, 0.0f)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
bool LockUp = true;
|
||||||
|
|
||||||
Vec3 getPos() const;
|
Vec3 getPos() const;
|
||||||
Vec3 getTarget() const;
|
Vec3 getTarget() const;
|
||||||
Vec3 getDirection() const;
|
Vec3 getDirection() const;
|
||||||
@ -44,6 +47,7 @@ public:
|
|||||||
void setTarget(const Vec3&);
|
void setTarget(const Vec3&);
|
||||||
void setDirection(const Vec3&);
|
void setDirection(const Vec3&);
|
||||||
void setWorldUp(const Vec3&);
|
void setWorldUp(const Vec3&);
|
||||||
|
void resetUp();
|
||||||
void addPos(const Vec3&);
|
void addPos(const Vec3&);
|
||||||
void panPos(const Vec3&);
|
void panPos(const Vec3&);
|
||||||
void panPosRelative(const Vec3&);
|
void panPosRelative(const Vec3&);
|
||||||
|
|||||||
8
main.cpp
8
main.cpp
@ -66,6 +66,14 @@ int main() {
|
|||||||
NB_GL_DEBUG_THROW("nothing", "during");
|
NB_GL_DEBUG_THROW("nothing", "during");
|
||||||
// Input checking
|
// Input checking
|
||||||
processInput(window);
|
processInput(window);
|
||||||
|
|
||||||
|
std::cout << "xy: " << glm::dot(myCam.getRight(), myCam.getDirection());
|
||||||
|
std::cout << "\n\tyz : " << glm::dot(myCam.getDirection(), myCam.getUp());
|
||||||
|
std::cout << "\n\tzx : " << glm::dot(myCam.getUp(), myCam.getRight());
|
||||||
|
std::cout << "\n\tdir : " << glm::length(myCam.getDirection());
|
||||||
|
std::cout << "\n\tright: " << glm::length(myCam.getRight());
|
||||||
|
std::cout << "\n\tup : " << glm::length(myCam.getUp());
|
||||||
|
std::cout << "\n\n";
|
||||||
|
|
||||||
// Rendering Loop
|
// Rendering Loop
|
||||||
myShader.use();
|
myShader.use();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user