10

ArKit で導入されたさまざまな要素と、SceneKit でおそらく同等のものとの違いを理解しようとしています。

  • SCNNode.simdTransformSCNNode.transform。ARKit では、SCNNode.simdTransformの代わりに使用する人がいるようですSCNNode.transform。それらはどのように異なりますか?simdTransform は列優先順を使用しているようですが、変換 (SCNMatrix4) は行優先です。どうすれば他のものに変換できますか? 転載だけ?transformの代わりに使用すると、追跡がうまく機能しないという印象がありsimdTransformます。それは予想されたものですか、それとも単なる印象ですか?1 つのプロパティを設定した場合、別のプロパティを設定するとどうなりますか?

  • ARFrame.cameravs Scene.pointOfView: 変換を見ると、少し違うようです:

.

// ARFrame.camera.transform (matrix_float4x4)
-0.01 0.99  -0.11 0.02
-0.99 0.00  0.11  0.06
0.10  0.11  0.98  0.0
0.0   0.0   0.0   1.0

// sceneView.pointOfView.transform (SCNMatrix4)
// or sceneView.pointOfView.simdTransform^T (matrix_float4x4)
0.99  0     0.11   0
0.01  0.99  -0.12  0
-0.11 0.11  0.98   0
0.03  0.6   0.0    0.99

同じマイナス一回転ですか?

4

2 に答える 2

0

SCNMatrix4あなたが言うように、それは行の主要な規則に従っているとは思いません。次の点を考慮してください。

func makeTranslationMatrix(tx: Float, ty: Float, tz: Float) -> simd_float4x4 {
    var matrix = matrix_identity_float4x4

    matrix[3, 0] = tx
    matrix[3, 1] = ty
    matrix[3, 2] = tz

    return matrix
}

var T1 = makeTranslationMatrix(tx: 1, ty: 2, tz: 3)
print(T1.columns.0)
print(T1.columns.1) 
print(T1.columns.2) 
print(T1.columns.3) 
/*
T1
float4(1.0, 0.0, 0.0, 0.0)
float4(0.0, 1.0, 0.0, 0.0)
float4(0.0, 0.0, 1.0, 0.0)
float4(1.0, 2.0, 3.0, 1.0)
*/

var sceneT1 = SCNMatrix4MakeTranslation(1, 2, 3)
print("\(sceneT1.m11), \(sceneT1.m12), \(sceneT1.m13), \(sceneT1.m14)")
print("\(sceneT1.m21), \(sceneT1.m22), \(sceneT1.m23), \(sceneT1.m24)")
print("\(sceneT1.m31), \(sceneT1.m32), \(sceneT1.m33), \(sceneT1.m34)")
print("\(sceneT1.m41), \(sceneT1.m42), \(sceneT1.m43), \(sceneT1.m44)")
/*
sceneT1
1.0, 0.0, 0.0, 0.0
0.0, 1.0, 0.0, 0.0
0.0, 0.0, 1.0, 0.0
1.0, 2.0, 3.0, 1.0
*/

ご覧のとおり、 の翻訳値は- の 4 列目にSCNMatrix4格納されています。これらの値は、行列が転置されたためにm41, m42, m43格納され、実際には 4 行目に変換値が格納される可能性があります。m41, m42, m43この質問はその混乱をカバーしています。

于 2018-11-24T15:20:23.433 に答える