このコメントでは、オイラー角を決して使用してはならないことが強く示唆されました。オイラー角、特にジンバル ロックにいくつかの制限があることは理解していますが、オイラー角がない場合に一般的に使用される最適なテクニックまたは一連のテクニックを知りたいですか?
このトピックに関するほとんどの議論には、オイラー角から四元数への変換が含まれますが、それは簡単なことです。しかし、オイラー角をまったく使用せずに回転を行うことについて私が読んだ唯一の方法は、「Game Programming Gems」の Stan Melax による記事「The Shortest Arc Quaternion」で説明されているように、次の手法を使用して 2 つのベクトルから四元数を作成することです。
template <typename T>
inline QuaternionT<T> QuaternionT<T>::CreateFromVectors(const Vector3<T>& v0, const Vector3<T>& v1)
{
Vector3<T> c = v0.Cross(v1);
T d = v0.Dot(v1);
T s = std::sqrt((1 + d) * 2);
QuaternionT<T> q;
q.x = c.x / s;
q.y = c.y / s;
q.z = c.z / s;
q.w = s / 2.0f;
return q;
}
これは、リンクされたコメントで言及されている方法ですか?