Каковы первые два столбца в SCNMatrix4 - ios


1

Я читал документацию для этой структуры, но, похоже, недостаточно информации, m3 - это третий столбец матрицы, а m4 - четвертый столбец, содержащий информацию о ориентации и местоположении node в 3D-пространстве соответственно, что я знаю из-за некоторого курса на Удмени.

Также прямо сейчас единственный способ извлечь ориентацию и другие вещи:

guard let pointOfView = sceneView.pointOfView else { return }
let transform = pointOfView.transform
let orientaiton = SCNVector3(-transform.m31, -transform.m32, -transform.m33)

Я предполагаю, что API для ARKit отличается по сравнению с SceneKit

Ссылка на документацию Apple: https://developer.apple.com/documentation/scenekit/scnmatrix4/1621081-m11

Источник
  •  34
  •  2
  • 14 мар 2020 2020-03-14 06:07:04

2 ответа

4

SCNMatrix4 - это трехмерная матрица преобразования. Короче говоря:

M = T * R * S

Перевод (tx, ty, tz):

    ┌             ┐
T = | 1  0  0  tx |
    | 0  1  0  ty |
    | 0  0  1  tz |
    | 0  0  0   1 |
    └             ┘

Масштаб по (sx, sy, sz):

    ┌               ┐
S = | sx   0   0  0 |
    |  0  sy   0  0 |
    |  0   0  sz  0 |
    |  0   0   0  1 |
    └               ┘

Вращение на (rx, ry, rz):

R = ZYX
    ┌                           ┐
X = |  1   0        0         0 |
    |  0   cos(rx)  -sin(rx)  0 |
    |  0   sin(rx)  cos(rx)   0 |
    |  0   0        0         1 |
    └                           ┘
    ┌                             ┐
Y = |  cos(ry)    0   sin(ry)   0 |
    |  0          1   0         0 |
    |  -sin(ry)   0   cos(ry)   0 |
    |  0          0   0         1 |
    └                             ┘
    ┌                            ┐
Z = |  cos(rz)   -sin(rz)  0   0 |
    |  sin(rz)   cos(rz)   0   0 |
    |  0         0         1   0 |
    |  0         0         0   1 |
    └                            ┘

Кстати, просто разложить SCNMatrix4 с помощью SceneKit framework:

let n = SCNNode()
n.transform = YOUR_MATRIX
let position = n.position
let orientation = n.orientation
let scale = n.scale
  • 14 мар 2020 2020-03-14 06:07:05
4

SCNMatrix4 - это трехмерная матрица преобразования. Короче говоря:

M = T * R * S

Перевод (tx, ty, tz):

    ┌             ┐
T = | 1  0  0  tx |
    | 0  1  0  ty |
    | 0  0  1  tz |
    | 0  0  0   1 |
    └             ┘

Масштаб по (sx, sy, sz):

    ┌               ┐
S = | sx   0   0  0 |
    |  0  sy   0  0 |
    |  0   0  sz  0 |
    |  0   0   0  1 |
    └               ┘

Вращение на (rx, ry, rz):

R = ZYX
    ┌                           ┐
X = |  1   0        0         0 |
    |  0   cos(rx)  -sin(rx)  0 |
    |  0   sin(rx)  cos(rx)   0 |
    |  0   0        0         1 |
    └                           ┘
    ┌                             ┐
Y = |  cos(ry)    0   sin(ry)   0 |
    |  0          1   0         0 |
    |  -sin(ry)   0   cos(ry)   0 |
    |  0          0   0         1 |
    └                             ┘
    ┌                            ┐
Z = |  cos(rz)   -sin(rz)  0   0 |
    |  sin(rz)   cos(rz)   0   0 |
    |  0         0         1   0 |
    |  0         0         0   1 |
    └                            ┘

Кстати, просто разложить SCNMatrix4 с помощью SceneKit framework:

let n = SCNNode()
n.transform = YOUR_MATRIX
let position = n.position
let orientation = n.orientation
let scale = n.scale
  • 14 мар 2020 2020-03-14 06:07:05