如何在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
) 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