【发布时间】:2015-01-01 11:58:25
【问题描述】:
经过两个小时的谷歌搜索(here、here、here、here 和 here,还有一大堆我懒得找的其他东西),我想我终于学会了将 3D 坐标转换为 2D 坐标的理论。但它不起作用。想法是将飞船的 3D 坐标转换为屏幕上的 2D 坐标,以呈现控制该飞船的玩家的用户名。
但是,文本呈现在错误的位置:
文本是“测试 || 2DXCoordinate || 2DZCoordinate”。
这是我的getScreenCoords() - 它将 3D 坐标转换为 2D。
public static int[] getScreenCoords(double x, double y, double z) {
FloatBuffer screenCoords = BufferUtils.createFloatBuffer(4);
IntBuffer viewport = BufferUtils.createIntBuffer(16);
FloatBuffer modelView = BufferUtils.createFloatBuffer(16);
FloatBuffer projection = BufferUtils.createFloatBuffer(16);
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelView);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);
GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);
boolean result = GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords);
if (result) {
return new int[] { (int) screenCoords.get(0), (int) screenCoords.get(1) };
}
return null;
}
screenCoords.get(0) 返回一个完美的 X 坐标。但是, screenCoords.get(1) 会根据我离船的距离而升高或降低。经过数小时的调试,我将其范围缩小到这一行不正确:
GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords);
但是,我不知道出了什么问题。船的X坐标很好……为什么不是Y?
根据 BDL 的回答,我向 gluProject() 提供了“错误的矩阵”。但我不明白这是怎么可能的,因为我在渲染我的船后立即调用了该方法(这显然是在绘制船的任何矩阵中)。
我就是不知道哪里出了问题。
注意:BDL 的答案是完全足够的,只是它没有解释为什么 Y 坐标不正确。
注意:这个问题过去更长,也更模糊。经过数小时的调试,我在上面发布了缩小范围的问题。
【问题讨论】:
-
1.您是否在代码中的某处设置了 GL_MODELVIEW 矩阵?对我来说,它看起来好像是一个单位矩阵。 2. orthographicProjectionMatrix 是否包含您用来渲染飞船的透视投影?
-
@BDL orthographicProjectionMatrix 包含我用来渲染文本的投影。不是船。
-
在您发布的第二个代码块中,您正在将 orthographicProjectionMatrix 加载到投影矩阵中。这个矩阵的内容是什么?对我来说,好像您从未设置过模型视图矩阵。画船的时候从不调用 glTranslatef/glRotatef 吗?
-
@BDL 添加了更多代码。我可以添加整个类,但我认为人们不想筛选 2000 行代码。