****************************************************************

	libmt.txt

	mgs2/source/system/libmt 以下に対する説明

	2001/11/26 K.Takabe
	$Id: libmt.txt,v 1.1.1.3 2002/11/19 11:42:51 Yoshizawa1 Exp $

****************************************************************

●system/libmt/以下についての説明

<actseq.c>
シーケンスデータ再生処理関連
汎用シーケンスデータの再生処理ルーチン及びＳＥＶ（ＳＥイベント）データ専用
再生処理を行う。

<faceanim.c>
フェイスモーション管理ルーチン
専用ツールで作成した。フェイスアニメーションデータの再生処理を行う。
このフェイスアニメーションは静止モーション間のキーフレームベース
アニメーションで実現されている。

<facepack.c>
圧縮型固定モーションパックデータ管理ルーチン
何に使っていたか忘れました。

<hermite.c>
エルミート補間関数
用途に応じたいくつかのバリエーションがある。

<ik_sys.c>
インバースキネマティクス基本ルーチン
ＩＫ用補助ルーチンであるが、使い方自体が複雑な上、今のＭＧＳ２システムでは
モーション管理方式の関係で使うにはかなり特殊な構成でプログラムを設計する必要有り。

<mar_load.c>
モーション読み込み＆初期化ルーチン
モーション圧縮ファイル(.mar)及びシーケンスデータ(.sar)、フェイスアニメーションデータ(.far)用の
データ読み込み時のセットアップルーチン。

<math_utl.c>
計算補助ルーチン
４つ同時系sin,cos,atan2がある。

<motion.c>
モーション管理ルーチン
モーション再生のコア部分。かなり入り組んでいて複雑になっている。

<mt3_dec.c>
ｍｔ３ファイルモーションデータ再生ルーチン（デバッグ用のため現在未使用）

<mt3_util.c>
ｍｔ３ファイルモーションデータ再生補助ルーチン（デバッグ用のため現在未使用）

<mt_effct.c>
モーション加工ユーティリティ
モーション管理ルーチン(motion.c)から呼ばれ、モーションデータの左右反転を行う。

<quat.c>
クォータニオン処理ルーチン
比較的良く使うものを集めたもの。一部はＰＳ２用に最適化してあるので注意。

<quat2.c>
クォータニオン処理ルーチン
上のquat.cの内容を含むがコメントアウトされている。クォータニオン関係のルーチンを
大体いれてあるので、移植の際にはこちらを参照したほうがよい。

<quat3.c>
クォータニオン処理ルーチン（ＩＫ関連のための追加）
オイラー角指定からクォータニオンやその逆の変換を行う関数を用意。

<se_exchg.c>
シーケンスデータ再生処理関連
モーションに貼り付けたＳＥＶデータに設定されているＳＥを状況によって別のＳＥに差し替える
ためのデータを管理する。シーケンスデータ再生処理(actseq.c)から呼ばれる。



●モーションデータについて
ＭＧＳ２ではモーションデータは以下の手順を通してゲーム中で使用するための.marに
変換される。

.mot（ＳＩから吐かれたＶＲＳ形式モーションデータ）

↓変換←.mdl（ＳＩから吐かれたＶＲＳ形式モデルデータ）

.mtn（純粋な移動量、関節回転量、関節オフセット量により構成されたベタ形式モーションデータ）

↓変換（圧縮）

.mt3（ＭＧＳ２用圧縮モーションデータ形式）

↓複数の.mt3をまとめてアーカイブ

.mar（実機で読み込む複数のモーションをまとめたアーカイブファイル）



●ＭＴＮ形式について
ＭＴＮはヘッダーとデータという単純な構成になっており、各データは３２ビット浮動小数点形式で
ベタで格納されている。（１ベクトル１６バイト）

＜ヘッダー＞

＜移動量データ＞（１ベクトル×（全フレーム数＋１））
＜関節回転量データ＞（１ベクトル×（全フレーム数＋１）×関節数）
＜関節オフセット量データ＞（１ベクトル×（全フレーム数＋１）×関節数）

＜移動量圧縮用キー情報データ＞（１ベクトル×（全フレーム数＋１））
＜関節データ圧縮用キー情報データ＞（１ベクトル×（全フレーム数＋１）×関節数）

キー情報データとはキーフレーム圧縮時に使用するユーザー定義キー情報や、
関節固定情報などが入っている。



