gpt4 book ai didi

c++ - OpenGL 在应该围绕本地原点时围绕世界原点旋转

转载 作者:太空狗 更新时间:2023-10-29 20:32:28 24 4
gpt4 key购买 nike

我正在 OpenGL 中实现一个简单的相机系统。我在投影矩阵下设置 gluPerspective,然后在 ModelView 矩阵上使用 gluLookAt。在此之后,我有我的主渲染循环,它检查键盘事件,如果按下任何箭头键,修改角速度和前进速度(我只通过 y 轴旋转并通过 z(向前)移动)。然后我使用以下代码移动 View (deltaTime 是自上一帧渲染以来的时间量,以秒为单位,以便将移动与帧速率分离):

//place our camera  
newTime = RunTime(); //get the time since app start
deltaTime = newTime - time; //get the time since the last frame was rendered
time = newTime;
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate
glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards
//draw our vertices
draw();
//swap buffers
Swap_Buffers();

然后代码再次循环。我的绘制算法以 glPushMatrix() 开头并以 glPopMatrix() 结尾.

每次调用 glRotatef() 和 glTranslatef() 都会以 View 方向的前进速度向前插入 View 。

然而,当我运行代码时,我的对象被绘制在正确的位置,但是当我移动时,移动是按照世界原点的方向(0,0,0 - 面向 Z 轴)完成的,而不是局部方向(我指向的位置),当我旋转时,旋转是围绕 (0,0,0) 而不是相机的位置完成的。

我的相机围绕 (0,0,0) 旋转,而不是原地旋转,最终产生了这种奇怪的效果。

我不叫glLoadIdentity()在循环内的任何地方,我确定矩阵模式设置为 GL_MODELVIEW对于整个循环。

另一个奇怪的效果是如果我把 glLoadIdentity()draw(里面打电话) 函数(在 PushMatrix 和 PopMatrix 调用之间,屏幕变黑,无论我看哪里都找不到我绘制的对象。

有谁知道我为了使这个轨道 (0,0,0) 而不是原地旋转而搞砸了什么?

最佳答案

glRotate() 围绕世界原点旋转 ModelView 矩阵,因此要围绕某个任意点旋转,您需要平移矩阵以使该点位于原点,旋转然后平移回你从哪里开始的。

我想你需要的是这个

float x, y, z;//point you want to rotate around

glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards

glTranslatef(x,y,z); //translate to origin
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate
glTranslatef(-x,-y,-z); //translate back
//draw our vertices
draw();
//swap buffers
Swap_Buffers();

关于c++ - OpenGL 在应该围绕本地原点时围绕世界原点旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1977737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com