我只想获取根据 iOS 中返回的姿势中的信息计算出的目标的 2dscreen 坐标。
有人会同情我吗,请给我一个答案,因为我实际上已经完成了我正在开发的应用程序,这是我需要的最后一块。我查看了文档,但我不了解矩阵数学。
我想出了如何在屏幕上获得 X & y 2D 位置的近似值,这就是我所需要的,所以对于那些像我一样苦苦挣扎并且找不到正确方法的人来说,这是我的奇怪方法做它。
以iOS示例应用为基础;我在 AppController::getImageTargetResult 函数中添加了以下行。
vuMatrix44FGetPoseRot (modelViewMatrix, &translation, &axis, &angle);
翻译是一个 VuVector3F 并接收 3D 位置,其中 translation.data [0] 具有 Y,translation.data [1] 接收 X,translation.data [2] 接收 Z。这些值的范围是从 -1.0 到 +1.0.
在 MetalRenderer.swift 的渲染部分,我将这些值归一化
// 首先我得到屏幕尺寸。
让 screenWidth = Float (UIScreen.main.bounds.width)
让 screenHeight = Float (UIScreen.main.bounds.height)
// 然后我将 z 值归一化以将其转换为 0.0 到 1.0 的范围
让 z_Position = (UserDefaults.standard.float (forKey: "model_Position_Z") + 1.0) / 2.0
// 我为 x 和 y 创建了一个深度因子变量,用于缩放计算出的屏幕位置
// 使其在远离时移动较少,在靠近时移动较多。我从
得到了 0.070 和 0.014// 实验,不理解它们。
让 x_depth: Float = (screenWidth * 0.070) * z_Position
让 y_depth: Float = (screenHeight * 0.014) * z_Position
// 然后我标准化 x 和 y 值并将它们与深度变量相乘
让 x_Position = ((UserDefaults.standard.float (forKey: "model_Position_X") * x_depth) + 1.0) / 2.0
让 y_Position = ((UserDefaults.standard.float (forKey: "model_Position_Y") * y_depth) + 1.0) / 2.0
// 最后我将它们乘以屏幕宽度得到答案
让 screen_x = CGFloat (x_Position * screenWidth)
让 screen_y = CGFloat (y_Position * screenHeight)
我知道这不是正确的做法,但它可以满足我的需要,它让我完成了我的项目。
尽管对“这个问题没有显示任何研究成果;它不清楚或没有用”这一点有两次反对票,但我可以向这些人保证,我做了很多令人沮丧的研究。我在 Google 搜索中找到的许多答案导致旧的已停用 Vuforia 论坛中出现“找不到页面”错误消息,我在这里找不到明确的最新答案。我不知道足够多的 3D 数学来提出正确的问题或在文档中查找,尽管对于那些消息灵通的人来说这是一件微不足道的事情。
至少我已经完成了,但是对于那些认为这是易于查找的信息的两个反对者来说,如果你能给我指明正确的方向就好了。
如果有人有时间向需要比我更准确的人展示如何正确地做这件事,那就太好了。
谢谢。