加速/Scenekit框架:3D和4D向量的数学矩阵/向量库在哪里?

3
我正在查看此链接: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语言风格?

数学向量/矩阵函数在哪里,如转置、逆等?BLAS和Lapack函数呢?

Accelerate框架似乎不兼容?

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

我没有找到任何官方的Swift SIMD扩展。但我在GitHub上发现了这个https://github.com/noxytrux/SwiftGeom


这个问题和2015年的两个答案已经过时了。现在(截至iOS 11),SceneKit中已经内置了SIMD支持。请参阅下面来自@russ和我的答案。 - Hal Mueller
4个回答

5

如果使用加速框架,您不希望使用像这样的小向量,vMathLib可能是一个例外。在检查数组是否对齐以及问题是否足够大以进行多线程操作时,会产生额外的开销,从而降低性能。

您正在寻找的大部分SIMD级别的内容在simd / simd.h和相关头文件中。

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


1
谢谢,我会尝试重新编写Swift的SIMD。 - μολὼν.λαβέ
3
因为编写一个健壮、针对硬件进行优化的数学库是任何人都可以在下午完成的事情,对吧? :) - rickster
1
@rickster:嗯,是的。 - Stephen Canon
自iOS 11和macOS 10.13起已过时。 - Hal Mueller

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

SIMD库中的类型和函数不在Swift 1.x中,但是在Xcode 6.3中,GLKit Math库(至少有些)可以从Swift 1.2中访问。因此,您可以使用例如SCNVector3ToGLKVector3进行转换为GLK值,然后使用GLK数学函数执行诸如crossproject之类的操作。

注意,没有内置的函数可以将SCNMatrix4转换为/从GLKMatrix4,但编写自己的函数并不难

自iOS 11和macOS 10.13起已过时。 - Hal Mueller

3
现在有初始化器来将例如 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)

0
从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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接