2015-07-01 10 views
5

Fehle ich hier etwas? Unter den verschiedenen Vektor/Matrix-Funktionen here kann ich keine Funktion sehen, um einfach eine SCNMatrix4-Transformation auf einen SCNVector4 anzuwenden. Ich könnte es natürlich tun, indem ich die Matrix/Vektor-Multiplikation mit der Hand ausschreibe, aber das kann nicht nötig sein.Wie man eine Transformationsmatrix auf einen Vektor in SceneKit anwendet

Der Grund dafür ist, dass ich die Projektionstransformation für eine Kamera in zwei Schritten aktualisiere. Zuerst muss ich eine Transformation auf die ursprüngliche Transformation anwenden, dann muss ich diese Transformation auf einen Vektor anwenden, um eine Zahl auszuarbeiten, dann muss ich auf der Grundlage dieser Zahl eine weitere Transformation oben anwenden.

Da es den Anschein hat, dass der Aufruf von setProjectionTransform keine sofortige Auswirkung hat (ich nehme an, es passiert, wenn die aktuelle Transaktion festgeschrieben wird), kann ich ProjectPoint nicht aufrufen, um die Transformation in ihrem Zwischenzustand anzuwenden. Ich habe daher versucht, die Transformationsmatrix zu erstellen und manuell anzuwenden.

Sicherlich muss es eine Funktion hier geben, um die einfachste Sache zu tun, die Sie jemals mit einer Matrix und einem Vektor tun könnten ???

Antwort

4

Es scheint mir, dass Apple noch nicht die Zeit hatte, ihre Game Kit-Typen auf simd umzustellen, aber weil sie wissen, dass sie das tun werden, haben sie nicht das geliefert, was Sie von Scene Kit erwarten. Im Moment glaube ich, dass es das Richtige für uns ist, an einem Repository von Initialisierern zu arbeiten. Alle Arbeiten werden mit simd-Typen erledigt; Die Konvertierung wird bei Bedarf durchgeführt.

extension float4x4 { 
    init(_ matrix: SCNMatrix4) { 
     self.init([ 
      float4(matrix.m11, matrix.m12, matrix.m13, matrix.m14), 
      float4(matrix.m21, matrix.m22, matrix.m23, matrix.m24), 
      float4(matrix.m31, matrix.m32, matrix.m33, matrix.m34), 
      float4(matrix.m41, matrix.m42, matrix.m43, matrix.m44) 
     ]) 
    } 
} 

extension float4 { 
    init(_ vector: SCNVector4) { 
     self.init(vector.x, vector.y, vector.z, vector.w) 
    } 
} 

extension SCNVector4 { 
    init(_ vector: float4) { 
     self.init(x: vector.x, y: vector.y, z: vector.z, w: vector.w) 
    } 
} 
+0

Interessant, danke - ich werde diese – Tom

+2

Apologies am Morgen ausprobieren, ich habe es nicht ausprobiert, da ich einen anderen Weg gefunden, um mein Problem zu lösen, dass die Matrixmultiplikation ganz vermieden. Allerdings habe ich diese Antwort akzeptiert, da ich keinen Grund sehe, warum es nicht funktionieren würde, und es sieht bequem und schnell aus. – Tom

Verwandte Themen