Невозможно правильно преобразовать Unity View Matrix в другую систему координат после перехода на VR.C#

Место общения программистов C#
Ответить
Anonymous
 Невозможно правильно преобразовать Unity View Matrix в другую систему координат после перехода на VR.

Сообщение Anonymous »

Я пишу плагин Unity, который использует отдельный рендерер. Идея состоит в том, чтобы объединить оба изображения по глубине. Чтобы выровнять изображения, я беру матрицы View и Projection Unity и помещаю их во внешний рендерер.
Проблема в том, что они имеют разные системы координат с лево- и правосторонностью соответственно. У Unity левша, у другого рендерера — правша.
Изначально у меня все заработало. Я просто перевернул верхнюю ось и повернул вокруг одной оси, чтобы она подошла. Потом я перешёл на VR. С этого момента я не могу заставить его работать. Между двумя сценами рендеринга всегда существует некоторое смещение.
Вот как это выглядит в виртуальной реальности:
[img]https: //i.sstatic.net/wklrfyY8.png[/img]
Существует значительное смещение по оси Y и меньшее по оси X.
Изображение
При перемещении камеры назад смещение по оси Y увеличивается.
Изображение
Со стороны ситуация такая же. Как вы можете видеть, по оси Z также имеется небольшое смещение. Стороны кубов здесь не одинаковы, потому что я не перевернул его по оси X, это ничего не меняет в отношении положения.
Оба средства визуализации используют один и тот же куб, с центр в начале координат (0/0/0)
Я получаю матрицы Unity следующим образом:

Код: Выделить всё

private Matrix4x4 GetStereoViewMatrix(Camera.StereoscopicEye _eye)
{
if (xrDisplaySubsystem != null)
{
Matrix4x4 viewMatrix = cam.GetStereoViewMatrix(_eye);

Matrix4x4 conversionMatrix = new Matrix4x4(
new Vector4(scaleX, 0.0f, 0.0f, 0.0f),
new Vector4(0.0f, scaleY, 0.0f, 0.0f),
new Vector4(0.0f, 0.0f, scaleZ, 0.0f),
new Vector4(0.0f, 0.0f, 0.0f, 1.0f)
);
Matrix4x4 conversionMatrixAfter = new Matrix4x4(
new Vector4(1.0f, 0.0f, 0.0f, 0.0f),
new Vector4(0.0f, -1.0f, 0.0f, 0.0f),
new Vector4(0.0f, 0.0f, 1.0f, 0.0f),
new Vector4(0.0f, 0.0f, 0.0f, 1.0f)
);

// Transpose because external renderer uses column-major
viewMatrix = viewMatrix.transpose;
// This matrix rotates the object around its center
viewMatrix = conversionMatrix * viewMatrix;
// Inverse because external renderer requires world to camera matrix
viewMatrix = viewMatrix.inverse;
// This matrix flips the y-axis
viewMatrix = conversionMatrixAfter * viewMatrix;

return viewMatrix;
}

return Matrix4x4.identity;
}
Если у кого-нибудь возникнут идеи, я буду очень благодарен, эта проблема беспокоит меня уже больше месяца.

Подробнее здесь: https://stackoverflow.com/questions/793 ... m-since-sw
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»