如何在 PyOpenGL 中旋转二维线?
How to rotate a 2D line in PyOpenGL?
我写了一个画线的代码。这是函数:
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
。我在这里想念什么?
请注意,通过 glBegin
/glEnd
序列和固定功能流水线矩阵堆栈进行绘制已被弃用数十年。
阅读 Fixed Function Pipeline and see Vertex Specification and Shader 以了解最先进的渲染方式:
传递给glRotate
的x
、y
和z
参数是旋转轴。由于几何是在 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
sequence. In glBegin
/glEnd
sequence only operations are allowed which set the vertex attributes like glVertex
or glColor
中不允许像 glRotate
这样的操作。您必须在 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()
我写了一个画线的代码。这是函数:
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
。我在这里想念什么?
请注意,通过 glBegin
/glEnd
序列和固定功能流水线矩阵堆栈进行绘制已被弃用数十年。
阅读 Fixed Function Pipeline and see Vertex Specification and Shader 以了解最先进的渲染方式:
传递给glRotate
的x
、y
和z
参数是旋转轴。由于几何是在 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
sequence. In glBegin
/glEnd
sequence only operations are allowed which set the vertex attributes like glVertex
or glColor
中不允许像 glRotate
这样的操作。您必须在 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()