PyOpenGL实现圆沿X轴逆时针旋转30度再沿Z轴平移20单位求助
修正方案
原代码存在的问题
- 正交投影的Z轴可视范围仅设置为0.0~1.0,沿Z轴正向平移20单位后图形直接超出可视范围,无法显示
- 模型视图矩阵加载单位矩阵后未添加旋转、平移的变换逻辑,图形自然不会产生预期变换效果
- 未处理旋转中心对齐问题,默认绕全局X轴旋转会导致圆偏移到预期外的位置
- 颜色参数设置错误,
glColor3f的分量取值范围是0~1,原代码第三个参数写3.0会溢出,颜色显示异常
修正后完整代码
from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * from math import * def circle(): posx, posy = 40,40 sides = 80 radius = 20 glBegin(GL_POLYGON) for i in range(sides): cosine= radius * cos(i*2*pi/sides) + posx sine = radius * sin(i*2*pi/sides) + posy glVertex2f(cosine,sine) glEnd() def iterate(): glViewport(0, 0, 400, 400) # 修正视口大小和窗口大小匹配,原3000无必要 glMatrixMode(GL_PROJECTION) glLoadIdentity() # 调整Z轴可视范围为-100~100,覆盖平移后的Z坐标 glOrtho(0.0, 500, 0.0, 500, -100.0, 100.0) glMatrixMode (GL_MODELVIEW) glLoadIdentity() def showScreen(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) iterate() glColor3f(1.0, 0.0, 1.0) # 修正颜色参数溢出问题 # OpenGL矩阵变换为右乘逻辑,执行顺序和代码编写顺序相反 glTranslatef(40, 40, 20) # 第三步:将旋转后的圆移回原中心位置,同时完成Z轴正向平移20 glRotatef(30, 1, 0, 0) # 第二步:绕X轴逆时针旋转30度 glTranslatef(-40, -40, 0) # 第一步:先将圆的中心移到坐标原点,保证旋转绕自身中心进行 circle() glutSwapBuffers() glutInit() glutInitDisplayMode(GLUT_RGBA) glutInitWindowSize(400, 400) glutInitWindowPosition(200, 200) wind = glutCreateWindow("OpenGL Coding Practice") glutDisplayFunc(showScreen) glutIdleFunc(showScreen) glutMainLoop()
关键修改说明
- 调整正交投影的Z轴范围到-100~100,确保Z轴平移20后图形仍在可视区域内
- 按正确顺序添加了变换逻辑,先把圆移到原点再旋转,再移回原位置并做Z轴平移,保证旋转是绕圆自身中心进行的
- 修正了视口大小和颜色参数的错误,避免无意义的性能损耗和颜色显示异常
内容的提问来源于stack exchange,提问作者XGB
相关产品推荐
相关产品推荐

