2009/10/11 日曜日

ARMA2 train script と三角関数の話

ARMA2で列車を走らせたい!ということでスクリプト作成中です。
線路と道路の立体交差がある日本の島、ほしい。

movie

三角関数について:
X座標、Y座標から角度を割り出すにはアークタンジェントを使う必要があります。
以下のサイトを参考にしました。
角度と座標の計算-三角関数を使う

角度を求めたらOFP/ARMA/ARMA2用の角度に補正する必要があります。
①ゲーム上の角度は学校で習う角度と向きが反対なので、-1を掛ける。
②学校で習う角度の0度はX座標の正軸。ゲーム上の0度はY軸の正軸。
よって、X座標が正/負かつY座標が正/負のそれぞれの条件で角度を足したり引いたりして最終的に出る数字を補正します。

スクリプトは大体できました。日本の列車のモデルほしいな~。

2009/7/24 金曜日

pseudo FLIR effect sample for ARMA2

Filed under:   ─スクリプト編 — gachopin @ 17:17:42

擬似FLIRのスクリプトを書きました。
ガナーしか使えないようになってます。
[乗り物] execVM “script\FLIR_init.sqf”;で使えます。
flir.jpg

Youtube

7月27日 アクションメニューのバグFIXしました。
Download

2009/6/2 火曜日

スクリプト解説

Filed under:   ─スクリプト編 — gachopin @ 14:36:39

スクリプトが分かれば、ゲームエンジンが許す限り何でも出来ます。エディタ画面を弄らなくても、スクリプトだけでミッションを作れます。
アドオンに新規の機能を組み込む場合、スクリプトが必須になってきます。

スクリプトの記述はARMA2でも大きく変わらない(だろう)と思うので、ちょっとだけ解説します。
理解するには、ユーザーミッションやアドオンのスクリプトの中身をみて、ちょっと改造してみるのが一番です。

★全てのスクリプトに共通すること
・名前がinitのスクリプトは、ミッションで最初に必ず実行される。(init.sqs or init.sqf)
・実行するスクリプトのファイルだけに使える変数は、_をつける
・全てのスクリプトに共通の変数を使う場合は、_をつけない
例) a.sqsの中身 ’変数にプレーヤと乗り物を指定するスクリプト’
1: _hoge = player
2: hoge = vehicle(player)

b.sqsの中身 ’ダメージを与えて破壊するスクリプト’
1: _hoge setdammage 1
2: hoge setdammage 1

ミッションの中で a.sqsとb.sqsを実行させたとき、
1行目→b.sqsは_hogeが参照できないので、エラーが出ます。
2行目→b.sqsはa.sqsで定義したhogeを参照できるので、プレーヤーの乗り物を破壊します。

・[]は配列を表す。
配列の使い方例) -ある配列から3番目の要素を取り出す-
_array1 = [A,B,C,D]
_elementC = _array select 2 ←Aは0番目、Cは2番目と数えます

まずOFP・ARMAで使えるスクリプトは2種類あります。
①sqs
OFPで最も一般的に使われているスクリプトです。

・行の最初に;をつけるとコメント行になります。
・命令文の最後に;をつけ、続けて命令文を書くことができます。
・エラーが出たとき、1行でエラーの内容が表示されます。
・if文の書き方が2種類ある
例1) ?(条件) : 命令文1;命令文2
例2) if(条件) then {命令文1;命令文2};

呼び出し方: 
引数 exec “スクリプト” (特に引数が無い場合は[] exec “script.sqs”)
[引数1,引数2] exec “スクリプト”

②sqf
ARMAで推奨されているスクリプトです。
記述を厳格に書かないとエラーが出ます。

・行の最初に//をつけるとコメント行になります。
・複数行のコメントは/*と*/で囲めばOK。
・命令文の最後は必ず;をつけなければいけません。エラーが出ます。
・エラーが出たとき、複数行でエラーの内容が表示されます。
・sqsで使えたif文の省略形 ?(条件):命令文 は使えません。
・for文、foreach文、if文、ifelse文、switch文、while文が使えます。

呼び出し方: 
execVM “スクリプト” ←引数の指定無し
[引数] execVM “スクリプト” ←引数の指定有り

call compile preprocessFile “script.sqf”;の後、引数 call “実行文”
call compile preprocessFile “script.sqf”;の後、[引数1,引数2] call “実行文”

sqfには2種類あります。
A.実行するもの
・sqsと同じ。ただし中身は厳格に書かないとエラーが出る。

B.関数を定義するもの
関数を定義し、call文で実行させることができる。
別ファイルから実行する場合、
実行する前に、関数を書いたファイルを読むおまじない「call compile preprocessFile “スクリプト名”」を書く必要がある

以下の例では2つのファイルに分けていますが、A.B.は1つのファイルに書くこともできます。
その場合、call compile preprocessFile~ は必要ありません。

