0

C++でスケルトンをアニメートしようとしています。私は現在、すべての関節の座標と、どの関節がどの関節に​​接続しているかを知っています。

たとえば、腕を90度上げてから、腕のさらに下にあるすべての関節の新しい座標を計算する方法を知っている人はいますか?

各ボーンのベクトルを取得して回転させ、そこから取得する必要があると思いますが、どうすればよいかわかりません。

(私はそれらを表示するためにopenGLを使用しています)

4

1 に答える 1

1

回転させたい点と軸を計算します。軸は回転平面に対して垂直です。ポイントはあなたの場合は肩です。腕の階層内のすべてのポイントを同じ量だけ回転させます。Web には、任意の軸を中心とした回転の例が多数あります。ここに 1 つがあります: http://paulbourke.net/geometry/rotate/

もう 1 つの方法は、ローカル変換を使用してスケルトンを再解釈することです。つまり、新しいボーンはそれぞれ、その親ボーンのワールド スペースから変換されます。これは、ローカル回転に基づいてスケルトンのポーズを設定するだけのフォワード キネマティクス (FK) に役立ちます。ほとんどのモーション キャプチャ データは、この方法で保存されます。各ジョイントのワールド座標を計算するには、すべてのローカル マトリックスを階層の上で乗算する必要があります。

現在、ワールド空間にスケルトン ジョイントの位置しかない場合、各ジョイントのローカル マトリックスを必ずしも知っているとは限らないため、ローカル変換マトリックスを生成するのは面倒です。これはより大きなトピックです。何年も前に、CAT と呼ばれる 3dsmax プラグインのモーション キャプチャ リターゲット モジュールに取り組んだときに、これを行いました。

BVH と HTR という 2 つの一般的な形式を使用しました。記憶によると、BVH はグローバル ポジションを使用しますが (これは面倒です)、HTR はローカル ジョイント マトリックスを使用し、インポートがはるかに簡単です。

于 2013-03-02T21:06:39.237 に答える