Я работаю над проектом дополненной реальности, используя ARCore.Система координат ARCore меняется каждый раз, когда вы запускаете приложение, занимая исходную позицию в качестве источника.У меня есть 5 точек в другой системе координат, и я могу найти 4 из этих позиций в мировом пространстве Unity, используя ARCore Augmented Image.Эти точки имеют разные значения в моей другой системе координат, конечно.Я должен найти положение 5-й точки в мировом пространстве Unity, используя ее положение в другой системе координат.
Я следовал этому учебнику , чтобы добиться этого.Но поскольку Unity не поддерживает матрицы 3x3, я использовал Accord.NET framework.Используя учебное пособие и матрицы согласия, я могу вычислить матрицу 3x3 Rotation
и вектор Translation
.
Однако, когда я попытался применить это к своей 5-й точке, используя TestObject.transform.Translate(AccordtoUnity(Translation),Space.World)
, у меня возникли проблемы.Когда начальные 4 объекта и эталонные объекты находятся в одинаковой ориентации, мой перевод работает отлично.Однако, когда мои ссылочные объекты повернуты, этот перевод не работает.Это имеет смысл, конечно, так как я только сделал перевод.У меня вопрос, как я могу применить ротацию и перевод к моей 5-й точке.Или есть способ конвертировать мою матрицу вращения 3x3 и перевод в Unity 4x4Matrix
, с тех пор я могу использовать Matrix4x4.MultiplyPoint3x4
.Или возможно преобразовать мою матрицу вращения 3x3 в Quaternion
, которая позволяет мне использовать 4x4Matrix.SetTRS
.Я немного озадачен этим преобразованием, потому что 4x4Matrix
также включает масштабирование, но я не делаю никакого масштабирования.
Я был бы рад, если бы кто-то дал мне подсказку или предложил лучший подход, чтобы найти способчтобы найти 5-й пункт.Спасибо!
РЕДАКТИРОВАТЬ:
Я действительно решил проблему, основываясь на ответе Daveloper.Я построил матрицу Unity 4x4 следующим образом:
[ R00 R01 R02 T.x ]
[ R10 R11 R12 T.y ]
[ R20 R21 R22 T.z ]
[ 0 0 0 1 ]
Я протестировал это создание примитивных объектов в Unity и применил перемещение и вращение, используя приведенную выше матрицу, например:
TestObject.transform.position = TransformationMatrix.MultiplyPoint3x4(TestObject.transform.position);
TestObject.transform.rotation *= Quaternion.LookRotation(TransformationMatrix.GetColumn(2), TransformationMatrix.GetColumn(1));