Отключение отслеживания головы на камере SteamVR в Unity?

Я пытаюсь разработать HUD для своих VR-плееров, используя две камеры. Одна - это стационарная камера, которая указывает на мои объекты HUD с глубиной = 1, другая - основная камера с глубиной = 0, которая отслеживает HMD и имеет наложенный на нее HUD.

Однако Unity, SteamVR или OpenVR заставляют мою камеру отслеживать HMD игрока. После исчерпывающих поисков я не смог найти никакого способа остановить такое поведение. Затем я попытался связать все свои объекты HUD с камерой HUD и надеялся на лучшее.

Это приводит к нежелательным рывкам во всех объектах HUD:

Иерархия проекта:

[WorldHUD]
    |__ Container (HUD) 
        |__ Camera (eye)
            |__ TextMesh (Status) <- Is child of camera

[CameraRig]
    |__ Camera (Head) 
        |__ Camera (eye)

[SteamVR]

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

Я пробовал обновить положение камер в Update() и LateUpdate(), но это не повлияло. Я также потратил много часов на изменение / отладку скриптов SteamVR и OVR, которые не дали положительных результатов, и камеры никогда не прекращали отслеживать.

Я пробовал использовать этот предлагаемый сценарий на моих камерах родитель:

NegateTracking.cs:

using UnityEngine;
using UnityEngine.VR;

public class NegateTracking : MonoBehaviour
{
    void LateUpdate()
    {
        transform.position = -InputTracking.GetLocalPosition(VRNode.CenterEye);
        transform.rotation = Quaternion.Inverse(InputTracking.GetLocalRotation(VRNode.CenterEye));
    }
}

Это заставило камеру указывать в одном направлении, но все еще немного перемещалось. Однако я заметил, что так все выглядело еще более неустойчиво, и я чувствую, что либо использую его неправильно, либо этого просто недостаточно.

Теперь я вернулся к поиску способов отключить отслеживание головы на определенных камерах, чтобы я мог разместить их в своей сцене.

Кто-нибудь знает, как SteamVR / OpenVR контролирует преобразования этих камер? Есть ли способ отключить или переопределить это поведение?

Спасибо.


person Logic1    schedule 07.07.2017    source источник


Ответы (2)


Итак, просто потратил всю ночь на разработку функционального обходного пути и собрал проект, который использует небольшую магию постобработки, чтобы по сути «подделать» стационарную камеру. Моя идея заключалась в том, чтобы сгенерировать две renderTexture из настраиваемой настройки стереокамеры, состоящей из двух отдельных камер, которые не отслеживаются (что позволяет управлять положением, вращением, плоскостью конвергенции. Fov и т. Д.). Затем я передаю визуализированные текстуры (левую и правую) камеры левому и правому глазу одной из «отслеживаемых» камер в функции OnRenderImage (). Это сработало лучше, чем я ожидал, поэтому я решил выложить все на GitHub и написать короткое руководство для всех, кому это нужно.

Стационарная стереокамера (загрузка с GitHub)  введите здесь описание изображения

person Logic1    schedule 08.07.2017

Или вы можете изменить целевой дисплей и тип цели (на основной дисплей) в компоненте «Камера». (также можно сделать в скрипте)

person dljava    schedule 15.07.2017
comment
Когда я это делаю, это работает, но вид камеры ухудшается. Левое и правое изображения не сходятся должным образом, поэтому объекты в обзоре не воспринимаются как одно целое. Например, одна точка калибровки отображается как две и т. Д. Как я могу это решить? - person Dilara Albayrak; 27.11.2018