Accelerate/Scenekit Framework:: 3d 和 4d 向量的数学 matrix/vector 库在哪里?

Accelerate/Scenekit Framework:: Where's the math matrix/vector lib for 3d and 4d vectors?

我正在看这个

https://developer.apple.com/library/mac/documentation/SceneKit/Reference/SceneKit_Functions/index.html

不支持基本操作吗?

var t:SCNVector3 = SCNVector3(x: 0,y: -1,z: 2)
var a:SCNVector3 = SCNVector3(x: 1,y: -2,z: -2)
var b:SCNVector3 = t + a

或者我是否需要创建自己的 C 风格操作?

转置等数学vector/matrix函数在哪里?逆?添加?布拉斯? lapack 函数?

Accelerate 框架看起来不兼容??

https://developer.apple.com/library/ios/documentation/Accelerate/Reference/BLAS_Ref/index.html#//apple_ref/doc/uid/TP30000414-SW9

我没有找到 swift 的任何官方 apple simd 扩展。我确实在 git 中心 https://github.com/noxytrux/SwiftGeom

上找到了这个

您不想在 Accelerate 框架中使用像这样的微小向量,vMathLib 可能是个例外。您将在开销中失去性能以检查数组是否对齐以及问题是否大到足以进行多线程处理。

您正在寻找的大部分 SIMD 级别的东西都在 simd/simd.h 和关联的 headers 中。

此外,Swift 目前不支持 SIMD 向量。

在 Swift 2(目前是 Xcode 7 beta 的一部分)中,Swift 包括来自 SIMD 库的向量和矩阵类型。无论好坏,该接口与 C 版本几乎相同,但对运算符的支持更好(即您可以使用 * 而不是调用 matrix_multiply 等)。


SIMD 库中的类型和函数不在 Swift 1.x 中,但在 Xcode 6.3 中,GLKit 数学库(至少在某种程度上)可以从 Swift 1.2。因此,例如,您可以使用 SCNVector3ToGLKVector3 to convert to a GLK value, then use GLK math functions to do things like cross or project.

请注意,没有内置函数可以转换 SCNMatrix4 to/from GLKMatrix4,但是 it's not too hard to write your own.

现在有初始化程序可以转换,例如SCNVector3转simd_float3反之,则可以使用simd操作:

let v1 = simd_float3(SCNVector3(x: 1.0, y: 2.0, z: 3.0))
let v2 = simd_float3(SCNVector3(x: 2.0, y: 3.0, z: 4.0))
let cross = simd_cross(v1, v2)

从 iOS 11 和 macOS 10.13 开始,有用于读取、设置和转换各种节点属性和场景转换的 SIMD 访问器和函数。 @Russ 的回答给出了一个示例,但您也可以直接提取节点位置,例如:

let t = nodeT.simdPosition
let a = nodeA.simdPosition
let b = simdCross(t, a)

甚至

let b = simdCross(nodeT.simdPosition, nodeA.simdPosition)