Unity Final VR IK (Asset) фиксирует человека в сидячем положении

В настоящее время я работаю над игрой для людей с ограничениями доступа. У меня проблема с блокировкой модели игрока в сидячем положении. Если пользователь не центрируется в комнате, модель игрока будет тянуться в определенном направлении. Я хотел бы зафиксировать модель игрока в кресле и разрешить только движения рук и повороты головы, не наклоняясь и не двигаясь в игре с помощью HMD.

Поскольку я использую актив Final VR IK, я попытался использовать их демонстрацию для сидячего положения в VR и не могу заставить игрока оставаться в сидячем положении естественным образом. Я не уверен, как запрограммировать это или установить ограничения, чтобы иметь возможность сделать это.

Обновлено: чтобы упростить мой вопрос. Как заблокировать HMD Oculus Rift, чтобы разрешить только вращение, а не отслеживание положения?

Я ничего не знаю об API Final IK, но я бы поискал способ установить что-то вроде целевой позиции и поворота груди персонажа. Удачи!

Ruzihm 19.07.2019 17:49

@Рузихм Спасибо! Я посмотрю на это.

Afroca 19.07.2019 19:31

@Ruzihm Не могли бы вы взглянуть на этот вопрос

Afroca 30.07.2019 17:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
1 112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял, как заблокировать HMD, чтобы разрешить только вращение, а не отслеживание положения. Чтобы добавить сидячее положение, просто используйте анимацию сидящего тела. Есть 2 вещи, которые я сделал. Сначала я добавил строку кода в скрипт OVRCameraRig:

trackingSpace.localPosition = -1 * centerEyeAnchor.localPosition;

Это было сделано прямо перед RaiseUpdatedAnchorsEvent(); вызов вокруг строки 260 в методе UpdateAnchors(). Что это делает, так это блокирует положение головы и позволяет только вращение головы.

Второе, что я сделал, это написал сценарий перемещения головы на основе ответа @derHugo на один из моих других вопросов. Что это делает, так это то, что при нажатии клавиши пробела вся позиция OVRCameraRig перемещается. Для этого должен быть родитель на OVRCameraRig. На снимке экрана ниже вы можете видеть объект CameraParent в качестве родителя. Я использовал сферу в качестве объекта перемещения, который был помещен в середину головы моей модели игрока. Причина, по которой мне пришлось добавить это, заключалась в том, что иногда, когда вы нажимали кнопку воспроизведения, проигрыватель запускался в странной позиции в зависимости от того, где в начале была гарнитура. На снимке экрана видно, что использование отслеживания положения не проверяется в инспекторе, что является ошибкой. Пожалуйста, оставьте его выбранным, чтобы предотвратить разрыв экрана в гарнитуре.

Вот код для изменения положения игрока в игре:

public class VRPositionChange : MonoBehaviour
{
    public Transform resetPos;
    private Transform parent;
    private void Awake()
    {
        // create a new object and make it parent of this object
        parent = gameObject.GetComponentInParent<Transform>();
    }

    // Update is called once per frame
    private void Update()
    {


        if (Input.GetKeyDown(KeyCode.Space))
        {

            // reset parent objects position
           parent.position = resetPos.position;
        }
    }
}

@derHugo значение присваивается только один раз. Он предназначен для повторного появления, которое можно установить в редакторе в зависимости от местоположения объекта перемещения. Я все еще новичок в единстве. Хотя спасибо за отзыв

Afroca 24.07.2019 20:28

да, но вы назначаете parent.position дважды в двух строках. Обратите внимание, что CameraPlayer.localPosition — это Vector3, представляющая собой структуру (тип значения — не ссылочный тип).

derHugo 24.07.2019 20:31

@derHugo, что делает эта строка, так это устанавливает родителя в текущее местоположение центральной камеры глаза (для окулуса), а затем сбрасывает его обратно в место возрождения. Таким образом, локальное положение камеры по-прежнему зависит от глобального положения установки камеры. Без двух строк модель игрока будет сильно смещена в зависимости от того, где вы были до возрождения.

Afroca 24.07.2019 20:33

что я пытаюсь сказать, так это то, что эту строку parent.position = CameraPlayer.localPosition ; можно пропустить, так как сразу после нее вы все равно назначаете другую позицию ... так что эта строка на самом деле ничего не делает.

derHugo 24.07.2019 20:35

Я вижу, о чем ты говоришь. Я удалю это.

Afroca 24.07.2019 20:44

Другие вопросы по теме