旋转时固体物体的持续角

Persisting angle of solid objects while rotating

我是 UnityOculus 的新手。我有一堆图像(它们的路径和其他信息是 loaded from a JSON file),我正试图在 VR 房间中渲染它们。并希望为用户提供一种体验,即他可以使用 Oculus Touch.

在该房间内移动这些图像

我放置了一个 Empty Object,它有一个循环遍历 JSON 和 creates a prefab object (which has Rigid body,Box Collider and OVRGrabbable -so that it can be grabbed in VR, components). Moreover this prefab object has a script 的脚本,它负责在 Sprite.

中加载图像

什么在起作用?

图像正在渲染,可以抓取和移动。

什么地方没有按预期工作?

我遵循了这个 tutorial,如图所示,立方体的角度保持得很好。但是当图像被抓取和旋转时,它不会保持它的侧角。如下图所示:

问题

有什么办法可以解决吗?我试图在网上寻找它,但由于我是 Unity 的新手,我不太确定我到底错过了什么。

任何线索将不胜感激。

您可以使用 RigidbodyConstraints 将旋转锁定在一个轴上。

另一种选择是使用脚本修复 LateUpdate 中的旋转。

如果问题只出现在 sprite 上,请尝试将其设为立方体的子级,并在其中禁用渲染器。

可能不止一件事在起作用,如果不查看预制件层次结构或 OVRGrabbable 的来源,就很难分辨。

想到的一件事是您应该 操纵对象的位置和旋转 通过它的 rigidbody

预制件可能有一堆持续存在的内置转换,在你与对撞机交互之前一切都正确对齐了吗?不知何故,图像到对撞机的旋转类似于对撞机相对于世界的旋转。难道你嵌套了两个对象?

我认为问题出在您的层次结构上。您的 Images 游戏 object(您的 DisplayImage 的 parent)的规模为 (1.88,1,1)。尝试旋转 child object 的 parent object 在 Unity 中具有 non-uniform 比例会给你带来古怪的结果。尝试将 Images object 的比例重置为 (1,1,1) 看看是否有帮助。


此行为的发生是由于 "parent/child" 关系的性质。 child 的坐标系是相对于它的 parent 的。我们可以认为是parent为我们的children定义了一个坐标系。这就是我们所说的本地space。因此,当我们对 parent 执行任何线性变换时,就好像我们在我们的 children 用来定义其方向的整个 parent 坐标系上执行它们。所以平移 parent 会移动它的所有 children,因为我们的整个局部坐标 space 已经随着 parent 移动。请注意,我们的 children 仍将具有相同的 localPosition,但他们的全局 position 将发生变化。

相同的逻辑适用于缩放和旋转。旋转 parent 本质上是旋转整个坐标 space,我们的 child 正在围绕 parent 的中心点(即局部坐标系中的点 (0,0,0) space)。所以所有 children 都会被旋转,就好像它们是 parent object.

的延伸一样

在我们的情况下,我们已经缩放了 parent,从而缩放了我们用来定义 child object 的整个坐标系。这意味着任何使用 parent 的坐标 space 的东西也将根据 parent 的比例 进行缩放 。在我们的情况下,parent 被缩放了 (1.88,1,1)。因此,附加到 parent 的所有内容也沿着 parent 的 X-Axis 缩放了 1.88,导致您的屏幕截图中出现奇怪的效果。尽管旋转了我们的 child object,它仍然沿 parent 的 X-axis.

缩放

Link 到官方文档。)

此问题的解决方案是在层次结构中尽可能深入地应用线性变换。在这里,不是缩放 parent,而是缩放 child。如果 parent object 需要缩放,或者它的缩放比例在运行中发生变化,另一种解决方案是从 parent/child 层次结构中删除 child 并基于其变换操作在脚本中旧 parent 的转换。在这种情况下,您可以将未链接的 child 的位置和旋转设置为 parent 的位置和旋转,但忽略比例。

根据@Adam Stox 的回答,我与您分享一个通常适用于这种情况的解决方案(link 原始答案):

Don't child the objects directly to a non-uniformly scaled parent - child this non-uniform object to an empty object, which will be the parent of the other objects too; since an empty object is scaled 1,1,1, childing other objects to it don't cause this problem.

我不知道你的对象层次结构,但在link你可以找到一个例子,这样你就可以适应你的具体情况。