我正在尝试通过编写一些东西来学习 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 时,它看起来像这样:
当角度为 90 时,它看起来像这样:
我的目标是围绕相机旋转直升机,始终显示同一侧。 感谢您的帮助。
最佳答案
如果你想原地旋转一个对象,那么你必须在平移之前点旋转:
model = translate * rotate;
如果你想围绕一个点旋转,那么你必须平移对象(通过旋转半径)然后旋转平移的对象:
model = rotate * translate
注意,像rotate
这样的操作, scale
和 translate
, 定义一个新矩阵并将输入矩阵乘以新矩阵。
所以在你的情况下,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/