gluProject将3D坐标转换为2D坐标不能正确转换2D Y坐标

乔浩特200

经过两个小时的搜索(在这里这里这里这里这里,还有其他很多我不介意找到的地方),我以为我终于学会了将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坐标不正确。

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

BDL

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

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

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

总的来说,我们将顶点转换为屏幕的方式如下:

 v_screen = Projection * View * Model * v_model

在古老的OpenGL中(使用时),视图和模型一起存储在ModelView矩阵中。

(由于透视图分割,我在这里跳过了一些问题,但足以理解该问题。)

你的问题

您已经在飞船的世界空间(x,y,z)中拥有位置。因此,使用Model进行的转换已经发生。剩下的就是

v_screen = Projection * View * v_worldspace

为此,我们看到在我们的情况下,输入到gluProject的ModelView矩阵必须恰好是View矩阵。

因为我不知道代码的这一部分,所以我无法告诉您代码中的视图矩阵。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PyQT中将2D屏幕坐标转换为3D坐标

来自分类Dev

将屏幕2D转换为世界3D坐标

来自分类Dev

2D到3D坐标转换

来自分类Dev

将2D坐标转换为另一个2D坐标

来自分类Dev

在3ds max中将3D坐标转换为2D

来自分类Dev

如何在z = 0平面中将2D转换矩阵(用于齐次坐标)转换为3D?

来自分类Dev

Three.js 2D X,Y坐标始终位于镜头前的3D X,Y,Z坐标

来自分类Dev

ThreeJS:在靠近平面的相机上从屏幕2D坐标转换为世界3D坐标吗?R73

来自分类Dev

将具有坐标和值的字典转换为2D数组

来自分类Dev

2D坐标到3D坐标分辨率和相机矩阵

来自分类Dev

OpenCV项目3D坐标到2D摄像机坐标

来自分类Dev

2D坐标到3D世界坐标

来自分类Dev

2D坐标到3D坐标分辨率和相机矩阵

来自分类Dev

使用Javascript进行CSS 3D转换后,获取div的真实2D顶点坐标

来自分类Dev

使用Javascript进行CSS 3D转换后,获取div的真实2D顶点坐标

来自分类Dev

将3D极坐标转换为笛卡尔坐标

来自分类Dev

R:将2D坐标与3D图中的线连接,并基于坐标添加正态分布pdf

来自分类Dev

如何停止从3D到2D坐标的转换,从而在另一侧创建“重影”坐标?

来自分类Dev

将共面3D点映射到其平面2D坐标

来自分类Dev

将3D点投影到2D屏幕坐标

来自分类Dev

将3D世界坐标放入2D数组中

来自分类Dev

将3D点投影到2D屏幕坐标

来自分类Dev

如何在3D中将圆柱坐标转换为笛卡尔坐标以进行绘制?

来自分类Dev

从2D矩阵获取坐标列表

来自分类Dev

2D数组最近点坐标

来自分类Dev

从2D矩阵获取坐标列表

来自分类Dev

坐标对的2D弹丸运动

来自分类Dev

标准化2D / 3D矢量/坐标类

来自分类Dev

Vulkan重心坐标的计算?区域功能是2D还是3D?

Related 相关文章

热门标签

归档