OpenGL修正矩阵变换顺序在固定点旋转物体

2024-06-25 06:51:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我将OpenGL与Python一起使用,并有以下代码:

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

-其中rotation是一个以帧为单位递增的整数,square.render()只是在屏幕上呈现一个四边形。在

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


Tags: 代码屏幕来源单位矩阵整数render建议
1条回答
网友
1楼 · 发布于 2024-06-25 06:51:03

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

但是假设你想绕P轴旋转P点(10,10,0)绕A轴[(3,3,3),(3,4,3)],你可以看到这个轴与Y平行

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

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

现在,您必须围绕世界Y轴旋转所有对象:

^{pr2}$

然后你必须把它翻译回来:

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

{a1}

相关问题 更多 >