関数の例)
———func.sqfの中身———
func1 =
{
_unit = _this select 0;
_unit setdammage 1;
};
——————————-

関数を呼び出した例)
———call.sqfの中身———
call compile preprocessFile “func.sqf”;
[player] call func1;
——————————-

execVM “call.sqf” を実行すると、プレーヤが死亡します。


大雑把ですが、説明は以上です。sqf文は私が慣れていないせいもあって、不完全です。

2008/10/12 日曜日

建物の破壊例とミラー・窓の例

Filed under: Armaアドオン製作支援,   ─house編 — gachopin @ 21:38:42

建物の破壊によるモデル置き換え例と窓・ミラーの作例です。
ファイルの中に説明があります。
本格的な建物を作成したい方、参考にしてください。

ダウンロード

2008/9/2 火曜日

車を作ろう⑫ 完成

Filed under:   ─車編, アドオン, Armaアドオン製作支援 — gachopin @ 15:34:12

これで完成です。
アドオンとアドオンフォルダ両方を含むzipを用意しました。
参考にしてください。

mycar.jpg

mycar.zip

車を作ろう⑪ 車体のダメージ、タイヤのダメージ

Filed under:   ─車編, Armaアドオン製作支援 — gachopin @ 14:43:19

車体とタイヤで、ダメージでテクスチャの色が変わり、
タイヤを撃つと機能させなくすることができます。

まず、hitpointLodに車体周りに点をおき、body_hitと名付けました。
タイヤはleft_back_wheel_hit、right_back_wheel_hit 等4つ名付けました。
car51.JPG

モデルLodで、車体にダメージがあったときに変更する部分をbodyと名付けました。
タイヤは既にアニメ用に名付けたものを流用します。
car52.JPG

壊れたときのテクスチャはBISのテクスチャを流用してもよいですが、今回はテクスチャにノイズをかけたりして作成。
car53.JPG

あとはconfig.cppで定義するだけです。HitBody、HitLFWheel、HitLBWheel、HitRFWheel、HitRBWheelを定義します。
一例を載せておきます。

class HitLFWheel {armor=0.15;material=-1;name=”left_front_wheel_hit”;visual=”left_front_wheel”;passThrough=0;};
name= はhitpointで名付けた点の名前、visual= はモデルLODのタイヤの名前です。

同じくconfig.cpp内でテクスチャの定義(class Damage)を書きます。

ここから手抜き方法。
ここで本来ならmat[]=の部分にrvmatを指定するのですが、
tex[]={”壊れる前のテクスチャ”,”壊れた後のテクスチャ”};
と書きます。rvmatなら壊れた後のテクスチャのマテリアル等を細かく定義できますが、
私は正直壊れたモデルに丁寧な設定をしたくないのです。
この定義だけでダメージを受けたときテクスチャが壊れた物に換わってくれます。

class Damage
{
tex[]={”\mycar\tex.pac”,”\mycar\tex_destroy.pac”};
mat[]={};
};

また、完全に壊れたら人とドアが消えるようにしたいので、まず乗員のモデルにdamageHideと名付けました。
「壊れたら消える」はアニメとして定義するので、model.cfgのCfgModels内、class AnimationsでdamageHideを定義します。

そして、CfgSkeletonsのskeletonBones[]=に”damageHide”,”" を追加します。

次にドア。ドアは既にアニメの定義がされているので、上記のように定義すると動かなくなってしまいます。
そこでドアは個別にanimationsクラスの定義をします。

人とドアが消えるanimationsクラスの定義はこちら。

class damageHide
{
type=”hide”;
source=”damage”;
selection=”damageHide”;
};
class damageHide_r1 : damageHide {selection=”door_r1″;};
class damageHide_l1 : damageHide {selection=”door_l1″;};
class damageHide_r2 : damageHide {selection=”door_r2″;};
class damageHide_l2 : damageHide {selection=”door_l2″;};
class damageHide_rear1 : damageHide {selection=”door_rear1″;};
class damageHide_rear2 : damageHide {selection=”door_rear2″;};

これで完成、です。

2008/8/29 金曜日

車を作ろう⑩ ガラスのダメージ

Filed under:   ─車編, Armaアドオン製作支援 — gachopin @ 15:35:44

これは車の定義に必須ではありませんが、私は常々面倒で避けていたのであえて作ります。

まずモデルからガラス部分だけ抽出して全部正面に向け、SSを撮ります。
car47.JPG
512×256に画像の大きさを変更し、貼り付けておきます。
car48.JPG

これから用意するテクスチャは、①壊れていないときのテクスチャ ②半壊したテクスチャ ③全壊したテクスチャです。
car49.JPG

