0

我试图在 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 , Quaternion, Matrix4 是我自己的类时。

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

4

3 回答 3

4

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

  1. 画静态的东西
  2. 将实际矩阵压入堆栈 ( glPushMatrix)
  3. 加载单位矩阵(初始矩阵) ( glLoadIdentity)
  4. 使用您自己的矩阵并加载并将其设置为实际矩阵
  5. 通过 glRotate / gl.... 转换实际矩阵
  6. 将实际矩阵保存为您自己的矩阵
  7. 画出你的物体
  8. 从栈中弹出矩阵 ( glPopMatrix)
  9. 画出其余的静态东西

在步骤 5/6 中,您更新了转换矩阵。这是必要的,因为glRotate它就像一个宏宏,用于将旋转矩阵乘以实际的变换矩阵。如果您总是加载单位矩阵然后执行glRotate然后它仅将单位矩阵转换给定的度数->您的对象将被绘制旋转该度数,然后再不做其他事情-我想,这是您的错.. .

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

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

于 2013-01-16T14:26:46.297 回答
2

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

glRotatef(度, 0, 0, -1)

那样有用吗?

于 2012-12-12T22:08:38.607 回答
0

这是我的错吗?

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

于 2012-11-04T01:24:11.387 回答