2014-10-17 29 views
0

我认为任何使用Box2D和OpenGL的人都知道Box2D正文的原点位于正文的中心位置,对于OpenGL纹理,它位于左下角角。我使用Box2D的创建主体和安装一个OpenGL纹理它的功能,Box2D正文OpenGL纹理原点在GLFW中偏移

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

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

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

你应该做的是改变你的顶点,使矩形的中心位于对象空间的原点。即从(-w/2, -h/2)(w/2, h/2),这样当你将顶点转换到对象空间时,原点位于中心。

这里是我说的(对象空间)什么是可视化:

 |        | 
     |*****       | 
     |*****       | 
     |*****      ***** 
----------------- < current ------*****------ < new 
     |        ***** 
     |        | 
     |        | 
     |        | 
+1

是的,我的顶点像你说的定义。我的'glOrtho()'被定义为'glOrtho(0,1,0,1,-1,1)'。我更习惯于仅使用正象限的数学图表中使用的笛卡尔系统,尤其是那些涉及时间的图表。因此,我改变了它。但现在,感谢您的解决方案,我将其改回,并且工作得很好。一个如此简单明显但却显得如此难以捉摸的解决方案。非常感谢,罗伯特!谢谢您的帮助! – 2014-10-18 21:03:12

+0

@BhargavJannabhatla随时:) – 2014-10-18 21:09:02