【问题标题】:Oculus Quest - Real World AlignmentOculus Quest - 真实世界对齐
【发布时间】:2020-06-19 09:18:33
【问题描述】:

我以 3D 和统一的方式创建了我的房间的 1:1 复制品。现在我想通过 VR 将这个虚拟房间与我的真实房间对齐。 所以我在 VR 中看到的桌子与真实的桌子完全匹配。

但由于我使用的是 Oculus Quest,它会在每次开始时重新计算其位置,因此无法精确对齐世界。

但是,我找到了一个脚本,可以让我将我的 VR-Headset 与我房间的网格对齐。 我唯一的问题是,我没有开发背景,并且代码 sn-ps 的简短解释对我来说不够详细.. 有人可以向我解释要做什么以及将代码放在我的场景中的什么位置吗?

链接:https://twitter.com/IRCSS/status/1231523329183559681/photo/1

【问题讨论】:

    标签: c# unity3d virtual-reality oculusquest


    【解决方案1】:

    你的问题很广泛。一般来说,不如问问脚本的制作者如何使用它;)

    但简而言之,使用这样的脚本:(顺便说一句,在您的 cmets 链接中,您会看到其余的代码)。

    1. 在资产中创建一个新脚本

      ProjectView -> 右键 -> Create -> C# Script

    2. 按照类名AlignMesh调用它

    3. 双击打开

    4. 过去的代码。

      public class AlignMesh : MonoBehaviour
      {
          [Tooltip("Drag in the OVR rig hand used to click the buttons here")]
          public Transform HandTransform;
      
          [Tooltip("Adjust the real world distance between your two target click positions here")]
          public float ABDistance = 1.45f;
      
          public enum AligmentState
          {
              None, 
              PivotOneSet, 
              PivotTwoSet 
          }
      
          [Tooltip("If your mesh pivot does not match the real-world point A add the offset here. The mesh will be set to point A + OriginOffset")]
          public Vector3 OriginOffset;
          [Tooltip("If your mesh forward axis does not match the real-world direction A->B add the offset here. The mesh will be set to A->B * RotationOffset")]
          public Vector3 RotateOffset;
      
          public AligmentState alignmentState = AligmentState.None;
      
          private void Update()
          {
              switch (alignmentState)
              {
                  case AligmentState.None:
                      if (!OVR.Input.GetDown(OVRInput.Button.One)) return;
                      transform.position = HandTransform.position + OriginOffset;
                      alignmentState = AligmentState.PivotOneSet;
                      break;
      
                  case AligmentState.PivotOneSet:
                      if (OVRInput.GetDown(OVRInput.Button.Two))
                      {
                          alignmentState = AligmentState.None;
                          return;
                      }
      
                      if (!OVRInput.GetDown(OVRInput.Button.One)) return;
      
                      var lookAtPosition = HandTransform.position + OriginOffset;
                      var pivotOneToTwo = lookAtPosition - transform.position;
                      var scaleFactor = pivotOneToTwo.magnitude / ABDistance;
      
                      transform.LookAt(lookAtPosition, Vector3.up);
                      transfom.rotation *= RotationOffset;
                      transform.localScale *= scaleFactor;
      
                      alignmentState = AligmentState.PivotTwoSet;
                      break;
      
                  case AligmentState.PivotTwoSet:
                      if (OVRInput.GetDown(OVRInput.Button.Two))
                      {
                          alignmentState = AligmentState.None;
                      }
                      break;
              }
          }
      }
      
    5. 在场景的层次结构中,选择要对齐的世界/房间的根网格对象

    6. 在 Inspector 中单击 Add Component 并搜索您创建的 AlignMesh

    7. 将相应的手从 OVR 装置拖放到 leftHandPosition。在ABDistance 中调整两个点击位置之间的实际距离(以米为单位)。


    稍微解释一下这是做什么的:

    • 第一次点击将房间设置到那个位置

      因此,请确保您的真实世界点 A 与 Unity 中对象的轴心点匹配!

    • 第二次点击是用来设置它的旋转(所以它的前轴指向B)和缩放。

      因此请确保您的真实世界点 B 与 A 对齐,以便该方向与您的网格 FORWARD 轴匹配

    它是如何在代码基础上工作的:

    • None

      最初您处于空闲状态None,您的脚本只等待点击Button.One

      一旦你按下按钮,房间就会被设置到相应的位置,然后你就去PivotOneSet

    • PivotOneSet

      现在您正在等待 Button Two 按下 => 取消 => 回到 None 状态

      或者您再次按Button One 设置第二个位置B

      设置第二个位置后,您可以调整房间的方向和比例以匹配真实世界的坐标。然后你去PivotTwoSet状态。

    • PivotTwoSet

      这基本上什么都不做,只是等待Button Two 点击,以便通过返回None 状态重新初始化设置过程。

    【讨论】:

    • 非常感谢!我只剩下一个问题:当我确保我的真实世界点 A 与 Unity 中对象的轴心点匹配时,他不再位于我的网格中心(我使用了插件 SuperPivot)所以现在第一个点击完美工作,但第二个旋转,围绕枢轴旋转错误 90° - 为什么?
    • 脚本的作者假设你的模型的旋转匹配......发生了什么事情是它以房间 FORWARD 轴指向 @987654343 的方式旋转@!如果您的对象旋转了 90°,则可能混搭前轴不正确匹配
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2016-11-26
    • 2010-11-23
    相关资源
    最近更新 更多