さんざん悩んだ末に決めたデータ型が、
struct Frame{
struct{
long x1;
long y1;
long z1;
struct{
long x;
long y;
long z;
} Euler;
} Local;
struct{
long x0;
long y0;
long z0;
long x1;
long y1;
long z1;
struct{
long x;
long y;
long z;
} Euler;
} Global;
struct Frame *PreviousFrame;
};
てな感じの自己参照的構造体。
基本的に、始点が(x0,y0,z0)で終点が(x1,y1,z1)になっている。Localに(x0,y0,z0)が無いのは、ローカル座標の原点は(0,0,0)に決めているから。
これを、
struct Frame *Head, *Trunk
でポインタ宣言をして、
Head = ( struct Frame * )malloc( sizeof( struct Frame ) );
Trunk = ( struct Frame * )malloc( sizeof( struct Frame ) );
でメモリ領域を確保して、
Head->PreviousFrame = Trunk;
でデータのリンク構造を設定する。
任意の骨格のグローバル始点は、その前の骨格(Previous Frame)のグローバル終点な訳だから、
Head->Global.x0 = Head->PreviousFrame->Global.x1;
Head->Global.y0 = Head->PreviousFrame->Global.y1;
Head->Global.z0 = Head->PreviousFrame->Global.z1;
とすればいい。
うーん、かっこいい。我ながら、イカしたデータ構造だぜ(自己陶酔モード)。
ま、この構造でどうにもならなくなった場合はその時に考えなおすとして(^_^;、とりあえずはこの方針ですすめて行くことにしよう。
個々の骨格の名称は、右図の通り。
Right * な骨格は、そのままLeft * になる。
ちなみにこの名称は、英和辞書と和英辞書を片手にてきとーに決めた物なので、本当に正しいという保証はまるで無い。特に、Buttock、Trunkあたりが怪しい(^_^;。
あ、Navel(へそ)は骨格じゃないです。これが全ての原点。この、骨格野郎の命の源となる点です。