c++ - OpenGL 中的旋转每次都有不同的效果

标签 c++ opengl matrix glm-math

我正在尝试通过编写一些东西来学习 OpenGL,但我仍然无法理解旋转的概念。

这是我的代码:

glm::mat4 projection1 = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
glm::mat4 view1 =camera.GetViewMatrix();////    //
ourShader.setMat4("projection", projection1);
ourShader.setMat4("view", view1);
ourShader.setInt ("pass1",1);           
glm::mat4 model1 = glm::mat4(1.0f);
vangle+=0.1;
float cvangle = (vangle-90)*PI /180;
model1=glm::translate (model1 ,glm::vec3(cos(cvangle )*50,0,sin(cvangle )*50));
model1 = glm::scale(model1, glm::vec3(1,1, 1));             
model1 = glm::rotate(model1,3.0f , glm::vec3(1, 0, 0));
model1 = glm::rotate(model1,2.0f, glm::vec3(0, 1, 0)); 
ourShader.setMat4("model", model1);
ourModel.Draw(ourShader);

直升机应该围绕相机旋转,但我的问题是旋转在每个角度都有不同的效果,即在角度 0 时,它看起来像这样:

angle 0

当角度为 90 时,它看起来像这样:

angle 90

我的目标是围绕相机旋转直升机,始终显示同一侧。 感谢您的帮助。

最佳答案

如果你想原地旋转一个对象,那么你必须在平移之前点旋转:

model = translate * rotate;

如果你想围绕一个点旋转,那么你必须平移对象(通过旋转半径)然后旋转平移的对象:

model = rotate * translate

注意,像rotate这样的操作, scaletranslate , 定义一个新矩阵并将输入矩阵乘以新矩阵。

所以在你的情况下,translate 必须在绕 z 轴旋转(rotate)之后完成:

vangle+=0.1;

glm::mat4 model1 = glm::mat4(1.0f);

model1 = glm::rotate(model1, glm::radians(vangle), glm::vec3(0, 0, 1)); 
model1 = glm::translate(model1, glm::vec3(50.0f, 0.0f, 0.0f);

model1 = glm::scale(model1, glm::vec3(1, 1, 1));

关于c++ - OpenGL 中的旋转每次都有不同的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58332693/

相关文章:

algorithm - m * n 矩阵的相等性

c++ - 从 vector 中删除元素并将该元素添加到新的 vector c++

c++ - Open-CV - 加载不正确

c++ - 从 Vis C++ 控制台应用程序打开 OpenDialog?

c++ - 简单的银行账户程序无法编译

opengl - 具有纹理对象和采样器的多重纹理理论

java - 显示更多世界数据而不是在窗口调整大小时缩放的正交投影

python - 颜色未按预期应用 glDrawArrays (Pyglet)

r - 使用强制矩阵中的数据更新矩阵

algorithm - 在二进制矩阵中找到最大的 X 形状