强制 AR 对象在 Unity/Vuforia 中始终直立
Force an AR object to always stand upright in Unity / Vuforia
我有一个使用 Vuforia 引擎的 Unity AR 项目。我想要实现的是让 AR 对象在视图中始终直立,无论图像目标在 table 上是水平的还是在墙上是垂直的。
当前无论哪个方向物体都位于图像目标上
希望这是有道理的,
谢谢
我总是为此使用 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
适用于水平和垂直目标。
我有一个使用 Vuforia 引擎的 Unity AR 项目。我想要实现的是让 AR 对象在视图中始终直立,无论图像目标在 table 上是水平的还是在墙上是垂直的。
当前无论哪个方向物体都位于图像目标上
希望这是有道理的,
谢谢
我总是为此使用 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
适用于水平和垂直目标。