В настоящее время я работаю над игрой для людей с ограничениями доступа. У меня проблема с блокировкой модели игрока в сидячем положении. Если пользователь не центрируется в комнате, модель игрока будет тянуться в определенном направлении. Я хотел бы зафиксировать модель игрока в кресле и разрешить только движения рук и повороты головы, не наклоняясь и не двигаясь в игре с помощью HMD.
Поскольку я использую актив Final VR IK, я попытался использовать их демонстрацию для сидячего положения в VR и не могу заставить игрока оставаться в сидячем положении естественным образом. Я не уверен, как запрограммировать это или установить ограничения, чтобы иметь возможность сделать это.
Обновлено: чтобы упростить мой вопрос. Как заблокировать HMD Oculus Rift, чтобы разрешить только вращение, а не отслеживание положения?
@Рузихм Спасибо! Я посмотрю на это.
@Ruzihm Не могли бы вы взглянуть на этот вопрос





Я понял, как заблокировать 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 значение присваивается только один раз. Он предназначен для повторного появления, которое можно установить в редакторе в зависимости от местоположения объекта перемещения. Я все еще новичок в единстве. Хотя спасибо за отзыв
да, но вы назначаете parent.position дважды в двух строках. Обратите внимание, что CameraPlayer.localPosition — это Vector3, представляющая собой структуру (тип значения — не ссылочный тип).
@derHugo, что делает эта строка, так это устанавливает родителя в текущее местоположение центральной камеры глаза (для окулуса), а затем сбрасывает его обратно в место возрождения. Таким образом, локальное положение камеры по-прежнему зависит от глобального положения установки камеры. Без двух строк модель игрока будет сильно смещена в зависимости от того, где вы были до возрождения.
что я пытаюсь сказать, так это то, что эту строку parent.position = CameraPlayer.localPosition ; можно пропустить, так как сразу после нее вы все равно назначаете другую позицию ... так что эта строка на самом деле ничего не делает.
Я вижу, о чем ты говоришь. Я удалю это.
Я ничего не знаю об API Final IK, но я бы поискал способ установить что-то вроде целевой позиции и поворота груди персонажа. Удачи!