【发布时间】:2021-09-08 20:16:10
【问题描述】:
我有一个使用 Vuforia 引擎的 Unity AR 项目。我想要实现的是让 AR 对象在视图中始终直立,无论图像目标是在桌子上水平还是在墙上垂直。
目前无论哪个方向,对象都坐在图像目标上
希望这是有道理的,
谢谢
【问题讨论】:
-
请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。
标签: c# unity3d augmented-reality vuforia
我有一个使用 Vuforia 引擎的 Unity AR 项目。我想要实现的是让 AR 对象在视图中始终直立,无论图像目标是在桌子上水平还是在墙上垂直。
目前无论哪个方向,对象都坐在图像目标上
希望这是有道理的,
谢谢
【问题讨论】:
标签: c# unity3d augmented-reality vuforia
我总是为此使用Vector3.ProjectOnPlane,然后您可以简单地将轴方向分配给Transform.up 和Transform.right(下面我解释为什么right 而不是forward)
public void AlignObject(Transform obj, Transform imageTarget)
{
obj.position = imageTarget.position;
// Get your targets right vector in world space
var right = imageTarget.right;
// If not anyway the case ensure that your objects up vector equals the world up vector
obj.up = Vector3.up;
// Align your objects right vector with the image target's right vector
// projected down onto the global XZ plane => erasing its Y component
obj.right = Vector3.ProjectOnPlane(right, Vector3.up);
}
对此的假设是:目标通常不会在 Z 轴上旋转。如果你想让它直立在墙上,你通常会绕着它的 X 轴旋转它。
因此我们可以假设图像目标在 Z 轴上的旋转永远不会超过 90°(在这种情况下,映射的矢量将翻转大约 180°),因此如果我们将right 向量向下映射到全局XZ 平面无论 Y 轴和 X 轴是否旋转,它始终指向正确的方向。
如果我们改用forward,我们会冒这样的风险:由于跟踪不准确,垂直目标前向矢量实际上指向我们一点点,所以当我们将它向下映射到 XZ 平面上时,它指向的是向后而不是向前并且对象翻转了 180°。
所以使用right 可用于水平和垂直目标。
【讨论】: