PyCharm+Pygame环境下Python OpenGL的glRotatef旋转角度不符合预期的问题求助
PyCharm+Pygame环境下Python OpenGL的glRotatef旋转角度不符合预期的问题求助
嘿,我看了你的问题,应该是几个细节没处理好导致的,之前我也遇到过类似的OpenGL坐标和角度的坑,给你梳理下问题点和修复方法:
1. 顶点坐标使用错误,导致物体位置偏移
你在draw方法里已经用glTranslate(self.xPos, self.yPos, self.zPos)把坐标系原点移到了物体的位置,这时候绘制顶点应该用局部相对坐标,而不是再叠加物体的绝对坐标。原来的写法相当于把物体平移了两次,视觉上的旋转效果自然会错乱。
修改后的draw方法:
def draw(self): OpenGL.GL.glPushMatrix() OpenGL.GL.glTranslate(self.xPos, self.yPos, self.zPos) OpenGL.GL.glRotatef(self.remindturn, 0, 1, 0) OpenGL.GL.glColor3f(1,0,0) OpenGL.GL.glBegin(OpenGL.GL.GL_TRIANGLES) # 改成局部相对坐标,不再叠加物体绝对位置 OpenGL.GL.glVertex3f(-100, 50, 0) OpenGL.GL.glVertex3f(100, 50, 0) OpenGL.GL.glVertex3f(0, -50, 0) OpenGL.GL.glEnd() OpenGL.GL.glPopMatrix()
2. 三角函数的弧度/角度不匹配,导致相机位置计算错误
Python的math.sin和math.cos函数接收的是弧度值,但你的mouseturnX是基于鼠标位置计算的类似角度的数值(比如鼠标移到最右侧时是25,相当于25度),直接传入三角函数会导致相机位置计算完全错误,进而看起来物体没有正确面向相机。
修改后的camera方法:
def camera(self): # 将角度值转换为弧度后再传入三角函数 rad_turn = math.radians(self.mouseturnX) self.xCam = math.sin(rad_turn) * self.camdist + self.xPos self.yCam = self.yPos + self.mouseturnY self.zCam = math.cos(rad_turn) * self.camdist + self.zPos OpenGL.GL.glViewport(0,0, 500, 500) OpenGL.GL.glMatrixMode(OpenGL.GL.GL_PROJECTION) OpenGL.GL.glLoadIdentity() OpenGL.GLU.gluPerspective(60, (500/500), 0.1, 10000.0) OpenGL.GL.glMatrixMode(OpenGL.GL.GL_MODELVIEW) OpenGL.GL.glLoadIdentity() OpenGL.GLU.gluLookAt(self.xCam, self.yCam, self.zCam, self.xPos, self.yPos, self.zPos, 0, 1, 0)
而glRotatef的第一个参数本身就是角度值,所以你原来的glRotatef(self.remindturn, 0,1,0)是正确的,不需要转换。
3. 旋转方向可能需要调整
如果上面的修改后还是有问题,大概率是旋转方向和相机环绕方向相反,可以尝试把旋转角度取反:
OpenGL.GL.glRotatef(-self.remindturn, 0, 1, 0)
因为相机是绕物体做环绕运动,物体要面向相机的话,旋转方向应该和相机的环绕方向相反才能对齐。
你可以先试试前两个修改,应该就能解决大部分问题了,之前我在做类似的第三人称视角物体朝向时,就是踩了弧度/角度转换的坑,调整后就正常了。
备注:内容来源于stack exchange,提问作者programming_noob
相关产品推荐
相关产品推荐