●ＭＴ３形式について
ＭＴ３とはＭＴＮを特別な形式で圧縮した形式で以下のものが格納されている。
・移動量データ
・軌跡トレースデータ
・関節回転量データ
・関節オフセット量データ（特殊なフラグを立てた場合のみ）
・関節固定情報データ
基本的にはＭＴＮと同様な情報が入っているが、補助的なものやゲームに必要なデータが
追加された形になっている。また、キーフレームにより圧縮されているため、モーションデータの
任意のフレームでのモーションを取り出すのが難しい。
また、全てのデータは１つの１６ビットデータパックのなかに全て埋め込まれる形になっており、
各データの先頭位置はヘッダーに記録されているオフセットから読み出すことができる。



●ＭＧＳ２モーション再生システムの特徴について

・データの持ち方の方針について
　基本的にＺ＋方向を前と見なし、相対的なアニメーションで記録する。再生時にはコントロールでの
　座標、方向制御に応じた位置、角度における相対的なアニメーションを行う。

・任意の関節に対して座標を強制的に固定させる機能
　但し同一フレームで１箇所のみで、指定はＡｃｔＧｕｙで指定する。再生時に指定した関節が
　同一座標にとどまるように中心位置の移動に対して補正を入れる。実際にはＸＺ座標方向にのみ
　補正をかける。但し、実際にはほとんど使われていない（処理も重たい）

・コントロールに対する回転方向補正機能
　モーションによって後ろを振り向くような場合上のデータの持ち方の方針からすると、矛盾が
　発生してしまう（Ｚ＋方向を前として見なせなくなるため）。そこでＡｃｔＧｕｙにてフラグを
　立てることで、モーションの再セット時にその時点での腰の関節の方向を元にコントロールでの
　方向補正量を計算させることが出来る。

・モーションデータの左右反転
　特定の構造を持ったキャラクタ用（人型・ＲＡＹなど）に対してはモーションの左右を入れ替える
　機能を使うことが出来る。実際には上半身下半身の左右反転を別々に指定することができる。

・移動軌跡のトレースデータ
　中心移動の細かいブレなどがトラップや壁に対して影響を受けると問題が発生することがあるため、
　モーションに対して通常の移動量とは別に任意に設定されたキー間を直線補間することによって
　得られる移動量を取得することができる。この任意のキーの情報はＡｃｔＧｕｙにて指定する。
　基本的に任意のキーを設定しない場合にはモーションの始点と終点がそれぞれキーになるため
　元の座標に戻るようなモーションの場合には、この移動軌跡が一切動かないことになる。



●モーションの圧縮について
基本的には圧縮条件などから自動でキーを入れて圧縮される。しかし、場合によっては
自動で設定したキーなどが不具合があったり、モーションにフラグなどを追加したい場合が
出てくるため、自動圧縮前にWIndows用の圧縮調整専用ツール「ＡｃｔＧｕｙ」を使うことで
若干の修正を入れることができる。

ＡｃｔＧｕｙで修正されたデータはユーザーで設定したキーと設定された圧縮条件（誤差の許容量の指定）
によって自動的にキーを追加することで圧縮を行う。
キーの追加条件は、その時点で一番大きな誤差を出している部分にキーを入れ、その後
再圧縮をした後に、また一番大きい誤差を出す位置にキーを入れるという作業を繰り返し、
最終的に一番大きな誤差が指定した許容誤差を下回ったときに圧縮を打ち切るという手法を
取っている。

＜座標データの圧縮について＞
各キーに対して座標データは座標位置（ＸＹＺ）と速度ベクトル（ＸＹＺ）を記録し、その間を
エルミート補間することでデータを圧縮している。各座標ベクトルは１６ビット浮動小数点を
採用しているので、値が大きくなればなるほど誤差が発生しやすくなるので注意が必要。

＜回転データの圧縮について＞
各キーに対して回転データはそのキーでの回転クォータニオン（ＸＹＺＷ）と補間用のクォータニオン
（ＸＹＺＷ）を記録し、キーの間を四角形補間(Squad)することで圧縮している。

基本的に回転量も移動量もキーフレームと２次補間によって圧縮する為、補助ベクトルが必要になり
キーが多いと著しく圧縮率が落ちてしまうので注意が必要。


