了解 SceneKit 的 SIMD
Understanding SceneKit's SIMD
我正在尝试了解有关 Scenekit 的 Apple 文档,在谈论 SCNNode 变量时发现了一些问题:
例如,使用 simdScale 变量或 scale 变量应用比例有什么区别?
阅读文档,
无法理解何时以及为何使用“管理节点的转换(SceneKit 类型)”下的变量以及何时使用管理节点的转换下的变量
例如,使用 var "scale" 或 simdScale 更改 SCNode 的规模更好吗?
SIMD是单指令多数据。最新的 CPU 设计包括 SIMD 指令以提高 3D 图形和多媒体的性能。关于您的问题, SCNVector3
和 SIMD3<Float>
结构之间的主要区别在于它们的初始化程序。 SCNVector3
支持:
Float
、Double
、CGFloat
、Int
、SIMD3<Float>
和 SIMD3<Double>
类型
对于 X、Y 和 Z 元素。如您所知,SIMD3<Float>
及其 simd_float3
类型别名仅支持 32 位 Float
。顺便说一下,SIMD3<Float>
在 RealityKit 中被积极使用。
因此,在 SceneKit 中,您可以同时使用 SCNVector3
和 SIMD3<Float>
,具体取决于特定实例 属性 所需的类型。这里有八个示例,展示了如何扩展 SCNNode。在所有这些示例中,我们使用相同的缩放值(x=5
、y=2
、z=5
)。
1.
let node = SCNNode()
node.scale = SCNVector3(5, 2, 5)
node.simdScale = simd_float3(5, 2, 5)
node.simdScale = SIMD3<Float>(5, 2, 5)
node.transform.m11 = 5
node.transform.m22 = 2
node.transform.m33 = 5
node.transform = SCNMatrix4( m11: 5, m12: 0, m13: 0, m14: 0,
m21: 0, m22: 2, m23: 0, m24: 0,
m31: 0, m32: 0, m33: 5, m34: 0,
m41: 0, m42: 0, m43: 0, m44: 1 )
node.simdTransform.columns.0.x = 5
node.simdTransform.columns.1.y = 2
node.simdTransform.columns.2.z = 5
node.simdTransform = simd_float4x4(diagonal: SIMD4<Float>(5, 2, 5, 1))
node.simdTransform = .init( SIMD4<Float>(5, 0, 0, 0),
SIMD4<Float>(0, 2, 0, 0),
SIMD4<Float>(0, 0, 5, 0),
SIMD4<Float>(0, 0, 0, 1) )
如果您需要有关 4x4 矩阵和 simd_float4x4
类型的更多信息,请阅读我的 Medium story。
我正在尝试了解有关 Scenekit 的 Apple 文档,在谈论 SCNNode 变量时发现了一些问题:
例如,使用 simdScale 变量或 scale 变量应用比例有什么区别?
阅读文档, 无法理解何时以及为何使用“管理节点的转换(SceneKit 类型)”下的变量以及何时使用管理节点的转换下的变量
例如,使用 var "scale" 或 simdScale 更改 SCNode 的规模更好吗?
SIMD是单指令多数据。最新的 CPU 设计包括 SIMD 指令以提高 3D 图形和多媒体的性能。关于您的问题, SCNVector3
和 SIMD3<Float>
结构之间的主要区别在于它们的初始化程序。 SCNVector3
支持:
Float
、Double
、CGFloat
、Int
、SIMD3<Float>
和SIMD3<Double>
类型
对于 X、Y 和 Z 元素。如您所知,SIMD3<Float>
及其 simd_float3
类型别名仅支持 32 位 Float
。顺便说一下,SIMD3<Float>
在 RealityKit 中被积极使用。
因此,在 SceneKit 中,您可以同时使用 SCNVector3
和 SIMD3<Float>
,具体取决于特定实例 属性 所需的类型。这里有八个示例,展示了如何扩展 SCNNode。在所有这些示例中,我们使用相同的缩放值(x=5
、y=2
、z=5
)。
1.
let node = SCNNode()
node.scale = SCNVector3(5, 2, 5)
node.simdScale = simd_float3(5, 2, 5)
node.simdScale = SIMD3<Float>(5, 2, 5)
node.transform.m11 = 5
node.transform.m22 = 2
node.transform.m33 = 5
node.transform = SCNMatrix4( m11: 5, m12: 0, m13: 0, m14: 0,
m21: 0, m22: 2, m23: 0, m24: 0,
m31: 0, m32: 0, m33: 5, m34: 0,
m41: 0, m42: 0, m43: 0, m44: 1 )
node.simdTransform.columns.0.x = 5
node.simdTransform.columns.1.y = 2
node.simdTransform.columns.2.z = 5
node.simdTransform = simd_float4x4(diagonal: SIMD4<Float>(5, 2, 5, 1))
node.simdTransform = .init( SIMD4<Float>(5, 0, 0, 0),
SIMD4<Float>(0, 2, 0, 0),
SIMD4<Float>(0, 0, 5, 0),
SIMD4<Float>(0, 0, 0, 1) )
如果您需要有关 4x4 矩阵和 simd_float4x4
类型的更多信息,请阅读我的 Medium story。