如何在PyOpenGL中旋转2D线?

时间:2018-12-23 15:00:40

标签: python opengl coordinate-transformation pyopengl opengl-compat

我已经写了一条代码来画一条线。这是函数:

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()

现在,我正在尝试旋转线条。我正在尝试遵循this文档,但无法理解。根据文档,旋转功能定义如下:

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

我没有z轴。所以我保留z=0。我在这里想念什么?

1 个答案:

答案 0 :(得分:3)

请注意,自数十年来以来,不赞成使用glBegin / glEnd序列进行绘制以及在固定功能管线矩阵堆栈中进行绘制。 阅读有关Fixed Function Pipeline的信息,并参阅Vertex SpecificationShader了解最新的渲染方式:


传递到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)

还要注意,glBegin/glEnd序列中不允许进行类似glRotate的操作。在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保存和恢复Matirx堆栈:

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()