Проблема в том, что они имеют разные системы координат с лево- и правосторонностью соответственно. У 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
Мобильная версия