具有OpenGL纹理原点的Box2D主体在GLFW中偏移

时间:2014-10-17 19:40:48

标签: c++ opengl box2d glfw

我认为对于使用Box2D和OpenGL的人来说,使用Box2D体的原点位于体的中心并且对于OpenGL纹理是常识,它位于左下角。我正在使用Box2D创建一个主体并使用函数

将OpenGL纹理附加到它上面

glTranslatef(Player_Body->GetPosition().x, Player_Body->GetPosition().y, 0.0f)

然而,由于GetPosition()返回原点,我的纹理附着在身体上,其左下角位于身体的中心。如何将OpenGL纹理的原点更改为纹理的中心?

我认为这与World to Screen转换无关。至少还没有。因为我没有表演任何物理,只是显示一个静态的身体。目前,比率是Meters:Pixels -> 1:1(我知道这是不好的做法,但这只是一个临时测试)。我的程序使用GLFW作为窗口系统。我之前使用过GLUT,它显示正确,但我有一个监视器设备上下文问题GLUT所以我使用GLFW。但是,用于绘制和转换的OpenGL代码保持不变。 Box2D代码也是如此。那么,我该如何解决这个问题?

P.S。 :我没有发布任何代码,因为这更像是一个与逻辑相关的问题。但如果需要,我会发布。

1 个答案:

答案 0 :(得分:0)

不要将其视为纹理的原点,而是将顶点的原点视为显示该纹理的矩形。

OpenGL中的纹理坐标由规范定义为坐标空间,其中纹理的左下角是原点。您可以更改的是对象空间中的顶点。如果没有代码,我将假设您创建顶点时将其定义为(0, 0)(w, h)。在对象空间中,这意味着矩形的一个角位于原点,并且它都在一个象限中。您的glTranslatef调用是从对象空间到世界空间的顶点。

您应该做的是移动顶点,使矩形的中心位于对象空间的原点。即,从(-w/2, -h/2)(w/2, h/2),当您将顶点转换为对象空间时,原点位于中心。

这是我所谈论的(在对象空间中)的可视化:

        |                               |
        |*****                          |
        |*****                          |
        |*****                        *****
-----------------  < current    ------*****------  < new
        |                             *****
        |                               |
        |                               |
        |                               |