OpenGL正确的矩阵变换顺序,用于在固定点旋转对象

时间:2013-11-13 08:15:21

标签: python opengl matrix rotation matrix-multiplication

我正在使用OpenGL与Python,并具有以下代码:

glTranslatef(0, 0, -3.0)
glRotatef(rotation * 100.0, 0.0, 1.0, 0.0)
square.render()

- 其中rotation是一个整数,它按帧增加,而square.render()只是将四边形渲染到屏幕上。

大多数消息来源会建议翻译矩阵然后旋转它,就像我在这里所做的那样。然而,当四边形渲染到屏幕时,它围绕圆而不是固定点旋转。我的问题是我希望四边形围绕一个固定点旋转,到目前为止我还没有成功。我做错了什么?

1 个答案:

答案 0 :(得分:2)

考虑glRotatef(),好像你实际上“画”一个轴,它从(0,0,0)开始并指向你给它的任何坐标。您的示例使用(0,1,0),它是世界Y轴。

但是,让我们说,你想围绕P轴旋转你的A点(10,10,0)[(3,3,3),(3,4,3)]这个轴 - 正如你所看到的 - 与Y平行。

首先,您必须翻译整个世界,所以现在您的A轴将位于世界Y轴上。

glClear( GL_COLOR_BUFFER_BIT )
glTranslatef( 3, 3, 3 )

现在你必须围绕世界Y轴旋转所有东西:

glRotatef( rotation*100.0, 0, 1, 0 )

然后你必须将其翻译回来:

glTranslatef( -3, -3, -3 )

现在你可以画出P点了:

glBegin( GL_POINTS )
glVertex3f( 10, 10, 0 )
glEnd()

注意:忘记我的愚蠢glBegin / End示例,它很古老,使用VAO和VBO!


我不知道你在使用什么框架,但这是pyglet中一个非常基本的例子:

import pyglet
from pyglet.gl import *

window = pyglet.window.Window( 256, 256 )

x = 0
def update(dt):
    global x
    x += 1


@window.event
def on_draw():
    global x

    glClear( GL_COLOR_BUFFER_BIT )
    glLoadIdentity()
    glTranslatef( 128, 128, 0 )
    glRotatef( x, 0, 0, 1 )
    glTranslatef( -128, -128, 0 )

    glBegin( GL_TRIANGLES )
    glColor3f( 1, 0, 0 )
    glVertex3f( 128, 128, 0 )
    glColor3f( 0, 1, 0 )
    glVertex3f( 200, 128, 0 )
    glColor3f( 0, 0, 1 )
    glVertex3f( 200, 200, 0 )
    glEnd()

pyglet.clock.schedule_interval(update, 1/60)
pyglet.app.run()

AND THE RESULT IS HERE!