[英]Cannot move view matrix and direction view matrix is pointing in simultaneously
當我在場景中移動時(不移動我的“頭”,這是我的視圖矩陣指向的地方),一切正常。 當我一動不動地環顧四周時,一切正常。 但是當我將兩者結合起來時,我的頭腦(視圖矩陣)開始變得瘋狂。 我假設問題出在我的數學/邏輯中,但我無法弄清楚。
這是我的代碼(當然是簡化的):
#define MOVE_DISTANCE 0.15f
#define LOOK_SENSITIVITY 0.01f
static GLFWwindow* window;
static glm::mat4 viewMatrix;
static glm::vec3 look_at;
static void mouseCallback(GLFWwindow* window, double x, double y){
static double prev_x = 0;
static double prev_y = 0;
static float pitch = 0, yaw = 0;
pitch += (y-prev_y) * LOOK_SENSITIVITY;
yaw += (x-prev_x) * LOOK_SENSITIVITY;
if(pitch > 89){
pitch = 89;
}
if(pitch < -89){
pitch = -89;
}
look_at = glm::vec3(cos(yaw)*cos(pitch), sin(pitch), sin(yaw)*cos(pitch) - 1.0f);
prev_x = x;
prev_y = y;
}
int main(){
window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL); //I left the rest of the initialization out
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
glfwSetCursorPosCallback(window, mouseCallback);
look_at = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 position(0.0f, 0.0f, 0.0f);
glm::mat4 projectionMatrix = glm::perspective(45.0f, (float) 800/600, 0.1f, 100.0f); //fov, screen aspect ratio, near render distance, far render distance (z axis)
glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.0f));
viewMatrix = glm::lookAt(position, look_at, glm::vec3(0, 1, 0));
while(!glfwWindowShouldClose(window)){
if(glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS){
position.z -= MOVE_DISTANCE;
look_at.z -= MOVE_DISTANCE;
}
if(glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
position.z += MOVE_DISTANCE;
look_at.z += MOVE_DISTANCE;
}
if(glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS){
position.x += MOVE_DISTANCE;
look_at.x += MOVE_DISTANCE;
}
if(glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS){
position.x -= MOVE_DISTANCE;
look_at.x -= MOVE_DISTANCE;
}
if(glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS){ //FLy up
position.y += MOVE_DISTANCE;
look_at.y += MOVE_DISTANCE;
}
if(glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS){ //Fly down
position.y -= MOVE_DISTANCE;
look_at.y -= MOVE_DISTANCE;
}
viewMatrix = glm::lookAt(position, look_at+position, glm::vec3(0, 1, 0));
glClear(GL_COLOR_BUFFER_BIT);
glDrawElements(GL_TRIANGLES, NUM_OF_INDICES, GL_UNSIGNED_BYTE, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
}
每當我在移動鼠標的同時四處移動時,事情就會失控,我的頭(我的視圖矩陣指向的方向)開始四處晃動。 我知道這項運動不受我所關注的方向的影響。我計划在未來的某個時候實施。
有人可以幫我解決我的錯誤嗎?
您的問題是,無論您在哪里看,按W
總是會從您的世界空間position.z
坐標中減去MOVE_DISTANCE
,即使“向前”或“向后”移動不一定意味着“沿着世界的 Z 軸移動”。
因此,您必須確定“向前”(為了向前和向后移動)以及“向右”(或“向左”)和“向上”或“向下”的軸。 當您希望 SPACE 和 CTRL 始終沿世界的 Y 軸向上/向下移動時,后者可能不是必需的。
對於其他兩個軸,當您有任意視圖矩陣m
(例如通過glm::lookAt
構建的矩陣)時,您可以輕松地從中提取right
、 up
和forward
向量,如下所示:
#include <glm/gtc/matrix_access.hpp>
...
glm::vec4 right(glm::row(m, 0));
glm::vec4 up(glm::row(m, 1));
glm::vec4 forward(-glm::row(m, 2));
就像上面評論中的@3Dave 一樣,您已經知道“前向”在哪里,因為您正在自己操作該向量並從中計算外觀轉換,因此您可以省略它。
現在,當您想向左/向右移動時,您在世界空間position
中減去/ right
移動,其他軸也是如此。
另一件不正確的事情是,當您使用鍵盤鍵移動時,您還會從look_at
方向添加/減去。 這是錯誤的,因為您的look_at
向量是一個方向,並且在為glm::lookAt
調用計算 arguments 時已經將其用作方向向量。
將所有這些合並到您的代碼中(以及一些輕微的重構),將導致以下 while 循環:
while (!glfwWindowShouldClose(window)) {
glm::vec3 right(glm::row(viewMatrix, 0)),
up(glm::row(viewMatrix, 1)),
forward(-glm::row(viewMatrix, 2));
glm::vec3 v(0, 0, 0);
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
v += forward;
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
v -= forward;
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
v += right;
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
v -= right;
position += v * MOVE_DISTANCE;
viewMatrix = glm::lookAt(position, position + look_at, glm::vec3(0, 1, 0));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.