旋转时固体物体的持久角度

时间:2018-06-25 09:08:31

标签: c# unity3d geometry virtual-reality oculus

我是UnityOculus的新手。我有一堆图像(它们的路径和其他信息为loaded from a JSON file),我试图在VR室中进行渲染。并希望给用户一种体验,他可以使用Oculus Touch在该房间内移动这些图像。

我放置了一个Empty Object,该脚本的脚本可以通过JSON进行迭代,而createsprefab object(具有Rigid bodyBox Collider和{{1} }-以便可以在VR组件中进行抓取)。此外,此OVRGrabbable具有script,它负责将图像加载到prefab object中。

什么在起作用?

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

什么无法正常工作?

我遵循了这个tutorial,并且如图所示,立方体的角度一直保持很好。但是,当抓取并旋转图像时,它不会持续存在,而是其侧角。如下图所示:

enter image description here

问题

有什么办法可以解决?我试图在网上寻找它,但由于我是Sprite的新手,所以我不确定自己到底缺少什么。

任何线索将不胜感激。

4 个答案:

答案 0 :(得分:2)

我认为问题出在您的层次结构中。您的Images游戏对象(您的DisplayImage的父对象)的比例为(1.88,1,1)。尝试旋转其父对象在Unity中缩放比例不一致的子对象会给您带来时髦的结果。尝试将Images对象的比例重置为(1,1,1),看看是否有帮助。


由于“父母/孩子”关系的性质而发生此行为。孩子的坐标系是相对于父母的。我们可以将其视为为孩子定义坐标系的父母。这就是我们所说的本地空间。因此,当我们在父对象上执行任何线性变换时,就像我们在子对象用来定义其方向的整个父坐标系统上执行它们一样。因此平移父对象将使其所有子对象一起移动,因为我们的整个局部坐标空间已与父对象一起移动。请注意,我们的子代仍将具有相同的localPosition,但是其全局position将会更改。

相同的逻辑适用于缩放和旋转。旋转父级实质上会围绕子级的中心点(这将是局部空间中的点(0,0,0))旋转孩子使用的整个坐标空间。这样,所有子项都将被旋转,就好像它们是父对象的扩展一样。

在我们的情况下,我们缩放了父级,因此缩放了用于定义子对象的整个坐标系。这意味着使用父对象坐标空间的任何内容也将根据父对象的比例进行缩放。在我们的情况下,父级按(1.88,1,1)进行缩放。因此,附加到父对象的所有内容也沿父对象的X轴缩放了1.88 ,从而在屏幕截图中看到了怪异的效果。尽管旋转了我们的子对象,但它仍沿父对象的X轴缩放。

(关于此文档的Link。)

解决方案是将线性变换尽可能深入地应用到层次结构中。在这里,不是缩放父级,而是缩放子级。如果父对象需要缩放,或者它的缩放比例是动态变化的,另一种解决方案是从子/子层次结构中删除子对象,并基于脚本中旧父对象的变换来操纵其变换。在这种情况下,您可以将未链接的孩子的位置和旋转设置为父母的位置和旋转,但是忽略比例。

答案 1 :(得分:1)

在@Adam Stox的回答之后,我为您分享了通常在这种情况下有效的解决方案(link在原始答案中):

  

不要将对象直接作为非均匀缩放的父对象-   将这个非均匀对象子化为空对象,该对象将是   其他对象的父对象;由于缩放了一个空对象   1,1,1,将其他对象放在上面不会导致此问题。

我不知道您的对象层次结构,但是在链接中您可以找到一个示例,因此您可以适应特定的情况。

答案 2 :(得分:0)

您可以使用RigidbodyConstraints将旋转锁定在一次轴中。

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

如果问题仅发生在精灵上,请尝试使其成为多维数据集的子级,在此禁用渲染器。

答案 3 :(得分:0)

可能有不止一件事情在起作用,如果不掌握预制层级或OVRGrabbable的来源就很难说。

想到的一件事是,您应该通过对象的 rigidbody

操作对象的位置和旋转

预制件可能会保留一堆内置的转换,在与对撞机交互之前,一切是否正确对齐?同样,图像到对撞机的旋转类似于对撞机相对于世界的旋转。难道是您嵌套了两个对象?