角度の平均を計算するためにはオイラー角を使うのではなくクオータニオンでやると良い。
protocol QuaternionProtocol {
var quaternion: simd_quatd { get }
}
extension Collection where Element: QuaternionProtocol {
func average() -> simd_quatd {
self.map {
$0.quaternion}.reduce(simd_quatd(ix: 0,iy: 0,iz: 0,r: 0),+).normalized
}
}
気持ちの説明
矢印が複数あるとして、それらの角度の平均を計算したいなら、それらを数珠つなぎにして最初と最後の点を結んだ矢印の角度を測ればいい。
simd_quatd = 矢印
Reduce + = 全部足す
Normalized = 矢印の長さが1になるように拡大縮小
1の長さの矢印をオイラー角に変換する。
オイラー角ではなくクオータニオン計算すると何がいいのか?
オイラー角で計算すると、 360度をまたいだときに面倒。(ジンバルロック)
並列に計算できない。
誤差が大きい。
オイラー角でのコード 長いのがわかります。
https://qiita.com/koyo-miyamura/items/37d555ae150047ebefde