我试图理解ArKit中引入的不同元素与SceneKit中它们可能的等价物之间的区别:
SCNNode.simdTransform
vs SCNNode.transform
。在ARKit中,人们似乎使用SCNNode.simdTransform
代替SCNNode.transform
。他们有什么不同? simdTransform似乎使用列主要顺序,而transform(SCNMatrix4)是行主要。如何将一个转换为另一个?只需转置?如果我使用transform
代替simdTransform
,我认为跟踪也不起作用。这是预期的还是仅仅是一种印象?如果我设置了一个属性,如果我再设置另一个属性会发生什么?
ARFrame.camera
vs 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
它们是否相同减去一次旋转?
答案 0 :(得分:6)
SceneKit和ARKit都包含定义为SIMD类型的符号。由于ARKit导入SceneKit,因此两者都可以访问SceneKit中定义的SIMD符号。 SIMD类型支持并行计算,因此使用它们可以提高应用程序更新逻辑的性能。正如您所发现的那样,在SIMD类型及其旧版SceneKit或Core Graphics等效项之间进行转换并不总是一种方便的方式,因此您通常会尽可能一致地使用SIMD来获得更清晰的代码。
更新影响节点转换的任何属性也会更新其他转换属性。这也适用于本地和世界坐标。
_type
的{{1}}属性描述了设备的硬件摄像头,而不是用于渲染场景的虚拟摄像头。虽然我希望有一个密切的对应关系,但我猜你是在渲染循环期间更新camera
实例之前轮询ARFrame
实例。如果可以,我建议您从适当的委托方法中推广这些更新,因为您知道相关数据是最新的。
答案 1 :(得分: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
*/
如您所见,SCNMatrix4
的转换值存储在第四列的m41, m42, m43
中。这些值可能由于矩阵被转置而存储在m41, m42, m43
中,然后将它们实际存储在第四行中。 question涵盖了这种困惑。