原題 : ArmA: How to animate a model
原文 : http://community.bistudio.com/wiki/ArmA:_How_to_animate_a_model
翻訳時期 : 2009 Feb.
1 Introduction(はじめに)
注意 : この項では、あなたのモデル(例えば車輪、ローター等)のアニメーションさせたいパーツの作り方について述べています。この項で得られる情報のすべてが正しいわけではありません。書いたことの全ては、自分の経験がベースになっていまして、これはBISによって確認されているわけでもなく、ドキュメントがあったわけでもありません。
モデルをアニメーションさせることは、cfgModelsクラスとcfgSkeletonsクラスの両方の使用が必要になります。
cfgSkeletonsクラスは、ビークルのボーンを定義します。ボーンというものは、あってもなくても、モデルのセレクションがアニメーションします。
cfgModelsクラスは、OFPのcfgModelsクラスを拡張したバージョンとなっています。 setObjectTextureのコマンドと一緒に、アニメーションさせたいまたは使用したいモデルのセレクションを定義します。しかしArmAからは、あなたのモデルの中で、アニメーションを関連付けた全てを置く入れ込む必要があります。
モデルの準備 : 追加するセレクションのすぐ近くに(OFPの時と同じですが、ArmAのボーンセレクションはオーバーラップできません)名称がつけられた次のプロパティを最初のLODに追加する必要があります。(Alt+Pキーを押して、 Named Propertiesのウインドウを開いてください)
property name: autocenter
value: 0
もしあなたのモデルがGeometry LODを使っているならば、Geometry LODにも同様に設定する必要があります。これは斧のアニメでエンジンが停止するプロパティです。
もしあなたがこんなバグに遭遇した時、あなたの武器のボーンがばらばらに落ちた後にあなたがそれを地面に捨てる理由は、GeometryまたはView、pilot LODsが欠けていたからかもしれません。
2 model.cfg
モデル・コンフィグの項によると、cfgSkeletonsとcfgModelsの両クラスは、アドオンのPBOファイル内に置いた model.cfgのファイルに置くべきだそうです。しかしながら、model.cfgを使用しようとするならば、あなたは毎回バイナライズしなくてはならなくなります。でないとあなたのアニメーションは動作しないでしょう。
次の選択肢として、cfgSkeletonsとcfgModelsの両クラスをあなたのアドオンのconfig.cppに追加する方法があります。この方法は、アドオンのバイナライズを必要としません。テストした限りは完璧に動作しています。しかしながら最初のメソッドは準備することであり、あなたのアドオンをリリースする時に使うようにすべきなのです。
3 cfgSkeletons
cfgSkeletonsクラスの定義について説明する前に、ビークル、乗物のボーン(アニメーションするセレクション)について説明します。
各スケルトンは、cfgSkeletonsクラスの中にサブクラスがあり、3つのパラメーターによって構成されています。
パラメータ | 説明 |
---|---|
isDiscrete | 現在のところ不明。1をセット |
skeletonInherit | 与えられたクラスからボーンを継承 |
skeletonBones[] | あなたが有するボーンをここに定義 |
3.1 Defining a bone(ボーンの定義)
ボーンは、skeletonBonesの中で定義されます、並び換えされてないリストで成り立っている[]の配列です。それぞれのボーンは、あなたがアニメーションさせたいセレクションの名前がつきます。
3.1.1 単一のボーン
ボーンは、2つの記号列を使用して定義します:
“bone”,””
それらと一緒の記号列によって複数のボーンを定義できるかもしれません。
注意:エラーを引き起こすので、2番目の記号列を残してはいけません。(linked bonesの所に2番目の記号列の論拠に関する詳しい情報があります)
3.1.1.1 例文
skeletonBones[]=
{
"bone1","", // bone1の定義
"bone2",""// bone2の定義
};
3.1.2 Linked bones(リンクされたボーン)
2番目の論は、2つのボーンのリンク用に使われています。(上の例文の中は空っぽです):
“bone1″,”bone2”
“bone2″の動きに連動する”bone1″のアニメーションを作るためにリンクが使われます。もしあなたが砲塔を事例として考えているなら、ここへのリンクが使えるようにするべきです。なぜならば、砲塔の砲が上昇・下降する動きは砲塔の左右に回転する動きの影響を受ける性質のものだからです:
3.1.2.1 例文
skeletonBones[]=
{
"turret_x","", // ボーンturret_xの定義
"turret_y","turret_x"// ボーンturret_yの定義とボーンturret_xへのリンクを作っている
};
注意:
1行で2つ以上のボーンをリンクさせることはできません!
もしこのようにしたいなら
“bone1″,”bone2″,”bone3”
エラーを引き起こすことになるでしょう。Armed Assaultはこのように解釈します。
- “bone2″へのリンクをする”bone1″の定義
- 2項目にミスする”bone3″の定義
しかしながら、このように構文を書くことで、それを可能にすることができます(まだ試してません):
skeletonBones[]=
{
"bone1","bone2", // "bone2"にリンクするようにした"bone1"の定義
"bone2","bone3", // "bone3"にリンクするようにした"bone2"の定義
"bone3","" // "bone3"の定義
};
結論として、”bone1″は”bone3″にリンクされた”bone2″にリンクされます。
そう”bone1″は、”bone2″と”bone3″の両方の動きに連動するようになるのです。
3.2 cfgSkeletons の例文
class cfgSkeletons
{
class BWMod_Tiger_Skeleton
{
isDiscrete=1;
skeletonInherit="";
skeletonBones[]=
{
"wheelL","",
"wheelR","",
"turret_RMK_x","",
"turret_RMK_y","turret_RMK_x",
"turret_OSIRIS_y","",
"turret_OSIRIS_x","turret_OSIRIS_y"
};
};
};
4 cfgModels
cfgModelsクラスは、setObjectTextureコマンドを介したアクセス、またはアニメーションさせたいモデルのセレクションを宣言するのに使用されます。ArmAからは、cfgModelsクラスはモデルの全てのアニメーションの定義として使用するように拡張されました。
あなたのそれぞれのモデルはcfgModelsクラスの内側にサブクラスを持ち、そしてモデルのファイル名はあなたのクラス(.p3dを除く)の名前として使用されます。たとえばあなたのモデルのp3dが “myVehicle.p3d”だとしたら、あなたのクラスは”class myvehicle {}”となります。この項では、とりあえずこれらを”modelclasses(モデルクラス)”と呼ぶことにしましょう。
それぞれのモデルには、3つのパラメーターによって構成され、あなたのモデルのアニメーションを定義するサブクラスが追加されます:
パラメーター | 説明 |
---|---|
sectionsInherits | 与えられたクラスからセクション(=セレクション)を継承 |
sections[] | ここにあなたのセクションを定義 |
skeletonName | このモデルで使用されたスケルトンのクラス名 |
class Animations {} | あなたのモデルのアニメーションを定義するサブクラス |
4.1 Sections(セクション)
セクションはセレクションと同じことです:アニメーションするもの、またはsetObjectTextureコマンドを介して変化するモデルのパーツ。あなたのモデルクラスにセレクションを定義するためには、[]の配列を使うようにしてください。この配列は、上に示した方法であなたが使いたい全てのセレクションを並び換えされていないリストになります。
4.1.1 例文
sections[]=
{
"mainRotor","mainRotor_static","mainRotor_blur","mainRotor_dive",
"tailRotor","tailRotor_static","tailRotor_blur","tailRotor_dive",
"turret_RMK_x","turret_RMK_y"
};
4.2 Animations(アニメーション)
あなたのモデル用にアニメーションを定義するために、”modelclass”のクラスアニメーションを使うようにする必要があります。それぞれのアニメーションは、ユーザーが定義できる名称と次のパラメーターで構成されるクラスアニメーション内のサブクラスです。
パラメーター | 説明 |
---|---|
type | アニメーションのタイプ。例えば回転、変形など。全てのアニメーションタイプのリストのためにモデルコンフィグを参照する。 |
source | セレクションのアニメのために使われるソース。全てのソースのリストのためにモデルコンフィグを参照する |
selection | アニメーションさせたいボーン(=セクション)の名称。cfgSkeletonsクラスの中に定義を持つ |
axis | 使用したい軸の名称(rotation回転型とtranslation変形型のみ、かならず必要になる) |
memory | AXISを使用する場合、memory LODに設定値1または0の時の位置。もし各LODに軸がある場合は、使用するアニメーションセレクション |
sourceAdress | 車輪のような”ループ”させる場合は”Loop”を使用する。あるいは自動車のハンドルのようにある角度で停止するようなクランプのアニメーションをさせたい場合は、”clamp” を使用する |
minValue | ソースの戻り値が最小値以下であれば、アニメーションは角度0となる |
maxValue | ソースの戻り値が最大値以上であれば、アニメーションは角度1となる |
angle0 | 最小値に達した時にこの角度のセクションはアニメーションを行う |
angle1 | 最大値に達した時にこの角度のセクションはアニメーションを行う |
offset0 | “rotation(回転型)”が使用された時のボーンの距離と戻ってきた最小値。距離は’axis’の頂点位置からの距離が計算される。もし距離が1mだとしたら、offset0 = 1が使用され、ボーンは1m分移動する。もしoffset0 = 0.5を使用した場合、ボーンは0.5m移動するなど。 |
offset1 | offset0 と同じ。ただし戻ってきた最大値の時となる。 |
4.2.1 Attention(注意)
ソースの戻り値は、0から1になる時と、-1から1の時とがあることに注意してください。
- source=”speed”を使用する場合、そのビークルが動いていない時はソースは0で戻ってきます、そしてビークルが最大速度にある時に1が戻ってきます
- source=”drivingWheel”を使用する場合、ビークルが左に転回している時の戻り値は-1です。ビークルが転回していない時は0になり、そして1の時は右回転です
砲塔の場合、砲塔のセレクション名に合致したアニメーションのクラス名が絶対に必要になります。
そう、もしあなたがメインの砲塔のセレクションに”turret_RMK_x”と名付けた時、あなたはクラス名に”turret_RMK_x”と名付けなくてはなりません。マシンガンのセレクションでも同様です。
4.2.2 例文
class mainRotor
{
type="rotationY"; //Y軸に回転
source="rotorH";
selection="mainRotor";
axis=""; //所有する軸なし、セレクションの中心を使用する
memory=1;
sourceAddress="loop";
minValue=0;
maxValue=1;
angle0=0;
angle1="rad -360";
};
4.2.3 Axes(複数軸)
rotationX、rotationY、rotationZ、translationX、translationY、 translationZを使用する時は、軸の話はすこし分かりにくいかもしれません。軸のアレンジをどのようにするべきか、ここでは簡単な画像で説明します。
この画像はこれらの軸の方向を示しているだけで、場所を表しているわけではないことに注意してください。この位置は、いつもアニメーションするセレクションの中心によって常に定義されます。
これは車輪が必要とする”rotationX”型アニメーションによる簡単なサンプルになります
4.3 cfgModels の例文
class cfgModels
{
class bwmod_tiger
{
sectionsInherit="";
sections[]=
{
"mainRotor","mainRotor_static","mainRotor_blur","mainRotor_dive",
"tailRotor","tailRotor_static","tailRotor_blur","tailRotor_dive",
"turret_RMK_x","turret_RMK_y"
};
skeletonName="BWMod_Tiger_Skeleton";
class Animations
{
class mainRotor
{
type="rotationY";
source="rotorH";
selection="mainRotor";
axis="";
memory=1;
sourceAddress="loop";
minValue=0;
maxValue=1;
angle0=0;
angle1="rad -360";
};
class tailRotor
{
type="rotationX";
source="rotorV";
selection="tailRotor";
axis="";
memory=1;
sourceAddress="loop";
minValue=0;
maxValue=1;
angle0=0;
angle1="rad -360";
};
class wheelL
{
type="translation";
source="altRadar";// altRadar(レーダー式高度計??)を使用。
// [[Model_Config]]の何かでさえも、ヘリコプターの動くダンパー
// には見えない。
selection="wheelL";
axis="axis_damper"; //垂直軸, 頂点からの距離は1m
memory=0;
animPeriod=0;
minValue=0;
maxValue=0.05;//最大値は地上から0.05mにセット
offset0=0;
offset1=-0.05;//最大値に達した時、0.05m下向きな車輪がアニメーションする
};
class wheelR
{
type="translation";
source="altRadar";
selection="wheelR";
axis="axis_damper";
memory=0;
animPeriod=0;
minValue=0;
maxValue=0.05;
offset0=0;
offset1=-0.05;
};
class turret_RMK_x // 水平に移動する砲塔のパーツ
{
type="rotationY";
source="mainTurret";
selection="turret_RMK_x";
axis="axis_turret_RMK_x";
animPeriod=0;
memory=1;
minValue="rad -360";
maxValue="rad +360";
angle0="rad -360";
angle1="rad +360";
};
class turret_RMK_y // 垂直に移動する砲塔のパーツ
{
type="rotationX";
source="mainGun";
selection="turret_RMK_y";
axis="axis_turret_RMK_y";
animPeriod=0;
memory=1;
minValue="rad -360";
maxValue="rad +360";
angle0="rad -360";
angle1="rad +360";
};
};
};
};
免責事項 : 個人的に訳した文書ですので、もし翻訳された文章により何らかの損害、不利益が発生したとしても、一切の責任は負いませんのでその点をご留意の上お読みください。また原文に記載されている権利に基づき、利用にあたっては非商用利用にのみに限定されていますのでご注意ください。