モデル構造
Rigid Chipsでは、モデルの内容はテキストファイルで記述される。
その中身は下記の5つのブロックから成り、各々の{}の中に設定値が書き込まれている。
コメントアウトは//。ただし、luaブロックの中だけは--。--[[ ]]も有効。
現在バグで、scriptブロックかluaブロックの後のコメントアウトは
ハングアップ等含むエラーとなるので注意。(修正は困難)
Val{}
変数を宣言する。ここで宣言した変数は、Body{}内でチップのパラメータに使用したり、Scriptにおいてグローバル変数として用いることが出来る。(省略不可)
変数の作成上限は256個である。
Key{}
キーを押したときに、Val{}で宣言した変数を変化させる、キーアサインについて記述する。(省略不可)
Body{}
モデルの構造を記述する。(省略不可)
Coreを複数記述することもできる。
Script{}
スクリプトを記述する。これによって、自動制御やデータの表示など、高度な処理を行うことが出来る。(省略可)
Lua{}
ver1.5系で組み込まれたスクリプト言語Luaを使用したスクリプトを記述する。 この要素が記述されている場合、 Script{} は無視される。(省略可)
Val{}内の記述
変数名(...)
変数名は、大文字小文字は区別されません。 (ただしlua内で用いる場合はすべて大文字にします。)
()内で設定できる値
default | 初期値 | 省略時:0 |
min | 最小値 | 省略時:0 |
max | 最大値 | 省略時:floatの最大値 |
step | defaultに近づこうとする値 | 省略時:0 |
disp |
0:変数の内容を表示する。 0以外:表示する。(ver1.03以降) |
省略時:0 |
例:default=10で現在地が15でstep=1の場合 15,14,13,12,11,10,10と変化していく。
ただし Key{},Script{},Lua{}内で値が更新されてる間は変化しない。
ただし 更新されていても変化量が0の場合は例:(key{a:0(step=0)} script{a=a}等)変化しない。
Body{}内の記述
方角名:チップタイプ名(...) {...}
方角名 = "N", "E", "W", "S"
{}内には、子になるチップ(そのチップに接続するチップ)を記述します。 子が無くても{}は省略できません。
チップタイプ
Body{}内に記述出来るチップの種類です。
特別、指定が無いチップはangleはChipと同様にXジョイント相当になる。
構造系チップ
-
コア
-
モデルの元になる。Body直下にしか記述できない。
core コア モデルの中心
-
モデルの元になる。Body直下にしか記述できない。
-
チップ系
- これを中心にモデルを構成していく。
-
重さ、空気抵抗、摩擦抵抗はCoreと同じ。
chip チップ Xジョイント相当。angleで角度を指定 rudder ラダー Yジョイント相当、angleで角度を指定 trim トリム Zジョイント相当、angleで角度を指定
-
フレーム系
- 軽く空気抵抗を受けない。
-
重さはCoreの半分、空気抵抗無し、摩擦抵抗中
frame フレーム チップのフレーム版
option=1で見た目と当たり判定を消すことができるrudderf ラダーフレーム ラダーのフレーム版 trimf トリムフレーム トリムのフレーム版
-
ウェイト
- 重いチップ。
-
重さはCoreの4倍、空気抵抗はCoreと同じ、摩擦抵抗大
weight ウェイト optionで重量、耐久力、燃料を8倍まで増やせる
動力系チップ
-
ジェット
- ローカルY軸方向に推力を発生させる。
-
空気抵抗は無し、摩擦抵抗低
jet ジェット powerで出力を指定
effect(1~4)でスモーク機能
option(0~2)で形態を変化させる
-
ホイール系
- 回転する。
-
ホイールのpower = トルク * ( 角速度[rad/sec] + 100 ) * 0.6
wheel ホイール powerで出力を指定
option(1,2)で径を変更
effect(0~10)で太さの変更(見た目のみ)rlw リアクションレスホイール wheelと同じ。自重からの反動を持たない
その他系チップ
-
アーム
-
射撃する。
arm アーム optionで出力を指定
powerがoptionを上回ると発射
optionに比例しチャージ時間と反動が増加する
optionをマイナスにすることで発射炎だけを出すことができる
-
射撃する。
-
カウル
-
一切の当たり判定、空気抵抗を受けない
cowl カウル option(0~5)で形状を変更できる
effect(0~#FFFF)透明度、発光度、スペキュラの強度、スペキュラの変更ができる
-
一切の当たり判定、空気抵抗を受けない
チップに設定できる設定値
color | カラー指定、R,G,B16進又は10進で記述する。例:(color=#FF0000)(赤) |
angle | 曲げ角度指定、各ジョイントの動きはこれを使う |
spring |
指定部分がangleの角度に戻ろうとする力を設定する。 (推奨値は0〜1、デフォルトは1、spring=1:戻る spring=0:ふにゃふにゃ) |
damper |
指定部分の外力に対する硬さを設定する。 (推奨値は0〜0.5、デフォルトは0.5、damper=1:ガチガチ damper=0:しなる) |
name |
チップに名前を付ける。 この名前は変数としてチップ番号が代入され、_X(ABC),_VY(ABC)のようにチップ番号として使える(ver1.01以降) |
power | jetチップ,wheel系チップ、armチップのみ。詳細はチップごとの説明を参照 |
brake | 動力部にブレーキをかける |
option |
frame系チップ、cowlチップ,wheel系チップ、jetチップ、armチップ、weightチップのみ。 変数は指定できない。詳細はチップごとの説明を参照。 )(ver1.5B1以降, Jetチップはver1.5B10以降、WeightチップはVer1.5B24以降) |
effect |
見た目を変える属性。jetチップ,wheel系チップのみ。詳細はチップごとの説明を参照。 (それぞれver1.5B4, 1.5B5以降) |
user1 | シナリオ等で使用(変数指定可能) |
user2 | シナリオ等で使用(変数指定不可) |
script{}内の記述
スクリプトはフレーム毎に呼び出されます。
script内で使える命令
IF 条件式 {...} //〜の条件が成立した場合{}内の命令を実行する
GOTO xxxx //LABEL xxxxの場所へジャンプする
LABEL xxxx //GOTO xxxxのジャンプ先を定義する
PRINT X,xxxx //X行目にxxxxを表示する(Xは0〜9)
コンマで区切って、数値、""で囲まれた文字列を指定できる。
(Xは0〜100)(ver1.5B1以降)
変数名 = ... //変数への代入
IF文は、入れ子にすることはできません。(できないことはないが、バグがある。)
Val{}で宣言していない変数を使用した場合は、ローカル変数になります。
関数は単独で記述すると正常に動作しないことがあるため、値を取得する必要がない関数でも、変数に代入する形で使用する必要があります。
例 : dummy = _BYE(1)
各種演算子
+ 加算
- 減算
* 乗算
/ 除算
= 等しい
!= <> 等しくない
> より大きい
< より小さい
>= 以上
<= 以下
& 条件式のAND
| 条件式のOR
算術関数(script)
_ABS(値) //絶対値
_MOD(値1,値2) //値1を値2で割った余り
_INT(値) //整数部を返す
_FIX(値) //整数部を返す
_FLOOR(値) //切り捨て
_CEIL(値) //切り上げ
_ROUND(値) //四捨五入 (Ver1.5b4以降)
_SGN(値) //符号を返す。値が負なら-1を、正なら1を、0なら0を返す
_RND() //乱数0〜1
_SQRT(値) //平方根
_POW(値1,値2) //べき乗 (値1)の(値2)乗
_EXP(値) //eの(値)乗
_LEN3(a,b,c) //sqrt(a*a+b*b+c*c)
_LEN2(a,b) //sqrt(a*a+b*b)
_PI() //円周率
_TODEG(ラジアン) //ラジアン→度へ変換
_TORAD(度) //度→ラジアンへ変換
_SIN(値)
_COS(値)
_TAN(値)
_ASIN(値)
_ACOS(値)
_ATAN(値)
_ATAN2(値1,値2)
_LOG(値)
_LOG10(値)
Lua{}内の記述
function main() ~ end がフレーム毎に呼び出されます。 次の関数も使用可能です。
- OnInit 初期化時・モデル読み込み時に呼び出される。
- OnReset リセット時に呼び出される。
- OnFrame 各フレーム毎に呼び出される。この関数がある場合は、mainは呼ばれない。 Luaでは、 PRINT の代わりに out(X,xxxx) を使います。
math.pi //関数ではなく変数なので()は不要
math.sqrt(値) //√
math.sin(値)
math.cos(値)
math.tan(値)
math.asin(値)
math.acos(値)
math.atan(値)
math.atan2(値1,値2)
math.abs(値) //絶対値
math.mod(値1,値2) //値1を値2で割った余り
math.pow(値1,値2) //べき乗 (値1)の(値2)乗, x^y とも書ける
math.exp(値)
math.floor(値) //切り捨て
math.ceil(値) //切り上げ
math.log(値)
math.log10(値)
math.max(x, y, ...) //最大値
math.min(x, y, ...) //最小値
math.frexp(値) // r, e = math.frexp(x); x = r * 2^e
math.ldexp(値1,値2) // x = math.ldexp(r, e); frexpの逆関数
math.random() //乱数0〜1未満 _RND()相当
math.random(n) //0〜nの整数の乱数
math.random(x,y) //x〜yの整数の乱数
math.randomseed(値) //乱数の初期化
math.deg(値) //ラジアン→度へ変換
math.rad(値) //度→ラジアンへ変換
大抵の物は揃っているが、 _INT(),_FIX(),_ROUND(),_SGN(),_LEN2(),_LEN3() に相当する物がないので、 それらが必要な場合は自分で関数を定義しましょう。
math.int = function (x) if x < 0 then return math.ceil(x) else return math.floor(x) end end
math.fix = math.int
math.round = function (x) return int(x + 0.5*sgn(x)) end
math.sgn = function (x) if x < 0 then return -1 elseif x == 0 then return 0 else return 1 end end
math.len2 = function (a, b) return math.sqrt(a*a+b*b) end
math.len3 = function (a, b, c) return math.sqrt(a*a+b*b+c*c) end
Script, Lua内で使える関数
一般情報取得関数
_DT() //内部でのシミュレーション計算における単位時間
_FPS() //Frame Per Second、1秒間に実際に描画されたフレーム数
_TICKS() //描画フレーム数(1フレーム(1/30秒)毎に1ずつ増加する)
_BASE() //FPSの上限の設定値 (30または15)(Ver1.5B系のみ)
_SETTICKS() //_TICKS()の値を設定し直す
_CHIPS() //全体のチップの数(wheel系は中にリムが入っているので2つでカウント)
_WEIGHT() //全体の重さ(kg)
_WIDTH() //画面の幅
_HEIGHT() //画面の高さ
_FACE() //地形データのポリゴン数
_KEY(キー番号) //押されているかのチェック(押されてれば1なければ0)
_KEYDOWN(キー番号) //キーが押された時に1が返る(Ver1.5B系のみ)
_KEYUP(キー番号) //キーが離された時に1が返る(Ver1.5B系のみ)
_ANALOG(0) //ジョイスティックX軸の値(-1000から1000)
_ANALOG(1) //ジョイスティックY軸の値(-1000から1000)
_ANALOG(2) //ジョイスティックスロットル軸の値(-1000から1000)
_ANALOG(3) //(Ver1.5B系のみ)
_ANALOG(4) //(Ver1.5B系のみ)
_ANALOG(5) //(Ver1.5B系のみ)
_HAT(0) //ジョイスティックのハットスイッチの値
_MX() //マウスのx座標取得(画面左端を基準としたピクセル数)(Ver1.5B系のみ)
_MY() //マウスのy座標取得(画面上端を基準としたピクセル数)(Ver1.5B系のみ)
_ML() //マウスの左ボタン状態取得(Ver1.5B系のみ)
_MR() //マウスの右ボタン状態取得(Ver1.5B系のみ)
_MM() //マウスの中ボタン状態取得(Ver1.5B系のみ)
ビューへの描画関数
すべてVer1.5B系のみ
_SETCOLOR(カラー) //ライン色の設定(例 #FF0000)
_MOVE3D(x,y,z) //3Dライン描画の始点の設定
_LINE3D(x,y,z) //3Dライン描画の終点の設定
_MOVE2D(x,y) //2次元ラインの始点設定
_LINE2D(x,y) //2次元ラインの終点設定&描画
2次元座標は、画面中央を (0,0) とし、上端が y=1、下端が y=-1とした正規化座標系。 (x座標は右側が大きくなるが、左端、右端の座標は画面の縦横比によって変化する。)
チップ属性取得関数
チップ番号の代わりに、 name= で指定した名前を使うことが出来ます。
_X(チップ番号) //位置 西が+、東が-
_Y(チップ番号) 上が+、下が-
_Z(チップ番号) 南が+、北が-
_EX(チップ番号) //オイラー角度(ラジアン) (Ver1.5B系のみ)
_EY(チップ番号) //基本的に_AX,_AY_AZと同じだが、AZの範囲と符号のバグを修正し、高速化したもの
_EZ(チップ番号)
_RX(チップ番号,参照チップ番号) //相対オイラー角(ラジアン) (Ver1.5B系のみ)
_RY(チップ番号,参照チップ番号) //チップ番号が調べたいチップ
_RZ(チップ番号,参照チップ番号) //参照チップ番号が比較元チップ 例 _RY(3,0)
_AX(チップ番号) //角度(ラジアン)
_AY(チップ番号)
_AZ(チップ番号) //Ver1.5B5以前。Ver1.5B5以降でそれぞれ動作が異なる。Ver1.5B5はバグ有り
_LX(チップ番号) //角運動量
_LY(チップ番号)
_LZ(チップ番号)
_WX(チップ番号) //角速度
_WY(チップ番号)
_WZ(チップ番号)
_VEL(チップ番号) //並進速度の絶対値 (Script専用、Luaでは使用不可)
_VX(チップ番号) //並進速度
_VY(チップ番号)
_VZ(チップ番号)
_FX(チップ番号) //並進運動量
_FY(チップ番号)
_FZ(チップ番号)
_H(チップ番号) //地面からの高さ。地面から10m以上離れている場合は-100000がかえってくる
_GX(チップ番号) //重心座標(そのチップが属している塊の重心を返す)
_GY(チップ番号)
_GZ(チップ番号)
_XX(チップ番号) //X軸ベクトル(各チップの回転行列(3x3)を1行ずつとりだしたもの)
_XY(チップ番号)
_XZ(チップ番号)
_YX(チップ番号) //Y軸ベクトル
_YY(チップ番号)
_YZ(チップ番号)
_ZX(チップ番号) //Z軸ベクトル
_ZY(チップ番号)
_ZZ(チップ番号)
_QX(チップ番号) //クォータニオン
_QY(チップ番号)
_QZ(チップ番号)
_QW(チップ番号)
_I(チップ番号,列番号,行番号)
//チップの慣性テンソル(3x3)の値取得、列番号・行番号は(0,1,2)
_TYPE(チップ番号) //チップのタイプ
_PARENT(チップ番号) //接続元チップ番号
_TOP(チップ番号) //属する系の元チップ番号
_DIR(チップ番号) //チップの接続方向
_ANGLE(チップ番号) //チップの各種設定値
_POWER(チップ番号)
_SPRING(チップ番号)
_DAMPER(チップ番号)
_BRAKE(チップ番号)
_COLOR(チップ番号)
_OPTION(チップ番号)
_EFFECT(チップ番号)
_USER1(チップ番号)
_USER2(チップ番号)
_M(チップ番号) //チップの質量
_E(チップ番号) //ARMエネルギーのチャージ量
_T(チップ番号) //チップの耐久力, ARM弾が当たると減少, 0〜10000, -1は破壊済みチップ
チップへの特殊命令
_BYE(チップ番号) //チップを切り離す
_SPLIT(チップ番号) //チップを分離する._BYE()の動力付き版(Ver1.5B系のみ)
//cowlチップのみを切り離すと、cowlチップはそのまま空中に静止する
オブジェクト属性取得関数
すべてVer1.5B系のみ
_OX(オブジェクト番号) //ボールの位置
_OY(オブジェクト番号)
_OZ(オブジェクト番号)
_MOBJ(オブジェクト番号) //オブジェクトの質量
_IOBJ(オブジェクト番号,列番号,行番号)
//オブジェクトの慣性テンソル(3x3)の値取得、列番号・行番号は(0,1,2)
CCDカメラ属性取得関数 †
coreチップのカメラの画像を取得することが出来ます。
(x,y)座標は、左上が(0,0)、右下が(63,63)
_CCD(x,y) //CCDカメラの色情報(x,y)15ビットRGB整数値
_RED(x,y) //CCDカメラの赤情報(x,y)0〜1実数値
_GREEN(x,y) //CCDカメラの緑情報(x,y)0〜1実数値
_BLUE(x,y) //CCDカメラの青情報(x,y)0〜1実数値
_ZOOM(視野角)
ネットワーク関連
ネットワークによるマルチプレイを使用するとき、各プレイヤの情報を取得できます。
すべてVer1.5B系のみ
_PLAYERS() //ネットワークプレイヤの人数
_PLAYERHOSTID() //ホストのID
_PLAYERMYID() //自分のID
_PLAYERID(n) //n番目のプレイヤのID
_PLAYERCHIPS(n) //n番目のプレイヤのチップ数
_PLAYERARMS(n) //n番目のプレイヤのARMチップ数
_PLAYERCOLOR(n) //n番目のプレイヤのマーカ色
_PLAYERCRUSHES(n) //n番目のプレイヤの破壊された回数 (破壊=Coreの耐久度<0)
_PLAYERINITS(n) //n番目のプレイヤの初期化回数
_PLAYERRESETS(n) //n番目のプレイヤのリセット回数
_PLAYERYFORCES(n) //n番目のプレイヤの強制上向き力の回数
_PLAYERX(n) //n番目のプレイヤのCoreの位置x
_PLAYERY(n) //n番目のプレイヤのCoreの位置y
_PLAYERZ(n) //n番目のプレイヤのCoreの位置z
//他人のCoreの位置にはそれぞれ+-5mほどの雑音が乗せてある
_PLAYERNAME(n) //n番目のプレイヤの名前 (Luaでは文字列が返る)
_PLAYERNAME2(n,i) //n番目のプレイヤの名前2 (Script専用、Luaでは使用不可)
Scriptでは文字列を扱えない都合上、_PLAYERNAME(n) では 4byte分の数値が返る。 4byte以上の名前がほしい場合は、_PLAYERNAME2(n,i) を使う。 4byte分の数値をprint文によって文字として表示する場合は、$を付けて次のようにする。
print 0,$_PLAYERNAME(0) //最初の4Byteのみ
print 0,$_PLAYERNAME2(0,0),$_PLAYERNAME2(0,1),$_PLAYERNAME2(0,2)
// _PLAYERNAME2(0,0)と$_PLAYERNAME(0)は同等