【问题标题】:Persisting angle of solid objects while rotating旋转时固体物体的持续角度
【发布时间】:2018-06-25 09:08:30
【问题描述】:

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

我放置了一个Empty Object,它有一个迭代JSON的脚本和creates一个prefab object(它有Rigid bodyBox ColliderOVRGrabbable-这样它就可以在VR、组件中抓取)。此外,这个prefab object 有一个script,它负责在Sprite 中加载图像。

什么有效?

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

什么不符合预期?

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

问题

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

任何线索将不胜感激。

【问题讨论】:

    标签: c# unity3d geometry virtual-reality oculus


    【解决方案1】:

    我认为问题在于您的等级制度。您的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 到官方文档中。)

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

    【讨论】:

    • 这确实有效。您能否再解释一下,为什么当父母的规模不统一时,Unity 会给出这样的结果,所以它也会对其他人有所帮助。
    • 你是对的。我将添加更深入的解释。
    • +1。这是正确的答案。我正要写它,顺便说一句。实际上,我在一年前就在 Unity Answers 上写过关于它的文章,提出了一种让这种行为在框架上变得不那么晦涩的方法 - noboby 给了一个 sh*...answers.unity.com/questions/1325183/…
    【解决方案2】:

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

    不要将对象直接作为非均匀缩放的父对象的子对象 - 将这个不统一的对象创建为一个空对象,这将是 其他对象的父对象;因为一个空对象被缩放 1,1,1,将其他对象添加到它不会导致此问题。

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

    【讨论】:

      【解决方案3】:

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

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

      如果问题只出现在精灵上,请尝试将其设置为立方体的子对象,在此禁用渲染器。

      【讨论】:

        【解决方案4】:

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

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

        操纵对象的位置和旋转

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

        【讨论】:

          猜你喜欢
          • 2022-01-18
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-24
          • 2019-08-06
          相关资源
          最近更新 更多