我已经写了一条代码来画一条线。这是函数:
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
。我在这里想念什么?
答案 0 :(得分:3)
请注意,自数十年来以来,不赞成使用glBegin
/ glEnd
序列进行绘制以及在固定功能管线矩阵堆栈中进行绘制。
阅读有关Fixed Function Pipeline的信息,并参阅Vertex Specification和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
序列中不允许进行类似glRotate
的操作。在glBegin
/glEnd
序列中,仅允许设置顶点属性的操作,例如glVertex
或glColor
。您必须在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()