gluProject将3D坐标转换为2D坐标不能正确转换2D Y坐标 [英] gluProject Converting 3D coordinates to 2D coordinates does not convert the 2D Y Coordinate correctly

查看:133
本文介绍了gluProject将3D坐标转换为2D坐标不能正确转换2D Y坐标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

经过两小时的谷歌搜索(此处此处这里这里,以及这里,以及其他一些我不费心去寻找的东西,我以为我终于学会了将3D坐标转换为2D坐标的理论。但它没有用。我们的想法是将船舶的3D坐标转换为屏幕上的2D坐标,以呈现控制该船舶的玩家的用户名。

After two hours of googling (here, here, here, here, and here, and a ton others which I am not bothered to find), I thought I had finally learnt the theory of turning 3D coordinates to 2D coordinates. But it isn't working. The idea is to translate the 3D coordinates of a ship to 2D coordinates on the screen to render the username of the player controlling that ship.

然而,文本正在呈现错误的位置:

However, the text is rendering in the wrong location:

文本为Test || 2DXCoordinate || 2DZCoordinate。

The text is "Test || 2DXCoordinate || 2DZCoordinate".

这是我的 getScreenCoords() - 将3D坐标转换为2D。

Here is my getScreenCoords() - Which converts the 3D coordinates to 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)会根据我离船的距离而变高或变低。经过几个小时的调试后,我把它缩小到这条线是不正确的:

screenCoords.get(0) is returning a perfect X coordinate. However, screenCoords.get(1) is going higher or lower depending on how far away I am from the ship. After many hours of debugging, I have narrowed it down to this line being incorrect:

GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords);

但是,我不知道出了什么问题。船的X坐标很好....为什么不是Y?

However, I have no idea what is wrong. The X coordinate of the ship is fine.... Why not the Y?

根据BDL的回答,我向gluProject()提供了错误的矩阵。但是我不知道这是怎么可能的,因为我在渲染我的船之后立即调用了这个方法(这显然是在任何矩阵中划出船只)。

According to BDL's answer, I am supplying the "wrong matrix" to gluProject(). But I don't see how that is possible, since I call the method right after I render my ship (Which is obviously in whatever matrix draws the ship).

I只是无法理解什么是错误。

I just can't fathom what is wrong.

注意:BDL的答案是完全足够的,除了它没有解释为什么Y坐标不正确。

Note: BDL's answer is perfectly adequate except that it does not explain why the Y coordinates are incorrect.

注意:这个问题过去时间更长,更模糊。经过数小时的调试后,我在上面发布了我的缩小问题。

Note: This question used to be much longer and much more vague. I have posted my narrowed-down question above after hours of debugging.

推荐答案

你必须在gluProject中使用相同的投影矩阵你用来渲染你的船。在您的情况下,使用透视投影渲染船只,但是当您调用gluProject时,会使用正交投影。

You have to use the same projection matrix in gluProject that you use for rendering your ship. In your case the ship is rendered using a perspective projection, but when you call gluProject a orthographic projection is used.

关于OpenGL中坐标系的一般理论

在大多数情况下,场景中模型的几何体(例如船舶)在模型坐标系中给出。这是顶点坐标存在的空间。现在将模型放置在场景中时,我们将模型矩阵应用于每个顶点以获得船舶在场景中的坐标。该坐标系称为世界空间。当从给定视点和观察方向观察场景时,还需要变换场景以使得视点位于原点(0,0,0)并且视图方向沿着负z轴。这是视图坐标系。最后一步是将视图坐标转换为ndc,这是通过投影矩阵完成的。

In most cases geometry of a model in your scene (e.g. the ship) is given in a model-coordinate system. This is the space where your vertex coordinates exist. When now placing the model in your scene we apply the model-matrix to each vertex to get the coordinates the ship has in the scene. This coordinate system is called world space. When viewing the scene from a given viewpoint and a viewing direction, again a transformation is needed that transforms the scene such that the viewpoint is located in the origin (0,0,0) and view-direction is along the negativ z-axis. This is the view coordinate system. The last step is to transform view-coordinates into ndc, which is done via a projection matrix.

总的来说,我们得到了一个顶点到屏幕的转换: / p>

In total we get the transformation of a vertex to the screen as:

 v_screen = Projection * View * Model * v_model

在古老的OpenGL中(当你使用它时)View和Model一起存储在ModelView矩阵中。

In ancient OpenGL (as you use it) View and Model are stored together in the ModelView matrix.

(我在这里跳过一些问题作为视角分歧,但它应该足以理解问题。)

(I skipped here some problems as perspective divide, but it should be sufficient to understand the problem.)

你的问题

您已经在船舶的世界空间(x,y,z)中占有一席之地。因此,模型的转变已经发生。剩下的是

You already have a position in world space (x,y,z) of your ship. Thus the transformation with Model has already happend. What is left is

v_screen = Projection * View * v_worldspace

为此我们看到,在我们的例子中,输入到gluProject的ModelView矩阵必须完全是View矩阵。

For this we see, that in our case the ModelView matrix that gets entered to gluProject has to be exactly the View matrix.

我无法告诉你代码中的视图矩阵在哪里,因为我不知道代码的这一部分。

I can't tell you where you get the view matrix in your code, since I don't know this part of your code.

这篇关于gluProject将3D坐标转换为2D坐标不能正确转换2D Y坐标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