【问题标题】:Understanding SceneKit's SIMD了解 SceneKit 的 SIMD
【发布时间】:2021-05-11 04:01:51
【问题描述】:

我正在尝试了解有关 Scenekit 的 Apple 文档,在谈论 SCNNode 变量时发现了一些问题:

例如,使用 simdScale 变量或 scale 变量应用比例有什么区别?

阅读文档, 无法理解何时以及为什么使用“管理节点的变换(SceneKit 类型)”下的变量以及何时使用管理节点的变换下的变量

例如,使用 var "scale" 或 simdScale 更改 SCNode 的比例更好?

【问题讨论】:

    标签: swift scenekit arkit simd realitykit


    【解决方案1】:

    SIMD 是单指令多数据。最新的 CPU 设计包括 SIMD 指令,以提高 3D 图形和多媒体的性能。触及您的问题 - SCNVector3SIMD3<Float> 结构之间的主要区别在于它们的初始化程序。 SCNVector3 支持:

    • FloatDoubleCGFloatIntSIMD3<Float>SIMD3<Double> 类型

    用于 X、Y 和 Z 元素。如您所知,SIMD3<Float> 及其 simd_float3 类型别名仅支持 32 位 Float。顺便说一句,SIMD3<Float> 在 RealityKit 中被积极使用。

    因此,在 SceneKit 中,您可以同时使用 SCNVector3SIMD3<Float>,具体取决于特定实例属性所需的类型。这里有八个示例如何在 SCNNode 中缩放模型。在所有这些示例中,我们应用相同的缩放值。

    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 类型的信息,请阅读this Medium story

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 2017-07-22
      • 2016-02-07
      • 2021-10-19
      • 2019-01-18
      相关资源
      最近更新 更多