在 Unity / Vuforia 中强制 AR 对象始终直立

Posted

技术标签:

【中文标题】在 Unity / Vuforia 中强制 AR 对象始终直立【英文标题】:Force an AR object to always stand upright in Unity / Vuforia 【发布时间】:2021-09-08 20:16:10 【问题描述】:

我有一个使用 Vuforia 引擎的 Unity AR 项目。我想要实现的是让 AR 对象在视图中始终直立,无论图像目标是在桌子上水平还是在墙上垂直。

目前无论哪个方向,对象都坐在图像目标上

希望这是有道理的,

谢谢

【问题讨论】:

请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

我总是为此使用Vector3.ProjectOnPlane,然后您可以简单地将轴方向分配给Transform.upTransform.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 可用于水平和垂直目标。

【讨论】:

感谢您的帮助,但不幸的是,这并没有解决问题。对象方向保持不变 @jrhall 你是什么意思不变?代码肯定会改变你的图像旋转目标是旋转... 我的图像目标在世界中心并且没有旋转。我有一个空的 GameObject 作为图像目标的子对象(这也为位置和旋转归零),我的动画 AR 对象作为它的子对象。我将你给我的代码应用到了空的 GO。无论目标是水平还是垂直,AR 都以相同的方式面向图像目标。 -> 不要让它成为目标的子对象.. 否则它当然会跟随父对象所做的任何旋转... 谢谢,成功了!物体在太空中与目标的距离更远,但我可以忍受

以上是关于在 Unity / Vuforia 中强制 AR 对象始终直立的主要内容,如果未能解决你的问题,请参考以下文章

如何用Unity 和Vuforia 创建一款AR应用

Unity中利用Vuforia制作AR同时令3D模型出现在2D图片前

unity2021.3.2+vuforia10.6.3开发第一个AR程序

Unity(ar)手势控制物体旋转缩放 -- Vuforia

AR 对象不应随 AR 相机 Vuforia Unity3d 移动

Unity Vuforia(高通)AR全流程