我需要将 2 个欧拉角加在一起。
我所做的是将欧拉角转换为旋转矩阵,然后将它们相乘。
但是,最后,为了从旋转矩阵获得最终的欧拉角,我不得不依赖一个虚拟的 SCNNode,这感觉有点 hacky。
我有这个代码:
import SceneKit
import Spatial
// A helper function
func eulerToRotation(eulerAngles: SCNVector3) -> SCNVector4 {
let rotation = Rotation3D(eulerAngles: .init(angles: [eulerAngles.x, eulerAngles.y, eulerAngles.z], order: .xyz))
return SCNVector4(
simd_double4(rotation.axis.vector, rotation.angle.radians)
)}
func addEulerAngles(e1: SCNVector3, e2: SCNVector3) -> SCNVector3 {
let r1 = eulerToRotation(eulerAngles: e1), r2 = eulerToRotation(eulerAngles: e2)
let m1 = SCNMatrix4MakeRotation(r1.w, r1.x, r1.y, r1.z), m2 = SCNMatrix4MakeRotation(r2.w, r2.x, r2.y, r2.z)
let m = SCNMatrix4Mult(m1, m2)
// Hacky here
let node = SCNNode()
node.transform = m
return node.eulerAngles
}
有没有更好的方法来添加 2 个欧拉角而不使用这个虚拟 SCNNode?
您可以使用 Decomposed swift 包,或者使用 this code 从矩阵计算
eulerAngles
。