Понимание ARKit World Transform Matrix - PullRequest
       44

Понимание ARKit World Transform Matrix

0 голосов
/ 08 сентября 2018

В ARKit, когда я выполняю тест на попадание, я получаю экземпляр ARHitTestResult. Одним из свойств этого является worldTransform, которое, как я понимаю, содержит 4 x 4 матрицу преобразования положения объекта - simd_float4x4.

Как человек, который очень незнаком с линейной алгеброй и трехмерной графикой, как бы я отредактировал эту матрицу, скажем, чтобы увеличить ее y координату на 0.05?

Если есть сообщение в блоге или что-то, на что я мог бы посмотреть, это помогло бы мне обдумать это, пожалуйста, дайте мне знать. Я не уверен, в какие сроки я должен прибегать к помощи.

Извините, если мой вопрос полон недоразумений! Как вы, вероятно, можете сказать, я не слишком знаком с этими понятиями.

Спасибо всем, кто помогает.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Матрицы в 3D компьютерной графике - это обычный способ перевода, поворота, масштабирования и сдвига 3D-объектов. В ARKit и SceneKit для всех таких преобразований вам нужно использовать matrix_identity_float4x4 глобальную переменную:

let matrix_identity_float4x4: simd_float4x4

Перевод 4x4 Matrix имеет 16 элементов внутри - 4 элемента (float4) по 4 столбца. Индексы столбцов 0, 1, 2 и 3. В матрице перевода используется четвертый столбец с индексом 3.

enter image description here

Пример:

Используйте следующий код для размещения вашего трехмерного объекта 5cm над положением по умолчанию - SCNVector3(0,0,0):

let sphereNode = SCNNode()
sphereNode.geometry = SCNSphere(radius: 1.0)
sphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.red
scene.rootNode.addChildNode(sphereNode)


var translation = matrix_identity_float4x4
translation.columns.3.y = 0.05
sphereNode.simdWorldTransform = translation

Надеюсь, это поможет.

0 голосов
/ 09 сентября 2018

РЕДАКТИРОВАТЬ: исходный вопрос лучше всего решить, просто добавив 0,05 к компоненту y position узла. Тем не менее, оригинальный ответ, приведенный ниже, немного касается составления матриц преобразования, если это то, что вас интересует.

=============================================== =======================

Если вы хотите применить операцию к матрице, самый простой способ - создать матрицу, которая выполняет эту операцию, а затем умножить исходную матрицу на эту новую матрицу.

Для перевода, если вы хотите перевести на x, y, z, вы можете сделать это:

let translation = simd_float4x4(
    float4(1, 0, 0, 0),
    float4(0, 1, 0, 0),
    float4(0, 0, 1, 0),
    float4(x, y, z, 1)
)

Обратите внимание, что это просто единичная матрица (1 по диагонали) с последним столбцом (!!! важно, что float4s выше - это COLUMNS, а не ROWS, как это может показаться визуально), в котором содержится x / y / значения z Вы можете продолжить исследование однородных координат, но подумайте об этом как о представлении перевода.

Затем, в simd, просто сделайте это: let newWorldTransform = translation * oldWorldTransform, и вы получите преобразование старого мира, переведенное вашими значениями перевода x / y / z (в вашем примере [x, y, z] = [0, 0.05 , 0]).

Однако, возможно, стоит выяснить, почему вы хотите редактировать результаты теста на попадание. Я не могу придумать практического варианта использования для этого, поэтому, возможно, если вы объясните немного больше о том, что вы пытаетесь сделать, я мог бы предложить более интуитивный способ сделать это.

...