現在のドラッグ方向に垂直な軸を中心にオブジェクトを回転させるのがおそらく最も直感的です。これは、マウスの動きごとに段階的に、またはドラッグの開始位置に対して相対的に行われます。2 つのオプションは、それぞれに長所と短所がある、わずかに異なるユーザー インタラクションを提供します。
角度と回転する軸を表す 3 次元ベクトルを回転行列に変換する比較的簡単な方法があります。
増分回転によって生の回転行列を更新すると、行列が純粋な回転行列ではなくなるという点で、あなたは正しいです。これは、3x3 回転行列には、回転を表すために必要なデータの 3 倍のデータがあるためです。
回転を表すよりコンパクトな方法は、オイラー角を使用することで、最小の 3 つの値のベクトルを持ちます。現在の回転をオイラー角ベクトルとして取得し、それをマトリックスに変換し、回転を (インクリメンタルまたはその他の方法で) 適用し、マトリックスをオイラー角ベクトルに戻すことができます。その最後のステップは、行列の非回転成分を自然に排除するため、次の状態の純粋な回転行列が再び得られます。
オイラー角は概念的には優れていますが、前後の変換を行うのは大変な作業です。
より実用的な選択肢は、4 つの要素ベクトルであるクォータニオン(も) です。4 つの要素は回転と均一なスケールを指定します。ベクトルを単位長に正規化すると、スケール係数が 1.0 になります。角度軸の値も、非常に簡単に四元数の値に変換できることがわかります。
q.x = sin(0.5*angle) * axis.x;
q.y = sin(0.5*angle) * axis.y;
q.z = sin(0.5*angle) * axis.z;
q.w = cos(0.5*angle);
次に、現在の回転クォータニオンと増分回転クォータニオンのクォータニオン積 (単純な乗算と加算のみを使用) を取得して、両方の回転の実行を表す新しいクォータニオンを取得できます。その時点で、長さを正規化して純粋な回転を確保できますが、それ以外の場合は回転を組み合わせて繰り返し続けます。
従来のグラフィックス API を使用して回転した状態でモデルを表示する場合、クォータニオンを回転行列に変換するのは非常に簡単です (乗算と加算のみを使用します)。