在 OpenGL4 中旋转相机的问题
Problems rotating camera in OpenGL4
我是一个使用带有 glm 库的现代 OpenGL 的初学者,我尝试创建带有相机移动的键盘移动(WSAD 用于向前向左向右)和 Q & E(顺时针和逆时针)。
当我尝试在 Y 轴上进行完整旋转时,它似乎进行了半次旋转,然后跳回到开头(想像一个 180 度弧)。虽然旋转有问题,但前进方向也有问题,它会改变,而不是直接向前移动,当我们改变旋转时,向前移动会向左或向右偏移。
glm::vec3 eyepos = glm::vec3(-0.6f, -0.4f, 31.1f);
glm::vec3 frontvector = glm::vec3(0.0f, 0.0f, -1.0f);//looking pointing vector
glm::vec3 lookvector = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 flatupvec = glm::vec3(0.0f, 1.0f, 0.0f);
glm::vec3 upvec = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 viewmatrix;
glm::mat4 projectionmatrix;//camera lens, projection matrix, need an aspect ratio function here /3D FOV
GLfloat movespeed = 0.1f;
GLfloat turnspeed = 1.0f;
//********************MOVEMENT_TRANSFORMS***********************************
if (kb.w == true) { eyepos += frontvector * movespeed; } //move up
if (kb.s == true) { eyepos -= frontvector * movespeed; } //move down
if (kb.q == true) { glm::quat q = glm::angleAxis(glm::radians(turnspeed),
glm::vec3(0, 1, 0)); frontvector = (frontvector * q); }//turn left (yaw)
if (kb.e == true) { glm::quat q = glm::angleAxis(glm::radians(-turnspeed),
glm::vec3(0, 1, 0)); frontvector = (frontvector * q); }//turn right (yaw)
if (kb.a == true) { eyepos -= glm::normalize(glm::cross(frontvector, flatupvec)) * movespeed; } //strafe left
if (kb.d == true) { eyepos += glm::normalize(glm::cross(frontvector, flatupvec)) * movespeed; } //strafe right
if (kb.r == true) { eyepos += flatupvec * movespeed; } //move up
if (kb.f == true) { eyepos -= flatupvec * movespeed; } //move down
//********************ROTATIONS_EYEPOINT************************************
if (kb.t == true) { glm::quat q = glm::angleAxis(turnspeed, glm::vec3(1, 0, 0)); lookvector = q * lookvector; } //pitch up
if (kb.g == true) { glm::quat q = glm::angleAxis(-turnspeed, glm::vec3(1, 0, 0)); lookvector = q * lookvector; }//pitch down
if (kb.z == true) { glm::quat q = glm::angleAxis(-turnspeed, glm::vec3(0, 0, 1)); upvec = q * upvec; } //roll left
if (kb.x == true) { glm::quat q = glm::angleAxis(turnspeed, glm::vec3(0, 0, 1)); upvec = q * upvec; } //roll right
if (kb.c == true) { glm::quat q = glm::angleAxis(turnspeed, glm::vec3(0, 1, 0)); lookvector = q * lookvector; } //yaw left
if (kb.v == true) { glm::quat q = glm::angleAxis(-turnspeed, glm::vec3(0, 1, 0)); lookvector = q * lookvector; }//yaw right
viewmatrix = glm::lookAt( eyepos, eyepos + frontvector + lookvector, upvec);
projectionmatrix = glm::perspective(45.0f, 1.8f, 0.0001f, 500.0f);
问题出在你的外观向量上。
你的函数通过说你在说 (10,0,10) 并且你正在看 ((10,0,10)+(0,0,-1)+(0,0,-1)) 等于(10,0,8) 或直行。所以假设你看起来正确 ((10,0,10)+(0.9,0,-0.1)+(0,0,-1)) 等于 (10.9,0,8.9) 并且一切大致都还不错。但是假设你几乎把它转到最大值 ((10,0,10)+(0.1,0,0.9)+(0,0,-1)) 等于 (10.1,0,9.9),比较 (10.1,0 ,9.9) 和 (10,0,8) 到 (10,0,10) 仍然是相同的向量(可以解释 180 度弧)和 (10,0,10) 眼点和 (10,0,10) lookat 将是模棱两可的,因此您的问题是 "viewmatrix = glm::lookAt( eyepos, eyepos + frontvector + lookvector, upvec);" 调用以及同时包含 frontvector 和 lookvector 以及程序,您可能希望删除该调用的 frontvector 部分,但不错代码 ;)
我是一个使用带有 glm 库的现代 OpenGL 的初学者,我尝试创建带有相机移动的键盘移动(WSAD 用于向前向左向右)和 Q & E(顺时针和逆时针)。
当我尝试在 Y 轴上进行完整旋转时,它似乎进行了半次旋转,然后跳回到开头(想像一个 180 度弧)。虽然旋转有问题,但前进方向也有问题,它会改变,而不是直接向前移动,当我们改变旋转时,向前移动会向左或向右偏移。
glm::vec3 eyepos = glm::vec3(-0.6f, -0.4f, 31.1f);
glm::vec3 frontvector = glm::vec3(0.0f, 0.0f, -1.0f);//looking pointing vector
glm::vec3 lookvector = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 flatupvec = glm::vec3(0.0f, 1.0f, 0.0f);
glm::vec3 upvec = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 viewmatrix;
glm::mat4 projectionmatrix;//camera lens, projection matrix, need an aspect ratio function here /3D FOV
GLfloat movespeed = 0.1f;
GLfloat turnspeed = 1.0f;
//********************MOVEMENT_TRANSFORMS***********************************
if (kb.w == true) { eyepos += frontvector * movespeed; } //move up
if (kb.s == true) { eyepos -= frontvector * movespeed; } //move down
if (kb.q == true) { glm::quat q = glm::angleAxis(glm::radians(turnspeed),
glm::vec3(0, 1, 0)); frontvector = (frontvector * q); }//turn left (yaw)
if (kb.e == true) { glm::quat q = glm::angleAxis(glm::radians(-turnspeed),
glm::vec3(0, 1, 0)); frontvector = (frontvector * q); }//turn right (yaw)
if (kb.a == true) { eyepos -= glm::normalize(glm::cross(frontvector, flatupvec)) * movespeed; } //strafe left
if (kb.d == true) { eyepos += glm::normalize(glm::cross(frontvector, flatupvec)) * movespeed; } //strafe right
if (kb.r == true) { eyepos += flatupvec * movespeed; } //move up
if (kb.f == true) { eyepos -= flatupvec * movespeed; } //move down
//********************ROTATIONS_EYEPOINT************************************
if (kb.t == true) { glm::quat q = glm::angleAxis(turnspeed, glm::vec3(1, 0, 0)); lookvector = q * lookvector; } //pitch up
if (kb.g == true) { glm::quat q = glm::angleAxis(-turnspeed, glm::vec3(1, 0, 0)); lookvector = q * lookvector; }//pitch down
if (kb.z == true) { glm::quat q = glm::angleAxis(-turnspeed, glm::vec3(0, 0, 1)); upvec = q * upvec; } //roll left
if (kb.x == true) { glm::quat q = glm::angleAxis(turnspeed, glm::vec3(0, 0, 1)); upvec = q * upvec; } //roll right
if (kb.c == true) { glm::quat q = glm::angleAxis(turnspeed, glm::vec3(0, 1, 0)); lookvector = q * lookvector; } //yaw left
if (kb.v == true) { glm::quat q = glm::angleAxis(-turnspeed, glm::vec3(0, 1, 0)); lookvector = q * lookvector; }//yaw right
viewmatrix = glm::lookAt( eyepos, eyepos + frontvector + lookvector, upvec);
projectionmatrix = glm::perspective(45.0f, 1.8f, 0.0001f, 500.0f);
问题出在你的外观向量上。 你的函数通过说你在说 (10,0,10) 并且你正在看 ((10,0,10)+(0,0,-1)+(0,0,-1)) 等于(10,0,8) 或直行。所以假设你看起来正确 ((10,0,10)+(0.9,0,-0.1)+(0,0,-1)) 等于 (10.9,0,8.9) 并且一切大致都还不错。但是假设你几乎把它转到最大值 ((10,0,10)+(0.1,0,0.9)+(0,0,-1)) 等于 (10.1,0,9.9),比较 (10.1,0 ,9.9) 和 (10,0,8) 到 (10,0,10) 仍然是相同的向量(可以解释 180 度弧)和 (10,0,10) 眼点和 (10,0,10) lookat 将是模棱两可的,因此您的问题是 "viewmatrix = glm::lookAt( eyepos, eyepos + frontvector + lookvector, upvec);" 调用以及同时包含 frontvector 和 lookvector 以及程序,您可能希望删除该调用的 frontvector 部分,但不错代码 ;)