web-dev-qa-db-fra.com

Convertir matrix_float4x4 en espace x y z

J'utilise ARKit et j'essaie d'obtenir la position de la caméra sous forme de rotation et de coordonnées (x, y, z) dans l'espace du monde réel. Tout ce que je peux réussir à obtenir est un matrix_float4x4, que je ne comprends pas vraiment, et les angles euler ne montrent que la rotation.

Voici ce que j'ai actuellement:

let transform =  sceneView.session.currentFrame?.camera.transform
let eulerAngles =  sceneView.session.currentFrame?.camera.eulerAngles

Voici la sortie que j'obtiens:

eulerAngles: float3(-0.694798, -0.0866041, -1.68845)

transform: __C.simd_float4x4(columns: (float4(-0.171935, -0.762872, 0.623269, 0.0), float4(0.982865, -0.0901692, 0.160767, 0.0), float4(-0.0664447, 0.640231, 0.765304, 0.0), float4(0.0, 0.0, 0.0, 1.0)))

Existe-t-il un moyen de convertir le matrix_4x4, ou existe-t-il un moyen plus simple d'obtenir ces informations?

Merci!

13
Jonathan Plackett

J'utilise l'extension matrix_float4x4 pour cela:

extension matrix_float4x4 {
    func position() -> SCNVector3 {
        return SCNVector3(columns.3.x, columns.3.y, columns.3.z)
    }
}

En utilisant:

let position = transform.position()

Ou vous pouvez convertir la position directement dans le code:

let position = SCNVector3(
    transform.columns.3.x,
    transform.columns.3.y,
    transform.columns.3.z
)
23
Vasilii Muravev

Vous devriez en apprendre davantage sur les matrices 4x4 car elles sont vraiment la base de toutes les visualisations 3D et mathématiques.

  • Pour obtenir la position d'une matrice 4x4, utilisez les entrées m41, m42, m43.
  • Pour obtenir la rotation, utilisez la matrice 3x3 dans m11 ... m33.
8
Christopher Oezbek

Vous pouvez obtenir la position de la caméra de deux manières:

  1. En utilisant la propriété currentFrame de la session, vous pouvez obtenir la transformation de la caméra, puis l'utiliser pour obtenir la position:

    matrix_float4x4 cameraTransform = self.sceneView.session.currentFrame.camera.transform;
    SCNVector3 cameraPosition = SCNVector3Make(cameraTransform.columns[3].x, 
    cameraTransform.columns[3].y, cameraTransform.columns[3].z);
    
  2. Ou obtenez la position de la caméra en utilisant la propriété pointOfView de la scèneView:

    SCNVector3 cameraPosition = self.sceneView.pointOfView.worldPosition;
    
2
SilentK