Apple系统中似乎至少有六个矩阵库。其中之一是simd
库,其类型在CPU和GPU代码中的工作方式相同。
import simd
let mat = float3x3(...)
let vec = float3(...)
mat * vec
我无法为其找到文档。与大多数事情不同,它不会出现在Xcode的文档浏览器中。我知道不同的库(GLKit
)具有矩阵类型,其具有用于构建旋转矩阵的函数。例如,
GLKMatrix3MakeXRotation(radians)
GLKMatrix3RotateY(mat, radians)
simd矩阵类型是否有类似的功能?
答案 0 :(得分:2)
目前没有用于在simd.framework,Metal或MetalKit中创建此类矩阵的实用程序函数。但是,您可以使用GLKit的矩阵函数并将生成的GLKMatrix4
转换为float4x4
s,例如,将它们复制到Metal缓冲区中以便在着色器中使用。
GLKMatrix4
只是一个包含16个浮点数的联合,存储在column-major order中。
因此,我们可以在float4x4
上编写一个扩展,允许使用GLKit矩阵初始化一个simd矩阵:
extension float4x4 {
init(matrix: GLKMatrix4) {
self.init(columns: (float4(x: matrix.m00, y: matrix.m01, z: matrix.m02, w: matrix.m03),
float4(x: matrix.m10, y: matrix.m11, z: matrix.m12, w: matrix.m13),
float4(x: matrix.m20, y: matrix.m21, z: matrix.m22, w: matrix.m23),
float4(x: matrix.m30, y: matrix.m31, z: matrix.m32, w: matrix.m33)))
}
}
我通过创建一个GLKit矩阵来验证生成的矩阵符合我的期望,该矩阵表示围绕+ Z轴逆时针旋转45度,并确保它实际上将单位矢量<1, 0, 0>
旋转到单位向量<sqrt(2)/2, sqrt(2)/2, 0>
:
let rotation = GLKMatrix4MakeZRotation(.pi / 4)
let simdRotation = float4x4(matrix: rotation)
let v = float4(1, 0, 0, 0)
let vp = simdRotation * v
print("\(vp)")
> float4(0.707107, 0.707107, 0.0, 0.0)
请注意,我遵循惯例,矩阵向量乘法将向量视为列向量,并将矩阵放在左侧,这是当前使用中最常见的约定。
关于GLKit和Metal的剪辑空间,您应该注意一点。您可以阅读有关该问题以及如何更正该问题的信息,here。
答案 1 :(得分:1)
您可以浏览simd_quat。四元数的角度轴表示为simple connection。 SIMD库可以从角度轴构造一个四元数,并且还具有从一个四元数构造一个float3x3的功能。 (这是C ++,但是相同的想法也应该在Swift中起作用。)
inline float3x3 MakeRotation(float radians, float x, float y, float z) {
simd_quatf quat = simd_quaternion(radians, (simd_float3){x, y, z});
return simd_matrix3x3(quat);
}