私は自分のopenGLフレームワークを展開している最中で、3Dオブジェクトの描画方法を知っています...など...
しかし、関節を持つ可能性のある 3D オブジェクト間の関係をどのように定義するのでしょうか? または、3D オブジェクトを「骨」としてどのように定義しますか? 良いリソースはありますか?
私は自分のopenGLフレームワークを展開している最中で、3Dオブジェクトの描画方法を知っています...など...
しかし、関節を持つ可能性のある 3D オブジェクト間の関係をどのように定義するのでしょうか? または、3D オブジェクトを「骨」としてどのように定義しますか? 良いリソースはありますか?
OpenGL は単なるグラフィック ライブラリであり、3D モデリング フレームワークではないため、「ボーン」を定義して使用するタスクはユーザーに委ねられます。
実際に実装するにはさまざまな方法がありますが、一般的な考え方は次のとおりです。
モデルの各パーツをボーンとして扱います (例: 頭、胴体、下肢、上肢など)。
各ボーンには、接続されている親があります (たとえば、左下脚の親は左上脚です)。
したがって、各ボーンには多数の子があります。
ここで、各ボーンの位置を親ボーンに対する相対位置として定義します。ボーンを表示するとき、その相対位置を親ボーンの相対位置で乗算して絶対位置を取得します。
視覚化する:
人形と考えてください。人形の腕をつかんで動かしても、手の相対位置 (および回転) は変わりません。親の 1 つを移動したため、その絶対位置は変わります。
骨格アニメーションを試したとき、私はこのリンクからほとんどを学びました: http://content.gpwiki.org/index.php/OpenGL:Tutorials:Basic_Bones_System
しかし、関節を持つ可能性のある 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を使用しています
まったく無関係