Oculus Quest - Мировоззрение - PullRequest
0 голосов
/ 19 июня 2020

Я создал 1: 1 копию моей комнаты в 3D и единстве. Теперь я хочу выровнять эту виртуальную комнату с моей реальной комнатой через VR. Итак, таблица, которую я вижу в VR, точно соответствует реальной.

Но поскольку я использую Oculus Quest, он пересчитывает свою позицию при каждом запуске, что делает невозможным точное выравнивание по мирам.

Однако я нашел сценарий, который должен позволить мне повторно центрировать мою VR-гарнитуру с Me sh моей комнаты. Моя единственная проблема в том, что у меня нет опыта разработки, и короткие объяснения с фрагментами кода не достаточно подробны для меня .. Может кто-нибудь объяснить мне, что делать и где поместить код в мою сцену?

Ссылка: https://twitter.com/IRCSS/status/1231523329183559681/photo/1

1 Ответ

1 голос
/ 19 июня 2020

Ваш вопрос довольно обширный. В общем, лучше спросите создателя скрипта, как его использовать;)

Но вкратце об использовании такого скрипта: (кстати, в вашей ссылке в комментариях вы видите остальной код).

  1. Создайте новый скрипт в Assets

    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. В Иерархии вашей сцены выберите root я sh объект мира / комнаты, который вы хотите выровнять

  6. В Инспекторе щелкните Add Component и найдите созданный AlignMesh

  7. В leftHandPosition перетащите соответствующую руку из установки OVR. А в ABDistance отрегулируйте реальное расстояние между двумя позициями щелчка в метрах.


Небольшое объяснение, что это делает:

  • Первый щелчок устанавливает комнату в это положение

    Поэтому убедитесь, что ваша реальная точка A совпадает с точкой поворота объекта в Unity!

  • Второй щелчок используется для установки его поворота (чтобы его передняя ось указывала на точку B) и масштабирования.

    Итак, убедитесь, что ваша реальная точка B выровнена с A, таким образом, что это направление совпадает с вашей осью сетки ВПЕРЕД

Каким образом он работает на основе кода:

  • None

    Первоначально вы находитесь в состоянии IDLE None, где ваш скрипт только ждет нажмите Button.One.

    Как только вы нажмете кнопку, комната будет установлена ​​в соответствии с положением, и вы go на PivotOneSet

  • PivotOneSet

    Теперь вы ждете либо Button Two, нажмите => Отмена => назад в None состояние

    Или снова нажмите Button One, чтобы установить вторую позицию B

    После установки этого второго положения вы регулируете ориентацию и масштаб комнат в соответствии с реальными координатами. Затем вы указываете go на PivotTwoSet.

  • PivotTwoSet

    Это в основном ничего не делает, кроме ожидания нажатия Button Two для повторной инициализации процесса установки, вернувшись в состояние None.

...