如何在PyOpenGL中旋转object3D?

我试图在X轴上旋转一个对象,但我不明白。

我有一个类Object 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,四元数,Matrix4是我自己的类。

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


我不知道,是否有帮助,但移动或旋转物体的一般工作流程如下所示:

  • 画静态的东西
  • 在堆栈上推送实际矩阵( glPushMatrix
  • 加载单位矩阵(初始矩阵)( glLoadIdentity
  • 使用自己的矩阵并加载并将其设置为实际矩阵
  • 通过glRotate / gl转换实际矩阵....
  • 将实际矩阵保存为您自己的矩阵
  • 画你的对象
  • 从堆栈中弹出矩阵( glPopMatrix
  • 画静止的东西的其余部分
  • 在第5/6步中,您已经更新了转换矩阵。 这是必要的,因为glRotate就像一个makro,用于将旋转矩阵乘以实际的变换矩阵。 如果你总是加载单位矩阵,然后做一个glRotate那么它只会将给定的度数转换为单位矩阵 - >你的对象将被绘制为旋转这个度数,然后再不会做别的事情 - 我想这是你的错。 ..

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

    我希望这将有助于大体理解=)


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

    glRotatef(度数,0,0,-1)

    那样有用吗?


    这是我的错误?

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

    链接地址: http://www.djcxy.com/p/81853.html

    上一篇: How to Rotate a object3D in PyOpenGL?

    下一篇: Rotation of my cube based on arcball quaternion rotation matrix slightly off