如何在PyOpenGL中旋转2D线?

3

我写了一段绘制直线的代码。以下是函数:

def drawLines():
    r,g,b = 255,30,20
    #drawing visible axis
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3ub(r,g,b)
    glBegin(GL_LINES)
    #glRotate(10,500,-500,0)
    glVertex2f(0,500)
    glVertex2f(0,-500)

    glEnd()
    glFlush()

现在我想要旋转这条线。我试着按照这个文档进行操作,但是无法理解。根据文档,旋转函数定义如下:

def glRotate( angle , x , y , z ):

我没有z轴。所以我保持z=0。我在这里错过了什么?
1个回答

3
请注意,自几十年前以来,使用glBegin/glEnd序列和固定功能管线矩阵堆栈进行绘图的方法已经被弃用。请了解固定功能管线,并查看顶点规范着色器,以获取一种最先进的渲染方式:
传递给glRotatexyz参数是旋转轴。由于几何图形是在xy平面上绘制的,因此旋转轴必须是z轴(0,0,1):
glRotatef(10, 0, 0, 1)

要围绕一个旋转点旋转,您需要定义一个模型矩阵,该矩阵通过倒置的旋转点进行位移,然后旋转并最终通过旋转点再次变换(使用 glTranslate )。
glTranslatef(pivot_x, pivot_y, 0)
glRotatef(10, 0, 0, 1)
glTranslatef(-pivot_x, -pivot_y, 0)

请注意,像 glRotate 这样的操作不允许在 glBegin/glEnd 序列中使用。在 glBegin/glEnd 序列中,只允许设置顶点属性,如 glVertexglColor。您必须在 glBegin 之前设置矩阵:
例如:
def drawLines():
    pivot_x, pivot_y = 0, 250
    r,g,b = 255,30,20

    glTranslatef(pivot_x, pivot_y, 0)
    glRotatef(2, 0, 0, 1)
    glTranslatef(-pivot_x, -pivot_y, 0)

    glClear(GL_COLOR_BUFFER_BIT)
    glColor3ub(r,g,b)

    #drawing visible axis
    glBegin(GL_LINES)
    glVertex2f(0,500)
    glVertex2f(0,-500)
    glEnd()

    glFlush()

如果您只想旋转线条,而不影响其他对象,则必须通过使用glPushMatrix/glPopMatrix来保存和恢复矩阵堆栈:

angle = 0

def drawLines():
    global angle 
    pivot_x, pivot_y = 0, 250
    r,g,b = 255,30,20

    glClear(GL_COLOR_BUFFER_BIT)

    glPushMatrix()

    glTranslatef(pivot_x, pivot_y, 0)
    glRotatef(angle, 0, 0, 1)
    angle += 2
    glTranslatef(-pivot_x, -pivot_y, 0)

    glColor3ub(r,g,b)

    #drawing visible axis
    glBegin(GL_LINES)
    glVertex2f(0,500)
    glVertex2f(0,-500)
    glEnd()

    glPopMatrix()

    glFlush()

哇!它成功了!谢谢。有没有好的材料/资源可以学习PyOpenGL?glRotate()和glRotatef()之间有什么区别? - exiled
2
glRotatef 用于单精度浮点数 (float),例如 glVertex2f。网络上有很多教程。谷歌找到了一个不错的 Python & OpenGL for Scientific Visualization - Rabbid76
1
又出问题了!我在程序中有另一个函数来画另一条线。这条线也旋转了。有什么解决办法吗? - exiled
1
@exiled请查看答案的扩展部分 - Rabbid76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接