Main поддерживает 360 вращений при переключении между VR и нормальным режимом
Я разработал VR-игру, используя Unity и Google VR SDK для Android. Я хочу, чтобы в игру можно было играть без гарнитуры VR. Как мне осуществить переключение с VR на обычный режим и наоборот? Я хочу поддерживать вращение на 360 градусов в обычном режиме, используя телефонный гироскоп. Я просмотрел много сценариев онлайн, но не могу найти ничего, что сделало бы это возможным.
Я обнаружил, что переключение режимов может быть сделано с использованием XRSettings.enabled = true/false (в зависимости от режима), но как поддерживать вращение на 360 в нормальном режиме (режим не VR)
Вот сценарий, который я написал:
открытый класс GyroToggleManager: MonoBehaviour {
private int flag = 0;
private Quaternion offset;
IEnumerator SwitchToVR() {
string desiredDevice = "cardboard";
XRSettings.LoadDeviceByName(desiredDevice);
yield return null;
XRSettings.enabled = true;
transform.localRotation = Quaternion.identity;
}
IEnumerator SwitchTo2D() {
Input.gyro.enabled = true;
// couldn't figure out how to find this.
offset = ;
XRSettings.LoadDeviceByName("");
yield return null;
transform.localRotation = Quaternion.identity;
}
// Use this for initialization
void Start () {
if(XRSettings.enabled == false){
Input.gyro.enabled = true;
}
}
// Update is called once per frame
void Update () {
if (XRSettings.enabled) {
return;
}
//Also tried different combinations here nothing worked.
transform.localRotation = Input.gyro.attitude ;
}
public void StartVR(){
if(XRSettings.enabled == false){
StartCoroutine (SwitchToVR ());
}
}
public void StartN(){
if(XRSettings.enabled == true){
StartCoroutine(SwitchTo2D());
}
}
}
Обновленный скрипт:
открытый класс GyroToggleManager: MonoBehaviour {
Quaternion offset;
IEnumerator SwitchToVR() {
string desiredDevice = "cardboard";
XRSettings.LoadDeviceByName(desiredDevice);
yield return null;
XRSettings.enabled = true;
transform.rotation = Quaternion.identity;
}
IEnumerator SwitchTo2D()
{
Input.gyro.enabled = true;
//Get offset.. Subtract Camera rotation from Gyro rotation
offset = transform.rotation * Quaternion.Inverse(GyroToUnity(Input.gyro.attitude));
XRSettings.LoadDeviceByName("");
yield return null;
XRSettings.enabled = false;
}
private static Quaternion GyroToUnity(Quaternion q)
{
return new Quaternion(q.x, q.y, -q.z, -q.w);
}
// Use this for initialization
void Start () {
if(XRSettings.enabled == false){
Input.gyro.enabled = true;
}
}
void Update()
{
if (XRSettings.enabled)
{
return;
}
//Add the gyro value with the offset then apply to the camera
transform.rotation = offset * GyroToUnity(Input.gyro.attitude);
}
public void StartVR(){
if(XRSettings.enabled == false){
StartCoroutine (SwitchToVR ());
}
}
public void StartN(){
if(XRSettings.enabled == true){
StartCoroutine(SwitchTo2D());
}
}
}
1 ответ
Ниже приведен простой скрипт слежения за камерой, который следует за мячом игрока, сохраняя расстояние смещения между камерой и игроком. Для этого он использует значение смещения, вычитая положение камеры из положения игрока, а затем повторно применяя это смещение к положению камеры с текущей позицией игрока в Update
или же LateUpdate
функция.
public Transform playerTransform;
public Transform mainCameraTransform = null;
private Vector3 cameraOffset = Vector3.zero;
void Start()
{
mainCameraTransform = Camera.main.transform;
//Get camera-player Transform Offset that will be used to move the camera
cameraOffset = mainCameraTransform.position - playerTransform.position;
}
void LateUpdate()
{
//Move the camera to the position of the playerTransform with the offset that was saved in the beginning
mainCameraTransform.position = playerTransform.position + cameraOffset;
}
Приведенный выше пример и код не совсем ваше решение, но это самый простой способ понять, что вам нужно сделать.
В вашем случае вам нужно вычесть вращение камеры из гироскопа или Input.gyro.attitude
, Незначительные изменения в том, что вы не можете использовать -
или же +
для этого, так как оба Quaternion
не Vector3
как в примере выше.
Вычесть
Quaternion
От другогоQuaternion
как я сделал вStart
функция сVector3
, умножьте обратное на другоеQuaternion
, Обратное получается сQuaternion.Inverse
,Добавить два
Quaternions
как я сделал вLateUpdate
функция выше сVector3
просто умножьте обаQuaternion
все вместе.
Вот соответствующие изменения в вашем коде:
Quaternion offset;
IEnumerator SwitchTo2D()
{
Input.gyro.enabled = true;
//Get offset.. Subtract Camera rotation from Gyro rotation
offset = transform.rotation * Quaternion.Inverse(GyroToUnity(Input.gyro.attitude));
XRSettings.LoadDeviceByName("");
yield return null;
}
// Update is called once per frame
void Update()
{
if (XRSettings.enabled)
{
return;
}
//Add the gyro value with the offset then apply to the camera
transform.rotation = offset * GyroToUnity(Input.gyro.attitude);
}
private static Quaternion GyroToUnity(Quaternion q)
{
return new Quaternion(q.x, q.y, -q.z, -q.w);
}
GyroToUnity
Функция используется для преобразования координаты гироскопа в координаты Unity перед применением к камере. Датчик гироскопа использует правую координату, в то время как камера Unity и другие объекты используют левую координату. Смотрите это для получения дополнительной информации.