なぜこんにちはタール。3 軸に沿った開始角度がわかっている 3D モデルがあります。これらの角度は、このパターンを使用して方向余弦行列に変換されます (情報はここにあります)。
モデルの向きの更新に対応して、時間の経過とともに新しい角度値が取得されます。これらの新しい値を考慮するために、DCM を次のように更新します。
newDCM = oldDCM * newanglesDCM
私が欲しいものと私がそれを行う方法:今、トリッキーな部分です。実際には、回転行列の Y コンポーネントのみが必要です。モデルにモーションを適用するには、モーション ベクトルが空中や地面に落ちないように、モデルを平らにする必要があります。そのためには、単純に回転行列から 3 つの角度を引き戻し、[0 Y 0] の角度で新しい角度を作成します。
私が抱えている問題:回転がモデルに適用されると、DCMが更新されます。モーションが検出されると、フラット化された DCM にモーション ベクトル [0 Yvalue 0] を乗算します (前の説明に従って)。X 成分と Z 成分の瞬間的な回転の値が null または null に近い場合、結果は良好です。しかし、モデルが X と Z が有意な値を持つ状況になるとすぐに、モデルのモーションの「方向」は間違っています。「Yのみ」の状況に戻すローテーションを適用すると、再び良好になります。
何が問題になる可能性がありますか:方向余弦行列が間違っているか、行列を平坦化するために使用する手法が完全に愚かです。
ご協力いただきありがとうございます。これについて手を差し伸べていただければ幸いです。グレッグ。
編集:要求された例
私のモデルには、X、Y、Z の 3 つの軸があります。これは、モデルが静止しているときの XYZ 規則を定義します。開始点 t0 で、モデルを元の構成から t0 の構成に回転させる角度 dAx、dAy、および dAz を知っています。それが気になる場合は、モデルが t0 で静止しているとしましょう。それは問題ではありません。
画像で説明したのと同じように DCM を作成します (静止状態で開始した場合は恒等行列にします)。
時々、回転がモデルに適用されます。これらのローテーションも dAx、dAy、および dAz で構成されます。したがって、古いものと新しく生成されたものを乗算して、回転行列 (DCM) を更新します: newDCM = oldDCM * newanglesDCM. ここで、モデルをグリッド上である点から別の点に移動させたいとしましょう。たとえば、グリッドが道路であると想像してください。モデルが空を向いているか、側面にあるか正面にあるかに関係なく、モーションが同じであることを望みます。つまり、道路の横にあり、空中で上昇したり、地面に飛び込んだりしません。回転行列をそのままにしておくと、[0 Y 0] 回転を適用すると、望ましくない場所に移動します。したがって、DCM をフラット化して、古いオリジナルの XZ フレームを見つけようとします。次に、Y コンポーネントがまだあるので、モデルが通りのどこに移動しているかがわかります。
頭がモデルで、外を歩いているキャラクターを想像してみてください。彼が建物の窓を見て歩く場合、彼は空中を窓のすぐ上まで歩くのではなく、建物の足元まで歩いていきます。それがまさに私がやりたいことです:D