如何在PyOpenGL中旋转object3D?

时间:2012-11-04 01:00:33

标签: opengl python-3.x pyopengl

我试图在X轴上旋转一个物体,但我没有。

我有一个类对象3D:

class Object3D():
   implements( IRenderizable )

   def __init__(self, parameters={} ):
     self.parameters = parameters
     self.ID= Engine().addObject3D()
     self.parent = None
     self.childrens =[]
     self.position = (parameters.get('POSITION') is None ) is True and  Vector4()     or parameters.get('POSITION')
     self.rotation = (parameters.get('ROTATION') is None ) is True and  Quaternion() or parameters.get('ROTATION')
     self.direction = Vector4()
     self.scale = Vector3(1,1,1)
     self.matrix = Matrix4()
     self.matrixLocal = Matrix4()
     self.matrixWorld = Matrix4()
     self.matrixRotationWorld = Matrix4()
     self.up = Vector3(0,1,0 )
     self.parameters =parameters
     self.rotationAngle= 10.
     self.currentMatrix = None
     self.initCurrentMatrix()


def initCurrentMatrix(self):
    glPushMatrix()
    glLoadIdentity()
    self.currentMatrix = glGetDoublev(GL_MODELVIEW_MATRIX)
    glPopMatrix()
    return 

def setID(self, Id ):
    self.ID = Id

def moveTo( self, x,y,z ):
    v=Vector4(x,y,z)
    #self.position.addSelf( self.rotation.rotateVector(v)  )
    self.position.addSelf( v )
    glPushMatrix()
    glLoadIdentity()
    glTranslatef( float(self.position.x),float(self.position.y),float(self.position.z) )
    self.currentMatrix =  glGetDoublev(GL_MODELVIEW_MATRIX)
    glPopMatrix()
    return self

def render(self):
    pass

在这段代码中,您将看到如何实现轮换:

def rotateX(self, angle=2 ):
    glPushMatrix()
    glRotated( angle, 0,1,0)
    glPopMatrix()
    return self

当Vector4,Vector3,Quaternion,Matrix4是我自己的类时。

这是我的错误?以及如何进行轮换?

3 个答案:

答案 0 :(得分:3)

我不知道,它是否有帮助,但移动或旋转对象的一般工作流程如下:

  1. 画静态东西
  2. 在堆栈上推送实际矩阵(glPushMatrix
  3. 载荷单位矩阵(初始矩阵)(glLoadIdentity
  4. 使用您自己的矩阵并加载并将其设置为实际矩阵
  5. 通过glRotate / gl ....
  6. 转换实际矩阵
  7. 将实际矩阵保存为您自己的矩阵
  8. 绘制你的对象
  9. 来自堆栈(glPopMatrix
  10. 的pop矩阵
  11. 画出剩下的静态东西
  12. 在步骤5/6中,您已更新转换矩阵。这是必要的,因为glRotate就像一个makro,用于将旋转矩阵乘以实际的变换矩阵。如果你总是加载单位矩阵,然后做一个glRotate,那么它只用给定的度数转换单位矩阵 - >你的对象将被旋转这个学位,然后再做其他事情 - 我猜,这是你的错......

    如果使用上面的9个步骤,对象的矩阵将乘以旋转矩阵,结果将用于下一个迭代步骤中的下一个乘法。

    我希望,这将有助于一般理解=)

答案 1 :(得分:2)

在你的旋转功能中,它应该是度数而不是角度:

glRotatef(度,0,0,-1)

这有用吗?

答案 2 :(得分:0)

  

这是我的错误?

你把OpenGL误认为是数学库,而不是。不要使用OpenGL在一些变量中保留的矩阵上进行数学运算。实际上,根本不要使用OpenGL矩阵函数。它们是固定功能管道的一部分,已从更高版本的OpenGL中删除。