如何在PyOpenGL中旋转object3D?

如何在PyOpenGL中旋转object3D?,opengl,python-3.x,pyopengl,Opengl,Python 3.x,Pyopengl,我试着在X轴上旋转一个物体,但我不明白 我有一个3D类对象它是: class Object3D(): 实现(IRenderizable) def uu init uu(self,参数={}): self.parameters=参数 self.ID=Engine().addObject3D() self.parent=None self.childrens=[] self.position=(parameters.get('position')为None)为True,Vector4()或param

我试着在X轴上旋转一个物体,但我不明白

我有一个3D类对象它是:

class Object3D():
实现(IRenderizable)
def uu init uu(self,参数={}):
self.parameters=参数
self.ID=Engine().addObject3D()
self.parent=None
self.childrens=[]
self.position=(parameters.get('position')为None)为True,Vector4()或parameters.get('position')为True
self.rotation=(parameters.get('rotation')为None)为True,四元数()或parameters.get('rotation')为True
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=参数
自旋转角度=10。
self.currentMatrix=无
self.initCurrentMatrix()
def initCurrentMatrix(自):
glPushMatrix()
glLoadIdentity()
self.currentMatrix=glGetDoublev(GL\U模型视图\U矩阵)
GLPOP矩阵()
返回
def setID(自身,Id):
self.ID=ID
def移动到(自身、x、y、z):
v=矢量4(x,y,z)
#self.position.addSelf(self.rotation.rotativector(v))
self.position.addSelf(v)
glPushMatrix()
glLoadIdentity()
glTranslatef(float(self.position.x)、float(self.position.y)、float(self.position.z))
self.currentMatrix=glGetDoublev(GL\U模型视图\U矩阵)
GLPOP矩阵()
回归自我
def渲染(自):
通过
在这段代码中,您将看到如何实现旋转:

def rotateX(自身,角度=2):
glPushMatrix()
旋转(角度,0,1,0)
GLPOP矩阵()
回归自我
当Vector4、Vector3、四元数、Matrix4是我自己的类时

这是我的错吗?如何进行旋转

这是我的错吗

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

这是我的错吗


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

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

glRotatef(度,0,0,-1)


这行吗?

在“旋转”功能中,它应该是度而不是角度:

glRotatef(度,0,0,-1)


这行吗?

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

  • 画静态的东西
  • 在堆栈上推送实际矩阵(
    glPushMatrix
  • 负载标识矩阵(初始矩阵)(
    glLoadIdentity
  • 使用您自己的矩阵,加载并将其设置为实际矩阵
  • 通过glRotate/gl…变换实际矩阵
  • 将实际矩阵保存为您自己的矩阵
  • 画你的物体
  • 从堆栈中弹出矩阵(
    glPopMatrix
  • 绘制其余的静态内容
  • 在步骤5/6中,您已经更新了变换矩阵。这是必要的,因为
    glRotate
    类似于将旋转矩阵乘以实际变换矩阵的makro。如果您总是加载标识矩阵,然后执行
    glRotate
    操作,那么它将仅按给定的度数变换标识矩阵-->您的对象将按此度数旋转,然后再不执行其他操作-我想,这是您的错

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


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

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

  • 画静态的东西
  • 在堆栈上推送实际矩阵(
    glPushMatrix
  • 负载标识矩阵(初始矩阵)(
    glLoadIdentity
  • 使用您自己的矩阵,加载并将其设置为实际矩阵
  • 通过glRotate/gl…变换实际矩阵
  • 将实际矩阵保存为您自己的矩阵
  • 画你的物体
  • 从堆栈中弹出矩阵(
    glPopMatrix
  • 绘制其余的静态内容
  • 在步骤5/6中,您已经更新了变换矩阵。这是必要的,因为
    glRotate
    类似于将旋转矩阵乘以实际变换矩阵的makro。如果您总是加载标识矩阵,然后执行
    glRotate
    操作,那么它将仅按给定的度数变换标识矩阵-->您的对象将按此度数旋转,然后再不执行其他操作-我想,这是您的错

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


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

    因此,如何在没有PyOpenGL的情况下进行旋转?在3D图形中,转换表示为4×4矩阵。旋转可以表示为这样的矩阵。每个对象都会携带一个变换矩阵,用于描述其在世界上的位置。对该矩阵的更改通过将描述该更改的矩阵相乘来表示。绘制对象时,首先计算视图变换的合成矩阵(相机的排序)和对象的变换矩阵,并将其作为统一的传递给顶点着色器。与投影矩阵(相机镜头的一种)一起,这定义了完整的变换。那么,如何在不使用投影矩阵的情况下进行旋转呢