我想在窗口的中央绘制一艘 spaceship ,因为它在太空中运转。为了滚动世界窗口,我计算了船的新位置,并使用glOrtho
将4000x3000窗口围绕此窗口居中。我的测试是按下前进按钮并向上移动飞船。在大多数机器上没有问题。在一台速度较慢的linux笔记本电脑上,我每秒只能得到30帧,这艘船来回 Flutter 。比较其相对于鼠标指针的位置(不移动),可以清楚地看到飞船前后移动了几个像素。星星也显示为模糊成短线。
我想查询船中心的像素值,看它是否在变化。
是否有一种OpenGL
方法提供一个世界点并获取将其转换为的像素点?
最佳答案
我会考虑反过来做。将飞船保持在0,0世界坐标下,并相对于它移动世界。然后,仅在窗口大小更改时才需要glOrtho调用(相机处于固定位置)。除了不必每次都计算投影矩阵之外,您还可以得到好处,如果将来世界变得庞大,那么您可以选择使用 double 位置,因为浮子上的大偏移量会导致定位不准确。
要绘制您的太空场景,您可以在绘制任何对象之前操纵modelview矩阵,并在绘制飞船时使用其他矩阵。
要从世界坐标中获取像素坐标,请将该点乘以投影矩阵乘以模型 View 矩阵(确保以正确的方式获得乘法)。然后,您将获得一个值,该值的x和y在-1到1的范围内。您可以将[1,1]加上屏幕尺寸的一半乘以得到像素位置。 (如果需要,可以将其添加到矩阵转换中)。