Я преобразовал углы Эйлера в матрицу вращения, а затем умножил их вместе.
Однако, в конце концов, чтобы получить окончательные углы Эйлера из матрицы вращения, мне пришлось положиться на фиктивный SCNNode, который кажется немного хакерским.
У меня есть этот код:
Код: Выделить всё
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
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-together