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

我放置了一个Empty Object,该脚本具有一个通过JSON进行迭代的脚本,并且creates一个prefab object(具有Rigid bodyBox ColliderOVRGrabbable-以便可以在VR组件中使用)。此外,此prefab object具有script,负责将图像加载到Sprite中。

有什么用?

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

什么无法正常工作?

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

c# - 旋转时固体物体的持久角度-LMLPHP



有什么办法可以解决?我尝试在线寻找它,但是由于我是Unity的新手,所以我不确定我到底缺少什么。

任何线索将不胜感激。

最佳答案

我认为问题出在您的层次结构中。您的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。)

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

关于c# - 旋转时固体物体的持久角度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51019842/

10-12 05:52
查看更多