Python OpenGL更正矩阵变换顺序以在固定点旋转对象

Python OpenGL更正矩阵变换顺序以在固定点旋转对象,python,opengl,matrix,rotation,matrix-multiplication,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()只是将一个四边形渲染到屏幕上 大多数资料都会建议转换矩阵,然后旋转它,就像我在这里所做的那样。但是,当四边形渲染到屏幕上时,它将围绕一个圆而不是一个固定点旋转。我的问题是,我希望四边形围绕一个固定点旋转,到目

我将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轴

glClear( GL_COLOR_BUFFER_BIT )
glTranslatef( 3, 3, 3 )
但是,假设你想围绕
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示例,它很古老,请使用VAOs和VBOs


我不知道您使用的是什么框架,但下面是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()

太棒了!非常感谢您,现在这样做更有意义了,我可以解决我的问题了!:)我会在未来考虑一种不同的方式来描述这一点。当我在计算机图形学的背景下阅读“定点”时,首先想到的是一个整数数据类型,它有一个定义基数点的刻度。。。也许是“固定地点?”:)@AndonM.Coleman啊,是的。该死的,这些技术细节总是让我摸不着头脑!谢谢你的提醒:)