ガラスの壊れ方の定義は、「右のガラス」か「左のガラス」しかありません。
ここでは「右」を「正面と後部のガラス」 「左」を「横のガラス」として定義していきます。

まず0LODのガラスで正面と後部をsklo predni Pと名付けます。横のガラスはsklo predni Lと名付けます。(viewCargoLODも同じように)
FireGeometryのガラスの当たり判定の部分にも同じように名付けます。
そして、firegeometryの窓にca\data\data\black.pacを貼ります。ARMAではこれを貼らないと窓が壊れても銃弾が貫通しません。

そしてhitpointsLODを作成しガラスの真ん中あたりに点を置いてsklo predni P、sklo predni Lと名付けます。
car50.JPG

あとはmodel.cfg内のcfgmodelsのsections[]=に”sklo predni P”と”sklo predni L”を追加。
config.cppのcfgvehiclesにHitLGlassとHitRGlassを追加、dammageHalfとdammageFullにテクスチャを定義します。

class HitLGlass {armor=0.1;material=-1;name=”sklo predni L”;visual=”sklo predni L”;passThrough = 0;};
class HitRGlass : HitLGlass {name=”sklo predni P”;visual=”sklo predni P”;};

2008/8/22 金曜日

車を作ろう⑨ アニメーションのプレビュー

Filed under:   ─車編, Armaアドオン製作支援 — gachopin @ 18:12:13

定義が終わったらo2のビューアでモデルを見てみましょう。
ARMAでは定義したアニメの動きまでプレビューすることが出来ます。これ便利。すごく便利。

動かすにはmodel.cfgが必須です。
ビューア画面を開いたらミドルマウスボタンを押します。
左上にcfgmodelsで定義したアニメの名前が出てきます。その状態でマウスホイールを転がすとアニメが動きます。
ミドルマウスボタンを再度押すと次のアニメを選択することが出来ます。

car46.JPG

車を作ろう⑧ ジオメトリ及びcfgmodels

Filed under:   ─車編, Armaアドオン製作支援 — gachopin @ 16:39:17

ARMAのアドオンでは必須のアニメの定義を扱います。

まず準備として、memoryLodに点を置きます。
o2で新規にLODを作成し、propatiesでMemoryを選択します。このMemoryLODは点のみを置く必要があります。
個々の点はアニメの軸や光の位置、銃口の向き等、機能を働かせるのに必要な基準点になります。
このLODにBISのサンプルモデルの車等から点をコピペしておくと楽です。
点にはそれぞれ名前がついており、機能を持った点のほとんどはチェコ語で書かれています。
bisのwikiに英訳があるので詳しく知りたい方は参考にしましょう。
ArmA:_Selection_Translations

サンプルモデルのmemoryLodを見れば大体意味が分からなくても機能がわかるのですが、
重要な点を一つ。Pは右、Lは左を意味します。
例えば”P svetlo”は右のライト、”konec P svetla”は右のライトの終端を意味します。”zamerny”はカメラの中心点です。
“pos driver”は乗り込む際、get in ○○ as driverとアクションメニューに表示される点です。
これらは全て自分で定義することが出来ますが、非常に面倒なのでコピペしたほうが楽です。それらの点に加え自分の定義する点もあとで置いてゆきます。

サンプルモデルからmodelLodにコピペしたら位置を調整します。
car42.JPG

最初に車の走行に必須の定義を行いますがその前にジオメトリを作っておきます。
ジオメトリに関しては建物を作ろう③で解説しています。
今回私の車のジオメトリはARMAのサンプルモデルの車のジオメトリをそれっぽく整形しました。
car43.JPG
上の図で、私は左前輪のセレクションにdamp_flと名付けました。(任意の名前でOK)
dampとはダンパー、つまり車のショックを吸収するやつです。OFPで戦車のキャタピラが地面に合わせて傾いていましたが、あれと同じ挙動をします。
ほかの3輪も似た名前をつけておきます。

MemoryLodに戻ります。
それぞれのタイヤの位置、地面に接する部分に↑で名付けた名前と同じ名前の点を一つずつおきます。
car44.JPG
この点が車のダンパーの基準点になります。

今度はモデルのLODです。作成したタイヤを選び、それぞれにタイヤの名前をつけます。
私は左前輪にleft_front_wheelと名付けました。
car45.JPG

ここまできたらいよいよmodel.cfgの作成です。
新規テキストを用意し、model.cfgと名付けてください。それをメモ帳等で開きます。
model.cfgの中にはCfgSkeletonsとCfgModelsを定義していきます。
Cfgskeletonは文字通り骨を定義します。人間で言うと、肩を動かしたら腕が一緒に動きますよね。そんな関係を作ります。
説明に必要な部分だけ下に書きます。実際は他の定義が必要です。

