9

私は自分のopenGLフレームワークを展開している最中で、3Dオブジェクトの描画方法を知っています...など...

しかし、関節を持つ可能性のある 3D オブジェクト間の関係をどのように定義するのでしょうか? または、3D オブジェクトを「骨」としてどのように定義しますか? 良いリソースはありますか?

4

2 に答える 2

11

OpenGL は単なるグラフィック ライブラリであり、3D モデリング フレームワークではないため、「ボーン」を定義して使用するタスクはユーザーに委ねられます。

実際に実装するにはさまざまな方法がありますが、一般的な考え方は次のとおりです。

モデルの各パーツをボーンとして扱います (例: 頭、胴体、下肢、上肢など)。
各ボーンには、接続されている親があります (たとえば、左下脚の親は左上脚です)。
したがって、各ボーンには多数の子があります。

ここに画像の説明を入力

ここで、各ボーンの位置を親ボーンに対する相対位置として定義します。ボーンを表示するとき、その相対位置を親ボーンの相対位置で乗算して絶対位置を取得します。

視覚化する:
人形と考えてください。人形の腕をつかんで動かしても、手の相対位置 (および回転) は変わりません。親の 1 つを移動したため、その絶対位置は変わります。

骨格アニメーションを試したとき、私はこのリンクからほとんどを学びました: http://content.gpwiki.org/index.php/OpenGL:Tutorials:Basic_Bones_System

于 2012-12-25T13:27:41.450 に答える
8

しかし、関節を持つ可能性のある 3D オブジェクト間の関係をどのように定義するのでしょうか?

OpenGL はこれらのことを気にしません。私は純粋な描画 API ではありません。したがって、創造性を解き放ち、そのような構造を自分で定義するのはあなた次第です。スケルタル アニメーションへの通常のアプローチは、ボーン/リグ システムを使用することです。各ボーンには方向 (クォータニオンまたは 3 × 3 マトリックスで表される)、長さ、それにさらに接続されたボーンのリスト (つまり、ある種のツリー) があります。

この構造を次のように定義します

typedef float quaternion[4];

struct Bone {
    quaternion orientation;
          float length;

            int  n_subbones;
           Bone *subbones;
};

それに加えて、リグの開始位置からのピボットが必要です。私はこのようにします

typedef float vec3[3];

struct GeomObjectBase {
           vec3 position;
    quaternion orientation;
};

struct BoneRig {
    struct GeomObjectBase gob;

    struct Bone pivot_bone;
}

次に、モデル メッシュに適用できるように、この構造を反復処理し、そこからマトリックス パレットを生成する関数が必要です。

注:私はfreeglutを使用しています

まったく無関係

于 2012-12-25T13:23:47.363 に答える