You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:45:01