在 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.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
可用于水平和垂直目标。
【讨论】:
感谢您的帮助,但不幸的是,这并没有解决问题。对象方向保持不变 @jrhall 你是什么意思不变?代码肯定会改变你的图像旋转目标是旋转... 我的图像目标在世界中心并且没有旋转。我有一个空的 GameObject 作为图像目标的子对象(这也为位置和旋转归零),我的动画 AR 对象作为它的子对象。我将你给我的代码应用到了空的 GO。无论目标是水平还是垂直,AR 都以相同的方式面向图像目标。 -> 不要让它成为目标的子对象.. 否则它当然会跟随父对象所做的任何旋转... 谢谢,成功了!物体在太空中与目标的距离更远,但我可以忍受以上是关于在 Unity / Vuforia 中强制 AR 对象始终直立的主要内容,如果未能解决你的问题,请参考以下文章
Unity中利用Vuforia制作AR同时令3D模型出现在2D图片前
unity2021.3.2+vuforia10.6.3开发第一个AR程序
Unity(ar)手势控制物体旋转缩放 -- Vuforia