●モーション再生について
モーション再生は圧縮されたモーションを展開するためのMT_ActMotion()関数と
（展開によって求められた移動量などがGM_ActContorol()で処理されることを前提としている）
GM_ActControl()でキャラクタの表示位置が求まった後で実際に関節の回転状態などを
モデルに反映させるためのMG_ActMotion2()関数またはMT_EvmActMotion()関数を呼ぶという手順を
踏む必要がある。

●MT_ActMotion()関数の流れについて
この関数はモーション再生をする一番メインになる処理であり、各レイヤーのモーション再生の他に
オーバーレイによるモーションの合成や左右反転、それにモーション切り替え時の補間処理などを
おこなう。大まか流れは以下のようになっている。

１）現在のワークの状態から現在のフレームでの各関節の回転量を算出
２）モーション再生を進ませる（ワーク内でのみ）
３）関節移動量を取り出す
４）関節の回転量を親からの相対回転からルートからの絶対回転量に変換
５）必要であればモーションの左右反転処理
６）補間処理
７）ステップ値の計算処理
８）回転量の書き出し
９）関節固定化処理

実際に圧縮された各データの展開は２番のモーション再生を進ませる処理で行われる。


●再生によって得られる情報について
ＭＧＳ２のモーション再生では以下の情報を取得することが出来る。

・中心の移動量及び高さ
　モーションデータ内では純粋に中心位置の座標のみが記録されるようになっているが
　ゲームのシステムに合わせてモーション再生処理では前回からの移動量差分（実際には
　前フレームでのオブジェクトの向きに応じて回転などの処理が行われる）のＸ座標成分
　及びＺ座標成分がＶＸ、ＶＺに、Ｙ座標成分はＶＷに入れられる。ＶＹは必ず０になる。
　これは、ＭＧＳ２システムでは高さには移動量を使わずに床からの高さで処理する仕様に
　なっているためである。中心位置の高さに関しては別途ハイト変数に入れられる。

・関節の回転量
　これは純粋に展開された後にモーションに割り当てやすくするためルートから相対回転
　（一応再生的には絶対回転ということになっている）として展開される。
　実際にモデルに割り当てるためにはコントロールの向きに応じて回転補正をかける必要がある。

・関節のオフセット量
　これは、ＡｃｔＧｕｙにて関節移動量を有効にするフラグをつけた場合にだけデータとして
　記録される。それ以外の場合には常に０となる。

・中心の移動軌跡の移動量及び高さ
　データ的にはまったく異なる物であるが基本的には得られるデータは中心の移動量及び高さと
　同一のものである。



●モーション貼り付けＳＥについて
　データの作成にはWindows用の専用ＳＥ貼り付けツールを使用する。このツールで作られる
　データは.mtnのモーションと１体１で対応するもので、.sevという拡張子を持つテキスト
　形式のデータになっている。実際にゲームで使用されるデータは.marファイルを作成するときに
　.marを同じ順番になるように複数の.sevをアーカイブして.sarファイルを作成し、これを使用する。
　こうすることでモーション再生のオペレーションに同期して適切なＳＥを鳴らすことが出来る。
　データ自体はＳＥをどのタイミングでどの関節番号につけて鳴らすかが記録されており、
　モーション再生に同期して処理するようになっている。
　また、ＳＥはシナリオからの指定により壁や床属性に応じて８種類の鳴り分けを指定することが出来る。


●ＳＥＶファイルについて
　.sevファイルはテキストで書かれており、基本的なＳＥの情報（最終的にコードに変換される）と
　フレーム及びその.sevファイル内で定義したＳＥのインデックス番号というペアの数字で
　ＳＥの発音を記録する形になっている。
　このファイル内でのＳＥは名前で定義されており、最終的に.sarにアーカイブされる段階で
　ゲーム中で使用するＳＥコードに変換される。


●モーション貼り付け用データのＳＥコードについて
　ＳＥコードは全てユニークなものがつけられており、mgs2/list/default.sls及び
　mgs2/module/inc_se/se_define.hの内容に従って.sev内のＳＥ名からゲーム中で使用する為の
　ＳＥコードに変換される。
　mgs2/list/default.slsの中には常駐ＳＥデータに対するＳＥネームからＳＥコードへの変換情報
　mgs2/module/inc_se/se_define.hの中には非常中ＳＥデータに対する変換情報が入っている。



