| P3Dファイルヘッダ | TP3DHeader |
| パーツ情報 | TP3DPart |
| ポーズ情報 | TP3DPose |
| モーション情報 | TP3DMotion |
TP3DHeader = record Signature:String; //バージョン(本モジュールでは未使用) ROKFileName:String; //読み込むべきROKファイル Optimize:Boolean; //最適化フラグ(本モジュールでは未使用) Erase3Face:Boolean; //三面消去フラグ(本モジュールでは未使用) Smoothing:Boolean; //スムージングフラグ SmoothingAngle:Single; //スムージング角度 Origin:D3Dvector; //原点(本モジュールでは未使用) PartCount:Integer; //パーツ数 ScaleFactor:Single; //スケールファクタ end;
P3Dデータ全体についての情報を定義します
TP3DPart = record ID:Integer; //パーツID GroupIndex:Array[0..3] of Integer; //形状データとして使用するROKファイル内のグループ番号 GroupCount:Integer; //形状データとして使用するROKファイル内のグループ数(↑から生成) SymmetryStatus:Integer; //対称性についてのフラグ(本モジュールでは未使用) Position:D3DVector; //標準姿勢での位置 Orientation:TQuaternion; //標準姿勢 ParentID:Integer; //親パーツのID(-1で無し) SymmetryID:Integer; //対称パーツのID(-1で無し) Name:String; //パーツ名 end;
人体モデルを構成する個々のパーツ(ボーン)を定義します
TP3DPose = record Name:String; //ポーズ名 PartCount:Integer; //使用するパーツの数 Position:D3DVector; //親無しパーツの位置 Orientations:Array of TQuaternion; //各パーツの姿勢 end;
1つのポーズを定義します。ポーズは、各パーツの位置・姿勢によって定義されます。
TP3DMotion = record Name:String; //モーション名 PartCount:Integer; //使用するパーツの数…多分、TP3DHeaderのPartCountと同じ FrameCount:Integer; //キーフレーム数 RepeatFlag:Boolean; //繰り返しフラグ Interval:Single; //周期[秒] Poses:Array of TP3DPose; //各キーフレーム毎のポーズ //以下は内部での計算用 //モーションのDFT係数(時間軸にキーフレーム数を取って、各キーフレームにおける位置 DFTp:Array of D3DVector; //DTFq[i,j]...DTFq[i,x]はi番目のパーツのDFT係数 DFTq:Array of Array of TQuaternion; //姿勢について、最初のフレームと最後のフレームで内積がゼロ以上である(DFTの方法を少し変える必要アリ) fDFTq:Array of Boolean; end;
1つのモーションを定義します。
モーションは複数の「キーフレームにおけるポーズ」、および、モーションの周期によって定義されます。