gluProject 将 3D 坐标转换为 2D 坐标无法正确转换 2D Y 坐标

2023-11-27

经过两个小时的谷歌搜索(here, here, here, here, and here,以及大量其他我懒得去找的),我以为我终于学会了将 3D 坐标转换为 2D 坐标的理论。但它不起作用。这个想法是将船舶的 3D 坐标转换为屏幕上的 2D 坐标,以呈现控制该船舶的玩家的用户名。

However, the text is rendering in the wrong location: enter image description here

文本为“测试 || 2DXCooperative || 2DZCooperative”。

这是我的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 坐标不正确。

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


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

OpenGL中坐标系的一般理论

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

总的来说,我们得到的顶点到屏幕的变换为:

 v_screen = Projection * View * Model * v_model

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

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

你的问题

您已经在您的飞船的世界空间 (x,y,z) 中拥有了一个位置。因此模型的转变已经发生。剩下的是

v_screen = Projection * View * v_worldspace

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gluProject 将 3D 坐标转换为 2D 坐标无法正确转换 2D Y 坐标 的相关文章

随机推荐

  • 设置土耳其语文本转语音[重复]

    这个问题在这里已经有答案了 我正在开发文本到语音应用程序 我想将土耳其语设置为这样 tts setLanguage Locale TR 但这在android中不可用 这种添加方式是错误的还是有不同的方法将土耳其语添加到文本到语音中 任何帮助
  • 如何在多项目 Android 构建中排除重复的 C 共享库 (.so)?

    当使用两个库模块构建父项目时 我遇到 重复文件 冲突 这两个模块使用相同的库模块libc shared so共享库 NOTE 请不要认为这是一个 重复的问题 我读过几篇相关的文章 它们帮助我走到了这一步 但是 没有帖子提供适用于我的案例的答
  • 多处理写入 pandas 数据框

    所以我试图用下面的代码做的是读取列表列表并将它们放入名为的函数中checker然后有log result处理函数的结果checker 我尝试使用多线程来执行此操作 因为变量名称rows to parse实际上有数百万行 因此使用多个内核应该
  • 为自定义类实现 hashcode 和 equals

    所以我有许多自定义类 其中也有使用组合的自定义类 我的自定义类具有经常更改的变量 我将它们添加到 HashSets 中 所以我的问题是当我实现 hashCode 时 对于只有不断变化的私有字段的类 我该怎么办 以下是一个自定义类的示例 pu
  • Html Agility Pack - 删除元素,但不删除innerHtml

    我可以通过 note Remove 轻松删除该元素 如下所示 HtmlDocument html new HtmlDocument html Load Server MapPath Site themes default index csh
  • Laravel 急切加载有限制

    我有两个表 即 users 和 users actions 其中 users actions 与用户有 hasMany 关系 users id name surname email actions id id action id user
  • 等待页面加载 - Cypress

    我遇到问题 因为页面未完全加载 我尝试过cy wait 1000 方法 我确实认为这不是一个好的解决方案 但仍然不起作用 页面未完全加载 这是我要测试的网站https www 24mx ie 这 代码在文件中homePage js clas
  • 如何关闭 gcc 编译器优化以启用缓冲区溢出

    我正在研究一个作业问题这需要禁用编译器优化保护才能工作 我在 ubuntu linux 上使用 gcc 4 4 1 但无法弄清楚哪些标志是正确的 我意识到它依赖于架构 我的机器运行 32 位 Intel 处理器 Thanks 这是个好问题
  • 如何使用 SQL 计算树中值的总和

    我需要对用户树所获得的每个级别的积分进行求和 1级是该用户以下1级的用户积分总和 2级是低于用户2级的用户的1级积分 以此类推 计算在非生产服务器上每月进行一次 无需担心性能 执行此操作的 SQL 会是什么样子 如果你感到困惑 别担心 我也
  • 为什么我不能使用 std::remove_if 从 std::set 中删除字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 remove if 相当于 std map 我有一组字符串 set
  • 如何检查字符串是否包含单词的所有字符

    我想检查一个字符串是否包含给定单词的所有字符 例如 var inputString this is just a simple text string 并说我有一句话 var word ts Now it should pick out t
  • 如何将DataFrame直接保存到Hive中?

    是否可以保存DataFrame在 Spark 中直接连接到 Hive 我尝试过转换DataFrame to Rdd然后保存为文本文件 然后加载到配置单元中 但我想知道是否可以直接保存dataframe to hive 您可以使用 sqlCo
  • OpenCV 正样本尺寸?

    所以我看到了很多关于 OpenCV 的 haartraining 和级联训练工具的教程 我特别有兴趣使用 createsamples 工具训练汽车分类器 但关于 w 和 h 参数似乎到处都有冲突的陈述 所以我很困惑 我指的是命令 creat
  • JSF 和表达式语言:仅当属性存在时才绑定属性

    将数据列绑定到数据源中可能存在或不存在的属性的最佳方法是什么 例如 当您有一个类层次结构 其中某些子级可能属于具有该属性的子类型时 就会发生这种情况 数据源包含各种子类类型
  • 测试运行程序“JUnit 4”未找到测试

    我的 Java 测试在 Eclipse 中运行良好 但是现在 当我从运行菜单重新启动测试时 我收到以下消息 No tests found with test runner JUnit 4 In the classpath文件我都有jar文件
  • 如何使 Inno Setup 在执行长时间 Exec 时看起来不被冻结?

    长的Exec正在安装 NET 3 5 并且脚本基于以下脚本 http www blackhillsoftware com blog 2006 06 26 using innosetup with the dotnet framework 问
  • 如何在 Windows 中使用 CMake 链接共享库 *dll [重复]

    这个问题在这里已经有答案了 我有2个文件 library dll and library h以及我自己的项目中需要的一些代码 我正在使用 Clion 在 Windows 上工作 我应该使用 CMake 进行配置 我尝试了这样的方法 cmak
  • Tensorflow:将张量切成重叠的块

    我有一个一维张量 我希望将其分割成重叠的块 我在想这样的事情 tensor tf constant 1 2 3 4 5 6 7 overlapping blocker tensor block size 3 stride 2 gt 1 2
  • F# 和 C# 的 CLR 相同那为什么 F# 比 C# 快

    我很困惑 如果您能启发我 我将不胜感激 F 使用与 C 相同的 CLR 并且底层代码相同 那么如何表明用 F 编写的函数比用 C 编写的函数运行得更快呢 如果我在 C 中仅使用不可变变量并且性能需要尽可能高 那么为什么要使用 F 底层代码是
  • gluProject 将 3D 坐标转换为 2D 坐标无法正确转换 2D Y 坐标

    经过两个小时的谷歌搜索 here here here here and here 以及大量其他我懒得去找的 我以为我终于学会了将 3D 坐标转换为 2D 坐标的理论 但它不起作用 这个想法是将船舶的 3D 坐标转换为屏幕上的 2D 坐标 以