class CfgSkeletons
{
class Vehicle;
class Car: Vehicle {};
class car_stepvan : Car
{
isDiscrete=1;
skeletonInherit=”";
skeletonBones[]=
{
“damp_fr”,”",
“right_front_wheel”,”damp_fr”
};

—解説—
isDiscrete=1;はとりあえず1にしておきましょう。私は意味がワカランです。
skeletonInheritは骨の定義を継承できる?らしいのですがエラーが出るのでこのように書きました。
“damp_fr”,”" ←これは、damp_frは単独でアニメするという意味です。
“right_front_wheel”,”damp_fr” ←これは、右前輪が、damp_frと対(ボーンの関係)になって動くという意味。
———-

class CfgModels
{
class Vehicle;
class Car: Vehicle {};
class car_sedan: Car {};
class mycar : car_sedan
{
sectionsInherit=”";
sections[]=sectionsにはmemoryLodの点以外の、稼動するセレクションを定義します。(ここではダンパーと右前輪)
{
“damp_fr”,”right_front_wheel” 
};
skeletonName=”car_stepvan”;
これは上記で定義した骨をアニメに使いますよ、という意味です。
class Animations {
class FrontWheelR
{
type = “rotationX”;
source = “wheel”;
selection = “right_front_wheel”;
axis = “”;
axisは軸を意味するのですが空欄になっています。これは、type が “rotationX”だからです。X軸を軸にするので、定義する必要がありません。

memory = 1;
sourceAddress = “loop”;
minValue = 0;
maxValue = 1;
angle0 = 0;
angle1 = “rad -360″;
普通角度は円周率の値で定義するのですが、radを使用することで角度で定義できます。360はつまり1回転です。
};
class FrontWheelRTurn
これは前輪の横回転。曲がるときの動き。
{
type = “rotationY”;
source = “drivingWheel”;
selection = “right_front_wheel”;
axis = “”;
memory = 1;
sourceAddress = “clamp”;
minValue = -1;
maxValue = 1;
angle0 = “rad 25″;
angle1 = “rad -25″;
};
class Wheel_Damper_rf
ダンパー。minValueがマイナスです。地面に接していないときにタイヤがその値まで沈み込みます。ダンパーとタイヤは”骨”なのでタイヤもその動きに追従します。
{
type=”translationY”;
source=”damper”;
selection=”damp_fr”;
axis=”";
minValue=-0.090000;
maxValue=1;
memory=1;
};
};
};

model.cfgのサンプルを置いておきます。
model.cfg

2008/8/18 月曜日

車を作ろう⑦ 窓、ミラー

Filed under:   ─車編, Armaアドオン製作支援 — gachopin @ 14:20:12

窓やミラーの表現で、ARMAから導入されたRVMATを使用すると「反射しているように見える」エフェクトを使用することが出来ます。
窓は既にポリゴンで用意したので、ミラーの面を作ります。
ミラーの面は前面のポリゴンをコピペ、0.9倍にして作成しました。テクスチャはまだ必要ありません。
car36.JPG

反射に使うテクスチャはコレ。ARMAで使っているファイルを抜き出してきたものです。
car37.JPG

拡張子rvmatで以下のようなファイルを作ります。

ambient[]={1,1,1,1};
diffuse[]={1,1,1,1};
forcedDiffuse[]={0,0,0,0};
emmisive[]={0,0,0,1};
specular[]={1,1,1,1};
specularPower=32;
renderFlags[]={”NoAlphaWrite”};
PixelShaderID=”Glass”;
VertexShaderID=”Glass”;
class Stage1
{
texture=”#(argb,8,8,3)color(0,0,0,1)”;
uvSource=”none”;
};
class Stage2
{
texture=”mycar\env_co_pac.paa”;
uvSource=”none”;
};

Stage2でミラー用テクスチャを指定。

ミラーの面を選んで面のプロパティでrvmatファイルを指定します。
ここでテクスチャの指定は「無」になっていますが、例えば青色のテクスチャだと青っぽく反射します。
car38.JPG

これで視点によって見え方が違うテクスチャができます!
car39.JPG

窓は半透明のテクスチャ(paa形式)を貼り、
上記のRVMATのstage1のアルファ部分を0.3にします。
texture=”#(argb,8,8,3)color(0,0,0,0.3)”;

ここでいくつか注意。
半透明テクスチャはpaaのみです。pacでは透明度が0か1しかありません。窓には使えません。
また、paaには優先度があります。優先度が低い物は表示されません。
car40.JPG
この画像では後ろの窓が前の窓から見えます。
これ、優先度を上げる前は後ろの窓は見えませんでした。
窓の外側の面はfaces→move to topで優先度を最大にする必要があります。

ノーマルマップとスペキュラマップを作成。以前のチュートリアルで解説しています。
car41.JPG

これで9割方はモデル完成。

次のページ »

HTML convert time: 0.292 sec. Powered by WordPress ME