【问题标题】:OpenGL correct matrix transformation order to rotate object at fixed pointOpenGL正确的矩阵变换顺序以在固定点旋转对象
【发布时间】:2013-11-13 08:15:21
【问题描述】:

我在 Python 中使用 OpenGL,并且有以下代码:

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

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

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

【问题讨论】:

  • 以后我会考虑用不同的方式来描述这一点。当我在计算机图形的上下文中阅读 "fixed point" 时,首先想到的是整数数据类型,它具有定义小数点的比例。 ..也许“固定位置?” :)
  • @AndonM.Coleman 啊,是的。该死的这些技术总是逃避我!感谢您的提醒:)

标签: python opengl matrix rotation matrix-multiplication


【解决方案1】:

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

但是,假设您想围绕 A 轴 [(3, 3, 3), (3, 4, 3)] 旋转您的 P 点 (10, 10, 0)。这个轴 - - 如你所见 - 与 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!

【讨论】:

  • 太棒了!非常感谢,现在这更有意义了,我能够解决我的问题! :)
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
相关资源
最近更新 更多