如何使用Apple的SIMD库在Y周围旋转arkit 4x4矩阵?

时间:2017-08-02 14:27:13

标签: swift matrix-multiplication arkit

我正在尝试基于ARKit演示实现一些代码,其中有人使用此辅助函数来放置一个航路点

let rotationMatrix = MatrixHelper.rotateAboutY(
    degrees: bearing * -1
)

如何使用SIMD库实现.rotateAboutY函数而不使用GLKit?为了更容易,我可以从原点开始。

我对矩阵数学不太方便,所以更基本的解释会有所帮助。

2 个答案:

答案 0 :(得分:0)

围绕Y矩阵的旋转是:

| cos(angle) 0 sin(angle)|
|      0    1    0       |
|-sin(angle) 0 cos(angle)|

绕Y逆时针旋转:

|cos(angle) 0 -sin(angle)|
|    0      1       0    |
|sin(angle) 0  cos(angle)|

因此,我们可以使用simd( Accelerate Framework )轻松构建矩阵:

func makeRotationYMatrix(angle: Float) -> simd_float3x3 {
    let rows = [
        simd_float3(cos(angle), 0, -sin(angle)),
        simd_float3(0, 1, 0),
        simd_float3(-sin(angle), 0, cos(angle))
    ]

    return float3x3(rows: rows)
}

这里的角度是弧度。更多信息here

答案 1 :(得分:0)

利用内置SIMD库进行此类操作的最佳方式(至少,“最佳”意思是“自己做最少数学”)可能是用四元数表示旋转并在需要时转换为矩阵。

  1. 构造一个simd_quatf,表示您要应用的轴角度旋转。
  2. 将该四元数转换为4x4矩阵。
  3. 你可以通过一线电话来做到这一点:

    let rotationMatrix = float4x4(simd_quatf(angle: radians, axis: axis))
    

    扩展到“rotateAboutY”案例:

    let radians = degreesToRadians(-bearing) // degrees * .pi / 180
    let yAxis = float3(0, 1, 0)
    let rotationMatrix = float4x4(simd_quatf(angle: radians, axis: yAxis))
    

    当然,一旦你有一个旋转矩阵,你可以使用**=运算符来应用它:

    someNode.simdTransform *= rotationMatrix
    

    如果您发现自己经常这样做,可能需要在float4x4上写一个扩展程序。

      

    提示:顺便说一下,在Swift(或C ++或Metal着色器语言)中,大多数(但不是全部)SIMD类型和全局函数都不需要simd_前缀。