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 坐标 的相关文章

  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai

随机推荐

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

    这个问题在这里已经有答案了 我正在开发文本到语音应用程序 我想将土耳其语设置为这样 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 坐标 以