我认为对于使用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。 :我没有发布任何代码,因为这更像是一个与逻辑相关的问题。但如果需要,我会发布。
答案 0 :(得分:0)
不要将其视为纹理的原点,而是将顶点的原点视为显示该纹理的矩形。
OpenGL中的纹理坐标由规范定义为坐标空间,其中纹理的左下角是原点。您可以更改的是对象空间中的顶点。如果没有代码,我将假设您创建顶点时将其定义为(0, 0)
到(w, h)
。在对象空间中,这意味着矩形的一个角位于原点,并且它都在一个象限中。您的glTranslatef
调用是从对象空间到世界空间的顶点。
您应该做的是移动顶点,使矩形的中心位于对象空间的原点。即,从(-w/2, -h/2)
到(w/2, h/2)
,当您将顶点转换为对象空间时,原点位于中心。
这是我所谈论的(在对象空间中)的可视化:
| |
|***** |
|***** |
|***** *****
----------------- < current ------*****------ < new
| *****
| |
| |
| |