Невозможно правильно преобразовать 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 также имеется небольшое смещение.
Оба средства визуализации используют один и тот же куб с центром в начале координат (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;
}
Матрицы проекций просто извлекаются и транспонируются в столбцы:

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

Matrix4x4 leftEyeProj = cam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left);
Matrix4x4 rightEyeProj = cam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right);

float[] leftProj = new float[]
{
leftEyeProj.m00, leftEyeProj.m10, leftEyeProj.m20, leftEyeProj.m30, // Column 1
leftEyeProj.m01, leftEyeProj.m11, leftEyeProj.m21, leftEyeProj.m31, // Column 2
leftEyeProj.m02, leftEyeProj.m12, leftEyeProj.m22, leftEyeProj.m32, // Column 3
leftEyeProj.m03, leftEyeProj.m13, leftEyeProj.m23, leftEyeProj.m33  // Column 4
};
float[] rightProj = new float[]
{
rightEyeProj.m00, rightEyeProj.m10, rightEyeProj.m20, rightEyeProj.m30, // Column 1
rightEyeProj.m01, rightEyeProj.m11, rightEyeProj.m21, rightEyeProj.m31, // Column 2
rightEyeProj.m02, rightEyeProj.m12, rightEyeProj.m22, rightEyeProj.m32, // Column 3
rightEyeProj.m03, rightEyeProj.m13, rightEyeProj.m23, rightEyeProj.m33  // Column 4
};

Plugin.setUnityProjectionMatrix(leftProj, rightProj);
Если у кого-нибудь возникнут идеи, я буду очень благодарен, эта проблема беспокоит меня уже больше месяца.

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

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

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

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

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

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