我正在使用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
轴 [(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!
我不知道你用的是什么框架,但这里有一个非常基本的例子:
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()
结果就在这里!