OpenGL:物体旋转异常

Posted

技术标签:

【中文标题】OpenGL:物体旋转异常【英文标题】:OpenGL: Objects rotating strangely 【发布时间】:2020-09-11 15:26:24 【问题描述】:

我有一个不断旋转的立方体对象,但我遇到了问题。如果我将对象从 (0,0,0) 移开,对象开始以一种奇怪的方式旋转。我不知道为什么以及如何解决这个问题。

这是我的对象的样子:

这就是我旋转立方体的方式:

    def draw_edges(self, color):
        """Draws the cube's edges"""
        glPushMatrix()
        glRotate(self.rotation[3],self.rotation[0],self.rotation[1],self.rotation[2])
        glBegin(GL_LINES)
        for edge in self.edges:
            for vertex in edge:
                glColor3fv(color)
                glVertex3fv(self.vertices[vertex])
        glEnd()
        glPopMatrix()

我在立方体上调用一个旋转方法,将传入的值添加到位置:

    def rotate(self, rotval, mult):
        self.rotation[0] = rotval[0]
        self.rotation[1] = rotval[1]
        self.rotation[2] = rotval[2]
        self.rotation[3] += mult
        if self.rotation[3] >= 360:
            self.rotation[3] = self.rotation[3] - 360

谁能帮忙解决这个问题。

【问题讨论】:

如何“将对象移开”?您必须将对象平移glTranslate 并旋转glRotate 另外,glTranslateglRotate 执行的矩阵运算是不可交换的,这意味着它们的应用顺序很关键。正如前面的评论所暗示的,您能做的最有帮助的事情就是向我们展示负责移动立方体的代码。 @PaulM。我不认为贡献者通过glTranslate“移动”对象。网格可能通过操作顶点坐标“移动”,对应于rotate * translate 而不是translate * rotate 【参考方案1】:

Fixed Function Pipeline 矩阵运算(如 glTranslateglRotate)指定一个新矩阵,并将当前矩阵乘以新矩阵。 矩阵乘法不是commutative。因此,无论您是先调用glTranslate,然后再调用glRotate,还是先调用glRotate,然后再调用glTranslate,都会有所不同。

glRotate 后跟glTranslate 时,翻译后的对象围绕原点旋转:

glTranslate后面跟glRotate时,则物体旋转,旋转物体平移:

如果您通过向顶点添加偏移量来平移网格,则这对应于后者。但如果你想围绕网格的原点旋转网格,则必须平移旋转后的模型 (translate * rotate)。

使用glTranslate“移动”网格:

def draw_edges(self, color):
        
    """Draws the cube's edges"""
    glPushMatrix()

    glTranslate(self.x, self.y, self.z)
    glRotate(self.rotation[3],self.rotation[0],self.rotation[1],self.rotation[2])    

    glBegin(GL_LINES)
    for edge in self.edges:
        for vertex in edge:
            glColor3fv(color)
            glVertex3fv(self.vertices[vertex])
    glEnd()
    glPopMatrix()

【讨论】:

以上是关于OpenGL:物体旋转异常的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 场景中绕物体旋转的困难

使用OpenGL如何实现物体绕体外任意轴旋转?

opengl导入一个3维物体,如何修改其局部坐标系?

opengl窗口中,拾取物体后,如何弹出新窗口,并在新窗口里显示所拾取物体

Opengl es Android 3D 手指触控旋转object

围绕对象旋转的矩阵乘法opengl