OJPファイルはBrightObjectでつけたボーンとアニメーションを保存するファイルです。
TLOファイルの頂点と法線、ジョイント(関節)データ、線形アニメーション用キーフレームの頂点と法線を持ちます。
TLOファイルの頂点と法線は[TLO FILE DATA]句、ジョイントデータは[JOINTDATA]句と[JOINTRERATION]句、
線形アニメーション用キーフレームデータは[ANIMATIONDATA]句で持つように分かれています。
○[MODEL FILE DATA]句
この句ではTLOファイル名とOJPファイルに保存した時のオブジェクトの姿勢を持ちます。
例)
[MODEL FILE DATA]
MODEL_FILENAME robot_tex.obj
SUB_MODEL_FILENAME accessory.obj
mtlstart
nor 0 0 1
vec -0.192551 1.24112 0.075
nor 0 0 1
vec -0.042551 1.24112 0.075
nor 0 0 1
・
・
mtlstart → ここからは別のマテリアル属性が適用される
・
・
nor -0.008079 -0.007069 0.999942
vec 0.075154 1.02946 0.0915
→この頂点はJoint0_1という名前のジョイントから影響度0.4を受け、
Joint0_1_0という名前のジョイントから影響度0.6を受ける
verJnm Joint0_1
verInf 0.4
verJnm Joint0_1_0
verInf 0.6
・
・
nor 0.0233266 -0.0328778 0.999187
vec -0.289257 1.28103 0.0952998 →この頂点はJoint0_0という名前のジョイントから影響度1.0を受ける
verJnm Joint0_0
verInf 1
・
・
・
|
【MODEL_FILENAME】
[MODEL FILE DATA]の後に「MODEL_FILENAME」が続きます。
ここには使用しているobjファイル名が書かれます。
BrightObjectではOJPを読むときに、ここに書かれたobjファイルを読みます。
【SUB_MODEL_FILENAME】
2011/09/10追加。
OJPファイルに、「ファイルを追加する」で追加したobjファイル名を保存するようにしました。
「SUB_MODEL_FILENAME ファイル名」で指定されているobjファイル名が追加されたオブジェクトです。
このOJPファイルを開く際、「SUB_MODEL_FILENAME」があったらそのobjファイルも開くようになっています。
開くファイルパスはOJPファイルと同じ場所となってますので、
「ファイルを追加する」で指定したobjファイルと、そのobjに付随するmtl/bmpファイルを
OJPファイルと同じ場所に配置してください。
【mtlstart】
MTLファイルで適用されるマテリアル属性の区切り文字です。
[mtlstart]から次の[mtlstart]までに書かれている頂点[vec]と法線[nor]に対して1つのマテリアル属性が与えられます。
どのマテリアル属性が与えられるのかはTLOファイル内のusemtlが出てくる順序と同じです。
【nor】
OJPファイルに保存された時に描画されていたオブジェクトの法線ベクトルデータです。
次の行に書かれている[vec]に対しての法線ベクトルです。
左から、X Y Z を表します。
【vec】
OJPファイルに保存された時に描画されていたオブジェクトの頂点データです。
左から、X Y Z を表します。
【verJnm】
頂点が影響されるジョイント(関節)の名前です。
影響を受けるジョイントが無い場合は省略されます。
複数のジョイントから影響を受ける場合、[verInf]の下に再度[verJnm]が書かれます。
【verInf】
1つ上の行に書かれたverJnmがジョイントに与える影響度(重み)です。
影響度は0〜1.0の範囲です。
[verJnm]が無い場合は省略されます。
○[JOINTDATA]句
ジョイント(関節)のデータです。
次の関節までの距離(ボーンの長さ)など、ボーンのデータもここでまとめて持ちます。
例)
[JOINTDATA]
jointID 9
jointName Joint0_4_0
validJoint 1
position -0.00928185 0.429267 -0.0706523
xVector 0.0093339 0.589648 0.110483
yVector -0.589648 0.0093339 0
parent_xVector -0.0213306 0.9865 -0.162366
parent_yVector -0.9865 -0.0213306 0
pTOc_Quaternion 0.984703 -0.173264 -0.000816424 0.018436
rotationJointQuaternion 1 0 0 -0
drawRotationJointQuaternion 0.987775 0.146442 0.00759368 -0.0528993
initPoseBoneVector 0.00933389 0.589648 0.110483
drawBoneVector -0.0543984 0.593928 -0.0653333
axisVector -0.939401 -0.0487124 0.339341
drawAxisVector -0.939401 -0.0487124 0.339341
axisAngle 0
jointWorldPosition -0.009045 1.64687 0.0820579
jointDrawPositionAfterPosEnter -0.118386 1.60866 -0.21479
convertWorldToJointCoodQuaternion 0.709584 -0.0653417 0.0654314 -0.698527
ik_rotationJointQuaternion 1 0 0 0
ik_axisVector 0 0 0
ik_jointDrawPosition -0.118386 1.60866 -0.21479
ik_axisAngle 0
ik_Flag 0
ik_stopFlg 0
convertIKtoFK_boneVector -0.0543984 0.593928 -0.0653333
convertIKtoFK_rotationJointQuaternion 0.987775 0.146442 0.00759368 -0.0528993
TreeName Joint0_4_0
|
【jointID】
ジョイントID。
各ジョイントにつけられたシーケンス番号です。
ジョイントの識別の為に使用します。
【jointName】
ジョイント名。
【validJoint】
有効ジョイントフラグです。
[1]の時、ジョイントが有効なものとし、描画されます。
【position】
ジョイントのローカル座標系での位置です。
あるジョイントから生えるボーンの先端を原点と考えた時の、ジョイントの座標です。
基準ジョイント(すべてのジョイントの親ジョイント)では、
[xVector][initPoseBoneVector][jointWorldPosition][jointDrawPositionAfterPosEnter][ik_jointDrawPosition]
が[position]と同値となります。
【xVector】
ジョイントの親座標系から見たときの、ジョイントのX軸です。
各ジョイントのローカル座標系のX軸という意味です。
【yVector】
ジョイントの親座標系から見たときの、ジョイントのY軸です。
[xVector]と同じく、各ジョイントのローカル座標系のY軸という意味です。
【parent_xVector】
[xVector]を子座標系とする親座標系(親ジョイントのローカル座標系)のX軸です。
基準ジョイントではこの値は(1, 0, 0)となります。
【parent_yVector】
[yVector]を子座標系とする親座標系(親ジョイントのローカル座標系)のY軸です。
基準ジョイントではこの値は(0, 1, 0)となります。
【pTOc_Quaternion】
[parent_xVector][parent_yVector]を回転させて[xVector][yVector]にするクオータニオン。
[parent_xVector][parent_yVector]の座標系から[xVector][yVector]の座標系に変換するクオータニオンです。
基準ジョイントの場合はワールド座標系から基準ジョイントのローカル座標系に変換するクオータニオンとなります。
クオータニオンですので、平行移動は含んでいません。
BrightObjectではボーンの回転、頂点の回転移動をさせる時などは、
ボーン(ジョイント)や頂点座標を、ワールド座標系の原点周りに平行移動させてから回転移動をし、
さっきとは逆方向に平行移動をして元の位置に戻す、ということを行っています。
平行移動については回転移動の際に計算しているため、
OJPファイルでは「回転」だけを持ちます。
【rotationJointQuaternion】
ジョイントを、ジョイントの[axisVector](回転軸)を軸に、[axisAngle](角度)分回転させるクォータニオン。
【drawRotationJointQuaternion】
ワールド座標上にあるジョイントを各ジョイント座標系の任意の姿勢に一気に変換するクオータニオン。
基準ジョイントから各子ジョイントまでのクオータニオンrotationJointQuaternionをすべて合成したもの。
FK/IKの両方で回転が自然となるようにするために、実際には、
[rotationJointQuaternion]を基準ジョイントから任意のジョイントまですべて合成したものと、
後に出てくる[convertIKtoFK_rotationJointQuaternion](IKで描画したボーンをFKで描画しなおすために回転させるクオータニオン)を
合成したものを、[drawRotationJointQuaternion]の値としている。
IKをしない場合、[convertIKtoFK_rotationJointQuaternion]の値は合成しても回転に影響が出ないクオータニオン(1, 0, 0, 0)です。
【initPoseBoneVector】
各ジョイントから生えるボーンのローカル座標系での初期姿勢を表すベクトルです。
【drawBoneVector】
描画用のボーンのベクトルです。[initPoseBoneVector]を[drawRotationJointQuaternion]を使って回転させたベクトルを持ちます。
【axisVector】
ボーンの回転軸となるベクトルです。実際のボーンの回転に使用されます。
【drawAxisVector】
ボーンの回転軸を表示させ、回転軸を動かす時に使用するベクトルです。
[axisVector]を、各ジョイントが持つ[rotationJointQuaternion]で、
基準ジョイントから任意のジョイントまでのすべて合成したクオータニオンで回転させたベクトルです。
【axisAngle】
[axisVector]周りでボーンを回転させる角度です。この値は、0.0〜360.0度の範囲です。
【jointWorldPosition】
ジョイントのワールド座標系での位置です。
基準ジョイントの場合、positionと同じ値を持ちます。
基準ジョイント以外は、ジョイントが置かれた時のワールド座標系での位置です。
【jointDrawPositionAfterPosEnter】
BrightObjectで「位置確定」処理後、描画するジョイントのワールド座標系上の位置です。
IK/FKでジョイントを動かす時に、この値を使ってジョイントを描画します。
【convertWorldToJointCoodQuaternion】
位置確定処理の時に、ワールド座標系にあるジョイントを各ジョイント座標系に一気に変換するクオータニオン。
位置確定処理以外では、回転軸avの描画をするときに使用しています。
【ik_rotationJointQuaternion】
IK用の回転クオータニオン。
IKでジョイントを回転させる時に使用します。
【ik_axisVector】
IK用の回転軸ベクトル。
IKでジョイントを回転させる時はこの軸周りで回転します。
【ik_jointDrawPosition】
IKでジョイントを描画する位置。
【ik_axisAngle】
IKでジョイントを回転する時の角度。
【ik_Flag】
ジョイントをIKで計算するかどうか決めるフラグ。
"1"の時にこのジョイントをIKで計算する。
【ik_stopFlg】
ジョイントのIKの伝達を止めるフラグ。
[1]を設定されたジョイントより親ジョイントにはIKの動きが伝達されません。
【convertIKtoFK_boneVector】
IKで描画されたボーンをFKで描画しなおす為に使用するボーンベクトル。
この値はIKで回転した時のボーンベクトルです。
【convertIKtoFK_rotationJointQuaternion】
IKで描画されたボーンをFKで描画しなおす為に使用するクオータニオン。
この値はIKで回転させる前のボーンを、IKで回転させた後のボーンに合わせるためのクオータニオンです。
この時の[drawRotationJointQuaternion]は、
「[convertIKtoFK_boneVector]」と「[rotationJointQuaternion]を基準ジョイントから任意のジョイントまですべて合成したもの」
を合成したクオータニオンです。
【TreeName】
BoneTreeWindowに表示するジョイント名です。
ジョイント名はBrightObjectでジョイントに名前をつける事ができます。
つけられた名前はBoneTreeWindowに表示されます。
名前を指定しない場合は[jointName]と同じ文字列となります。
○[JOINTRERATION]句
ジョイント親子関係を表す部分です。
例)[JOINTRERATION]とBrightObjectのBoneTreeWindowの表示との比較
[JOINTRERATION]
[JOINTRERATION]
relation Joint0
[down]
relation Joint0_0
[down]
relation Joint0_0_0
[down]
relation Joint0_0_0_0
[down]
[up]
[up]
[up]
relation Joint0_1
[down]
relation Joint0_1_0
[down]
relation Joint0_1_0_0
[down]
[up]
[up]
[up]
relation Joint0_2
[down]
relation Joint0_2_0
[down]
relation Joint0_2_0_0
[down]
[up]
[up]
[up]
relation Joint0_3
[down]
relation Joint0_3_0
[down]
relation Joint0_3_0_0
[down]
[up]
[up]
[up]
relation Joint0_4
[down]
[up]
[up]
do_skinning 1
decJP 1
|
|
【relation】
ジョイント名を指定します。
ジョイントの名前を使って親子関係を結びます。
【[down]】
直前の[relation]に対する子ジョイントの階層に進みます。
【[up]】
現在の階層より1つ親ジョイントの階層に進みます。
例と図を比べてわかるように、[relation]/[[down]]/[[up]]の3つでジョイントの親子関係を表します。
【do_skinning】
スキニング処理の有効フラグです。
[1]の時にBrightObjectでスキニング(ワンスキン)処理を行います。
【decJP】
位置確定処理がされたかどうかのフラグです。
[0]は位置確定処理前、[1]は位置確定処理後です。
○[ANIMATIONDATA]句
ボーンのキーフレームアニメーションに必要なデータが書かれています。
例)
[ANIMATIONDATA]
keyframe
kf_jointID 1
kf_boneVector -0.00909709 0.627959 0.0422271
kf_drawBoneVector 0 0 0
kf_position -0.00909708 0.627959 0.0422271
kf_jointName Joint0
kf_axisVector -0.999895 -0.0144852 0
kf_drawAxisVector 0 0 0
kf_axisAngle 0
kf_rotationJointQuaternion 1 0 0 0
kf_rotationJointQuaternionIKtoFK 1 0 0 0
kf_drawRotationJointQuaternion 1 0 0 0
kf_drawRotationJointQuaternionRot 1 0 0 0
kf_rotationJointQuaternionAnime 1 0 0 0
kf_endFrameAngle 0
kf_hokanMode 0
kf_speed 0 0
kf_positionAnime 0 0 0
kf_jointID 2
・
・
・
frameNumber 1
frameTime 0
keyflame
・
・
・
backupBasicBoneVec 0.00906961 -0.00907337 0.0632395
|
【keyflame】
1つのキーフレームデータの開始である事を示します。
次の[keyflame]が出てくるまでを1つのキーフレームデータとして扱います。
【kf_jointID】
ジョイントID。
各ジョイントにつけられたシーケンス番号です。ジョイントの識別の為に使用します。
【kf_boneVector】
各ジョイントから生えるボーンのローカル座標系での姿勢を表すベクトルです。
【kf_drawBoneVector】
キーフレームのボーンを描画する時に使用するベクトルです。
【kf_position】
ジョイントのローカル座標系での位置です。
ただし基準ジョイントはワールド座標系の位置となります。
【kf_jointName】
ジョイント名。
【kf_axisVector】
ボーンの回転軸となるベクトルです。
【kf_drawAxisVector】
表示用のボーンの回転軸。回転軸を編集する時に使用します。
【kf_axisAngle】
kf_axisVector周りでボーンを回転させる角度です。この値は、0〜360度の範囲です。
【kf_rotationJointQuaternion】
ジョイントを、[kf_axisVector](回転軸)を軸に、[kf_axisAngle](角度)分回転させるクォータニオン。
【kf_rotationJointQuaternionIKtoFK】
IKでの描画をFKで描画したときに、FKの姿勢をIKの姿勢に合わせるための回転クオータニオン。
【kf_drawRotationJointQuaternion】
ワールド座標上にあるジョイントを各ジョイント座標系の任意の姿勢に一気に変換するクオータニオン。
[kf_rotationJointQuaternionIKtoFK]や[kf_drawRotationJointQuaternionRot]の回転も含まれます。
【kf_drawRotationJointQuaternionRot】
[kf_rotationJointQuaternion]だけを元となるジョイントから各ジョイントまで合成した回転クオータニオン。
【kf_rotationJointQuaternionAnime】
ジョイントを、[kf_axisVector](回転軸)を軸に、[kf_endFrameAngle](角度)分回転させるクォータニオン。
アニメーション中に作成されます。
【kf_endFrameAngle】
キーフレーム間の角度の終点。
0度から補完し、この角度になるのはキーフレーム間のアニメーション処理の終了時です。
【kf_hokanMode】
補間方法。[0]なら線形補間、[1]ならHermite補間となります。
【kf_speed】
補間方法で指定する「開始地点での速度」「終了地点での速度」です。
【kf_positionAnime】
このキーフレームでの基準ジョイントの位置です。
【frameNumber】
このキーフレームにつけられた番号です。キーフレームの識別に使ってます。
【frameTime】
このキーフレームの姿勢になるまでにかかる時間です。
【backupBasicBoneVec】
基準ジョイント位置のバックアップデータです。
「基準ジョイントの移動」で基準ジョイントを動かした後にFK/IKでジョイントを操作すると、
オブジェクトに入っているボーンの位置がおかしくなるのを防ぐために使用します。
「基準ジョイントの移動」を行っていない場合は書かれません。
BrightObjectではキーフレームアニメーションが可能です。
キーフレーム間を補間する方法は「線形補間」「Hermite補間」を選択できます。
|