python - OpenGL正确的矩阵变换顺序以在定点旋转对象

标签 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()

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

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

最佳答案

想象一下 glRotatef() ,就好像您实际上“绘制”一个轴,该轴从 (0, 0, 0) 开始并指向您指定的任何坐标它。您的示例使用 (0, 1, 0),即世界 Y 轴。

但是假设您想要围绕 A 轴旋转 P 点 (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!

关于python - OpenGL正确的矩阵变换顺序以在定点旋转对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19948631/

相关文章:

java - OpenGL 鼠标输入

Swift 矩阵和

python - 在 Spyder 中通过将鼠标悬停来显示变量值

python - 什么时候可以在函数调用中更改变量?

python - 从 Python 管理与 redis 的连接

java - 使用 glRotatef() 时的 OpenGL 坐标问题

Python 将单行转置为列

c++ - 我无法将我的 opengl 程序链接到 math3d.h

r - 在 R : Column multiplication of a matrix with another matrix without a loop 中

python - 如何在 numPy 中执行此操作?