我正在尝试将OpenGL中的3d点转换为屏幕上的2d点,以便为我正在编写的小游戏渲染健康栏。但是,我在检索绘制健康栏的位置的x坐标时遇到了一些麻烦。基本上,健康栏必须看起来在播放器上方,但必须始终具有相对于屏幕相同的宽度/高度。
我调整了我在Convert a 3D location to a 2D on-screen point. (XYZ => XY)接受的答案中找到的一段代码,现在我已经有了
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);
// int[] screenCoords = new double[4];
// int[] viewport = new int[4];
// double[] modelView = new double[16];
// double[] projection = new double[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(3), (int) screenCoords.get(1) };
}
return null;
}
似乎与y坐标一起正常工作,但是,无论角度是多少,x总是返回0。
非常感谢提前!
答案 0 :(得分:3)
screenCoords.get(3)
应为screenCoords.get(0)
,因为x位置存储在索引0处。您实际上只需要screenCoords
的容量为3个浮点数,而不是4个。