我试图在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是我自己的类时。
这是我的错误?以及如何进行轮换?
答案 0 :(得分:3)
我不知道,它是否有帮助,但移动或旋转对象的一般工作流程如下:
glPushMatrix
)glLoadIdentity
)glPopMatrix
)在步骤5/6中,您已更新转换矩阵。这是必要的,因为glRotate
就像一个makro,用于将旋转矩阵乘以实际的变换矩阵。如果你总是加载单位矩阵,然后做一个glRotate
,那么它只用给定的度数转换单位矩阵 - >你的对象将被旋转这个学位,然后再做其他事情 - 我猜,这是你的错......
如果使用上面的9个步骤,对象的矩阵将乘以旋转矩阵,结果将用于下一个迭代步骤中的下一个乘法。
我希望,这将有助于一般理解=)
答案 1 :(得分:2)
在你的旋转功能中,它应该是度数而不是角度:
glRotatef(度,0,0,-1)
这有用吗?
答案 2 :(得分:0)
这是我的错误?
你把OpenGL误认为是数学库,而不是。不要使用OpenGL在一些变量中保留的矩阵上进行数学运算。实际上,根本不要使用OpenGL矩阵函数。它们是固定功能管道的一部分,已从更高版本的OpenGL中删除。