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

Force an AR object to always stand upright in Unity / Vuforia

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

当前无论哪个方向物体都位于图像目标上

希望这是有道理的,

谢谢

我总是为此使用 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 适用于水平和垂直目标。