我正在尝试基于ARKit演示实现一些代码,其中有人使用此辅助函数来放置一个航路点
let rotationMatrix = MatrixHelper.rotateAboutY(
degrees: bearing * -1
)
如何使用SIMD库实现.rotateAboutY函数而不使用GLKit?为了更容易,我可以从原点开始。
我对矩阵数学不太方便,所以更基本的解释会有所帮助。
答案 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库进行此类操作的最佳方式(至少,“最佳”意思是“自己做最少数学”)可能是用四元数表示旋转并在需要时转换为矩阵。
simd_quatf
,表示您要应用的轴角度旋转。你可以通过一线电话来做到这一点:
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_
前缀。