2017-07-20 35 views
6

Używam ARKit i próbuję uzyskać położenie kamery jako współrzędnej obrotu i (x, y, z) w rzeczywistej przestrzeni. Wszystko, co uda mi się zdobyć, to matrix_float4x4, którego tak naprawdę nie rozumiem, a kąty Eulera pokazują tylko rotację.Konwertuj matrix_float4x4 na xy z spacji

Oto co obecnie mam:

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

Oto wyjście Dostaję:

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))) 

Czy istnieje sposób, aby przekształcić matrix_4x4, czy istnieje prostszy sposób, aby to Informacja?

Dzięki!

+0

Jako członek> 6 lat może wiesz n i dbasz o formatowanie kodu ... –

+0

Co dokładnie próbujesz osiągnąć? –

Odpowiedz

9

Używam rozszerzenie matrix_float4x4 za to:

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

Zastosowanie:

let position = transform.position() 

Albo można przekonwertować pozycję bezpośrednio w kodzie:

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

Powinieneś poznać matryce 4x4, ponieważ są one podstawą wszystkich wizualizacji 3D i matematyki.

  • Aby uzyskać pozycję z macierzy 4x4, należy użyć wpisów m41, m42, m43.
  • Aby uzyskać obrót, użyj macierzy 3x3 w m11 ... m33.
1

Two sposoby, w jakie jesteś n uzyskać pozycję kamery:

  1. Korzystając currentFrame sesji można uzyskać transformacji z aparatu, a następnie używać, aby uzyskać pozycję:

    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. Albo dostać położenie kamery za pomocą właściwości pointOfView z sceneView:

    SCNVector3 cameraPosition = self.sceneView.pointOfView.worldPosition;