QRコード
QRCODE
アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 0人
オーナーへメッセージ
slMame › 一日一膳腹八分目 › LSLで作る › 飛行機をつくる:(3) 乗り物パラメーターをいじる
2016年04月15日

飛行機をつくる:(3) 乗り物パラメーターをいじる

3回目では前回までのなんちゃって飛行機の中の、乗り物システムをもう少し自分なりに好きなようにいじれるように、乗り物システムの設定を詳しく見ていく事にします。

前回までのなんちゃって飛行機では、乗り物システムに対する命令は関数planeEngine()のなかで下の様になっていました。
//-----------------------------------------
//エンジン設定関数 planeEngine()
//-----------------------------------------
planeEngine()
{
llSetVehicleType(VEHICLE_TYPE_AIRPLANE); //乗り物タイプを飛行機にします。
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE,0.0); //舵操作への反応速度を最高感度にします。
}

この中に出てくるllSetVehicleType()は、乗り物システムに乗り物のタイプを指定する命令ですが、動作としてはVEHICLE_TYPE_NONEを指定すると乗り物システムをオフにしてただのプリムにし、その他を選んだ際は(リンデンの中の人が思う所の)名前の通りの乗り物の様な動きをする初期設定を一発設定する、という関数です。
ですので、実際には乗り物タイプの指定というよりも、乗り物システムをオンオフする関数、という方が正確です。
車や船やバルーンや飛行機と、色々なタイプ指定がありますが、どれを選んでも指定される値が異なるだけで、指定するパラメーターの種類は同一で、乗り物システムに与えることが出来るほぼ全てのパラメーターに対して初期値を設定しに行くようになっています。
つまり、例えば車を作ろうとしている時に船を選んでも、パラメーターを全部上書きするなら普通に車になります。
例えば飛行機(VEHICLE_TYPE_AIRPLANE)であればこのようになっています。

// 前後方向には抵抗はとても小さい
llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <200, 10, 5> );
// 回転抵抗はどの方向も同じ
llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 20 );
// 推進モーター
llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, <0, 0, 0> );
llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 2 );
llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
// 回転モーター
llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, <0, 0, 0> );
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 4 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 8 );
// ホバーさせない
llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0.5 );
llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 1000 );
llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0 );
// 線形偏向
llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.5 );
// 角度偏向
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 1.0 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 2.0 );
// 垂直アトラクター
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.9 );
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2 );
// バンク効果
llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 1 );
llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.7 );
llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 2 );
// 乗り物モーターの取り付け角度
llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, <0, 0, 0, 1> );
// これらのフラグをオフにします
llRemoveVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
| VEHICLE_FLAG_HOVER_WATER_ONLY
| VEHICLE_FLAG_HOVER_TERRAIN_ONLY
| VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
| VEHICLE_FLAG_HOVER_UP_ONLY
| VEHICLE_FLAG_LIMIT_MOTOR_UP );
// これらのフラグをオンにします
llSetVehicleFlags( VEHICLE_FLAG_LIMIT_ROLL_ONLY );

結局、上の枠内の設定を色々といじり倒して、望むような動き方をする設定パラメーターを見つければ、望むような乗り物が作れる(大抵は!)という事です。以下、順序が多少変わるかもしれませんが一つづつ見ていきます。

VEHICLE_LINEAR_FRICTION_TIMESCALE

X,Y,Zの各々の方向に対する速度の減衰程度を、3軸とも同じならfloatで、各軸について変えたいならvectorで指定します。
停止するまでの時間スケールを表しているので、値が大きくなるほど抵抗が減ります。
但し、下の方で説明する他のいくつかのパラメーターの方が効果が圧倒的に強いので、抵抗を小さくしようとして値を大きくしてもあまり効き目が感じられません。抵抗を大きくするために設定値を小さくするとそれなりに効きます。


VEHICLE_ANGULAR_FRICTION_TIMESCALE

X,Y,Zの各々の方向に対する回転の減衰程度を、3軸とも同じならfloatで、各軸について変えたいならvectorで指定します。
停止するまでの時間スケールを表しているので、値が大きくなるほど抵抗が減ります。
但し、こちらもいくつかのパラメーターの方が効果が圧倒的に強い事が多いので、おまけ程度の意味と思っておく方がよいかもしれません。


推進モーター系3種

VEHICLE_LINEAR_MOTOR_DIRECTION
推進モーター(線形モーター)つまり、XYZ各方向に進もうとさせるスピードをvectorで指定します。指定した速度で進もうとします。
VEHICLE_LINEAR_MOTOR_TIMESCALE
推進モーターの出力が最大に到達するまでの時間スケールを指定します。大きくすると加速が遅くなります。
VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE
推進モーターの出力が最大に達した後、減衰して無くなってしまうまでの時間スケールを指定します。大きくすると最大速度付近で延々と移動し続けようとします。但し最大で2分ほどでだんだん減衰が始まり、そのうち停止します。

これら推進モーター系3種類のパラメーターで、乗り物のスロットル(アクセル)を入れたときのスピードやスピードアップの速さを調整するのですが、飛行機にとっては多少微妙な動きをします。
例えば、<5, 0, 0>を設定したとすると飛行機は前方向に5メートル毎秒の速さで移動しようとし始めるのですが、このとき、ゼロを指定しているYとZについても、何もしないのではなくて速度ゼロになろうとする様に振舞います。この振る舞いによる減速はVEHICLE_LINEAR_MOTOR_TIMESCALEで指定した推進エンジンの追随時間に応じて発揮されるので、(すみやかに加速したい≒大抵の場合)3軸毎の抵抗の設定よりも大きな抵抗が発生している様に感じられます。
車でもドリフト動作等のちょっと変わった動きをさせたい時に邪魔をしている可能性がありますが、飛行機における影響はかなり深刻で、<1, 0, 0>を設定したとすると飛行機は前方向に1メートル毎秒の速さで移動しようとしつつ、Z軸の指定がゼロなので無重力でその高さに留まろうとします
UFOといわれる空中で停止しながらクルクル回る物体の正体は要するにこれです。。^^;


回転モーター系3種

VEHICLE_ANGULAR_MOTOR_DIRECTION
回転モーター(舵機能)に、XYZの各軸廻りでの回転動作をラジアン毎秒で指定します。指定の回転速度で回転しようとしますが、いくつか他のパラメーターに影響を受けるものがあります。
VEHICLE_ANGULAR_MOTOR_TIMESCALE
回転モーターに指定した回転速度に到達するまでの時間スケールを指定します。値を大きくすると回転がゆっくりスタートします。
VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE
回転モーターに指定した回転力が最大に達したのちに、減衰して無くなってしまうまでの時間スケールを指定します。値を大きくするといつまでも回り続けようとしますが、値に関わらずそのうち停止します。

回転モーター系は推進モーターと違い、他のパラメーターに悪さをする要素は余りなく、素直に書いてある通りに使えます。
ゼロ指定をすると回転を停止させようとするのは推進モーターと同じですが、大抵の乗り物は回転は速やかにやめたい物なので、こちらはあまり気になりません。
回転力そのものは下で説明する偏向・アトラクターによって影響を受け、大抵の場合指定より小さな効果しか及ぼさなくなります。
例えば、偏向やアトラクターを調整していると突然ちっとも曲がらなくなった!という風になります。壊れた!と慌てない様に注意です。


線形偏向

VEHICLE_LINEAR_DEFLECTION_EFFICIENCY
乗り物の正面が向いている方向に移動する方向を変えようとする性質の強さです。
0.0(効果なし)から1.0(最大)の間で指定します。
VEHICLE_LINEAR_DEFLECTION_TIMESCALE
線形偏向の強さが最大に発揮されるまでの時間スケールを指定します。値を大きくすると効果の発揮がゆっくりになります。

線形偏向は飛行機にとって非常にクセモノです。恐らく車のドリフトや、車がバウンドして浮いてしまった後の落下速度にも悪影響を与えます。
乗り物の正面方向に速度を向けたがる性質という事ですので、リンデンの説明を一見するととっても有意義な設定パラメーターに見えるのですが、、、

例えば空中で推進力をゼロにした上で真上を向くと・・

1)重力によって速度が落ちていき・・・
2)空中で停止し・・・
3)重力によって落下しはじめて・・・
4)線形偏向が落下を前進力に変換し・・・
5)振り出しに戻る

というループが発生して、結果、空中でほぼ静止する画期的なUFOが出来上がります(笑
また、回転モーターへの設定値が小さい状態でこの線形偏向パラメーターが大きいと、まったく曲がらなくなります。
普通の挙動であれば推進モーターへの出力ゼロ指定で横や縦へのすべりはある程度止められるので、ご利用は計画的にといった感想を私は抱いています。


角度偏向

VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY
現在乗り物が進んでいる方向に正面を向けようとする傾向の強さを0.0(傾向無し)~1.0(最大)の間で指定します。
VEHICLE_ANGULAR_DEFLECTION_TIMESCALE
角度偏向の強さが最大に発揮されるまでの時間スケールを指定します。

角度偏向は線形偏向ほどには悪さをしない傾向パラメーターで、飛行機で言えば水平尾翼と垂直尾翼の効果に該当する傾向を表します。つまり、機体が今進んでいる方向にむこうとします。
線形偏向が大きいと殆ど効果を表しませんが、旋回操作をやめると元の方向にボヨヨンと戻ろうとする傾向の強さになって現れます。
進んでいた方向に戻ろうとする成分なので回転モーターと逆向きの力が加わる事が多く、その意味で若干の影響を回転に与えます。


垂直アトラクター

VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY
傾斜した姿勢を立て直そうとする傾向の強さを0.0(効果無し)~1.0(最大)の範囲で指定します。
VEHICLE_VERTICAL_ATTRACTION_TIMESCALE
姿勢復元傾向が最大に発揮するまでの時間スケールを指定します。値が大きくなるほどゆっくり・弱くなります。

後述するフラグVEHICLE_FLAG_LIMIT_ROLL_ONLYによって影響を受けますが、傾斜した姿勢にある状態を自動的にまっすぐに立て直そうとする傾向を指定するパラメーターの組です。
飛行機で言えば、傾斜して旋回していた機体が放置しておくと段々傾斜が復元され、水平に戻っていく効果の大きさに該当します。メインランドを観光飛行する様な用途では大きめの値の方がクルーズしやすくなりますが、あまり傾向が強いと曲がるのにキー連打が必要になったりして旋回操作が忙しくなります。


バンク効果

VEHICLE_BANKING_MIX
機体を傾斜させたときに発生する旋回力の出方を0.0(停止していても曲がる)~1.0(動いていないと曲がらない)の間で設定します。
VEHICLE_BANKING_EFFICIENCY
乗り物が傾斜した時に曲がろうとする方向を-1.0(逆方向に曲がる)~0.0(効果なし)~1.0(傾いた方向に曲がる)の範囲で設定します。
VEHICLE_BANKING_TIMESCALE
傾斜によって旋回が発生するまでの時間スケールを設定します。

飛行機では、機体をバンクさせたときにその方向に曲がりはじめる傾向に該当する効果を生み出します。
船などでバンクさせた方向と逆方向に曲がるように設定するのも面白いかもしれません。
メインランド飛行用の機体などではこれと垂直アトラクター(傾斜からの復元傾向)を上手く調整して、45度傾斜ぐらいからスタートで~100メートル程度の半径で曲がり終わり、曲がり終わると傾斜が復元してまっすぐ飛ぶようになっていると割と乗りやすい機体になると思います。(その程度にしておくと1SIMの中で90度曲がって姿勢が復元し、そのまま次のSIMに侵入します)


ホバー

VEHICLE_HOVER_HEIGHT
乗り物が空中や水中を浮遊する高さの目標値をメートルで指定します。ゼロメートルの基準になる高さは後述のフラグで指定します。
VEHICLE_HOVER_EFFICIENCY
ホバー高度に到達しようとする傾向を0.0(ピーキー)~1.0(鈍い)の範囲で指定します。
VEHICLE_HOVER_TIMESCALE
ホバーの目標高度に到達するまでの目標時間スケールを指定します。値が大きいほどゆっくりになります。
VEHICLE_BUOYANCY
乗り物にかかる重力の大きさを、-1.0(2G)~0(1G)~1.0(無重力)の範囲で指定します。重力加速度は高校物理の通り1Gが9.8メートル毎秒毎秒になっていますので、働いている力の大きさはここで指定した重力加速度にllGetMass()をかけた物になります。また、llSetBuoyancy()で指定する重力の大きさとは独立して働いています。

後述するフラグによって定めたゼロメートル地点(地上、水面、絶対)から見て、乗り物が指定の高度で浮遊する傾向を設定するパラメーターの組です。普通の飛行機では関係が無いのでリンデンの初期設定のままでもかまいませんが、ハリアーやF35を作りたい人には関係のある設定です。
水上飛行機の場合は目標高度ゼロ付近、ゼロメートルは水面にして、水面では船と同じになるようにします。


フラグ設定

VEHICLE_FLAG_NO_DEFLECTION_UP
線形偏向(速度を正面に向けようとする傾向)が方向を変えようとする成分のうち、垂直方向の成分を対象にするかをオンオフします。
元々は車などが浮き上がらずに地面を這うようにするためのフラグらしいですが、バウンドが激しいと華麗に離陸します。
VEHICLE_FLAG_LIMIT_ROLL_ONLY
垂直アトラクター(傾斜姿勢の復元傾向)の対象成分をロール(左右傾斜)のみにするかをオンオフします。
飛行機は一般的にこのフラグをオンにしてロールだけを復元対象にしますが、実物の飛行機では実は上下方向の姿勢傾斜にも復元傾向が存在します。なお、フラグをオンにしてロールだけを復元対象にしていても、上下方向の回転への影響が若干残る様です。
VEHICLE_FLAG_HOVER_WATER_ONLY
ホバー高度のゼロメートル基準点を水面にするかをオンオフします。
VEHICLE_FLAG_HOVER_TERRAIN_ONLY
ホバー高度のゼロメートル基準点を地面にするかをオンオフします。
VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
ホバー高度のゼロメートル基準点を絶対座標にするかをオンオフします。
VEHICLE_FLAG_HOVER_UP_ONLY
バグによってフラグの名前とは逆の効果を発揮します。オンにすると指定されているホバー高度よりも上に浮いている間はホバー機能が無効になります。
VEHICLE_FLAG_LIMIT_MOTOR_UP
オンにすると乗り物が地面から浮き上がろうとする効果を抑制するとの事ですが、車でオンにしても普通に離陸します。
VEHICLE_FLAG_MOUSELOOK_BANK
オンにするとマウスルックのカメラ方向で左右の姿勢傾斜が発生します。(エルロン類似)
VEHICLE_FLAG_MOUSELOOK_STEER
オンにするとマウスルックのカメラ方向で左右の首ふりが発生します。(ラダー類似)
VEHICLE_FLAG_CAMERA_DECOUPLED
オンにするとマウスルック時のカメラ方向が乗り物の向きと一致しなくなるとの事ですが・・・効果がよくわかりません。
お友達のかんなさんの情報によると上二つのマウスルックによる操作に影響を与えるとの事です。。


乗り物モーターの姿勢系

VEHICLE_REFERENCE_FRAME
線形モーター(推進エンジン)の取付け回転角をルートから見た相対回転のrotationで指定します。例えば造形の都合上で90度回転しているのが正常な乗り物に、それと逆回転を指定してやると期待通りの方向が正面方向になります。
VEHICLE_LINEAR_MOTOR_OFFSET
線形モーター(推進エンジン)の取付け位置が、乗り物の重心からずれている距離をvectorで指定します。
重心と推進エンジンがずれていると回転力になって現れますので通常は<0,0,0>のデフォルトのままでよいですが、飛行中に突然ずらすと錐もみや失速の様な急激で不思議な運動が発生するので狙って使ってみるのも面白い手だと思います。


ということで、前回のカメラ付スクリに上のデフォルトの飛行機パラメーター+回転速度だけは即座に反映、と変えて、今回の完成状態は以下の枠内になりました。
関数planeEngine()の中が増えて、全てのパラメーターを自分で調整できるようになっています。

key pilot=NULL_KEY; //パイロットのUUID
float throttle=0.0; //スロットル状態
vector angular_motor=ZERO_VECTOR; //舵操作状態
integer handle=0; //チャット傍受識別番号
integer camon=FALSE; //カメラタイプ
//-----------------------------------------
//初期化関数 init()
//-----------------------------------------
init()
{
llListenRemove(handle); //チャット傍受を解除します。
pilot=NULL_KEY; //pilotを初期化します。
llSetStatus(STATUS_PHYSICS,FALSE); //物理を切ってその場に停止させます。
camon=FALSE; //カメラタイプを初期化します。
}
//-----------------------------------------
//エンジン設定関数 planeEngine()
//-----------------------------------------
planeEngine()
{
llSetVehicleType(VEHICLE_TYPE_AIRPLANE); //乗り物タイプを飛行機にします。
// 前後方向には抵抗はとても小さい
llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <200, 10, 5> );
// 回転抵抗はどの方向も同じ
llSetVehicleVectorParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, <20,20,20> );
// 推進モーター
llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, <0, 0, 0> );
llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 2 );
llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
// 回転モーター
llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, <0, 0, 0> );
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE,0.0); //舵操作への反応速度を最高感度にします。
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 8 );
// ホバーさせない
llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0.5 );
llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 1000 );
llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0 );
// 線形偏向
llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.5 );
// 角度偏向
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 1.0 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 2.0 );
// 垂直アトラクター
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.9 );
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2 );
// バンク効果
llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 1 );
llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.7 );
llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 2 );
// 乗り物モーターの取り付け角度
llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, <0, 0, 0, 1> );
//乗り物モーターの重心からのずれ
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_OFFSET,<0,0,0>);
// これらのフラグをオフにします
llRemoveVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
| VEHICLE_FLAG_HOVER_WATER_ONLY
| VEHICLE_FLAG_HOVER_TERRAIN_ONLY
| VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
| VEHICLE_FLAG_HOVER_UP_ONLY
| VEHICLE_FLAG_LIMIT_MOTOR_UP );
// これらのフラグをオンにします
llSetVehicleFlags( VEHICLE_FLAG_LIMIT_ROLL_ONLY );
}
//-----------------------------------------
//動的カメラ設定関数 setCamera()
//-----------------------------------------
setCamera()
{
if (camon)
{
//camonがTRUE⇒カメラコントロールあり
if ((llGetPermissions() & PERMISSION_CONTROL_CAMERA) && llGetAgentSize(pilot)!=ZERO_VECTOR) //パイロットがいて、カメラコントロールがある場合だけ制御開始します。
{
list _rules=[
CAMERA_ACTIVE,TRUE,
CAMERA_BEHINDNESS_ANGLE ,0.0,
CAMERA_BEHINDNESS_LAG,0.3,
CAMERA_FOCUS_LAG,0.3,
CAMERA_FOCUS_THRESHOLD,0.0,
CAMERA_DISTANCE,3.0,
CAMERA_PITCH,5.0,
CAMERA_FOCUS_LOCKED, FALSE,
CAMERA_POSITION_LAG,0.6,
CAMERA_POSITION_THRESHOLD,0.0,
CAMERA_FOCUS_OFFSET,<0,0,0>
];
llClearCameraParams();
llSetCameraParams(_rules);
}
}
else
{
//camonがFALSE⇒コントロールなし
llClearCameraParams();
}
}
default
{
state_entry()
{
//初期化イベント
llSitTarget(<0.0,0.0,0.5>,ZERO_ROTATION); //アバターの座る位置
llSetClickAction(CLICK_ACTION_SIT); //クリックしたときの動作を「座る」にします。
llSetCameraEyeOffset(<-5.0,0.0,1.0>); //座った時のカメラの位置を指定します。
llSetCameraAtOffset(<2.0,0.0,0.0>); //座った時にカメラが見ている位置を指定します。
llSetStatus(STATUS_PHYSICS,FALSE); //物理をオフにします。
planeEngine();
}
on_rez(integer start_param)
{
init();
}
changed(integer change)
{
//プリムやスクリプトに状態変化があった場合のイベント
if (change & CHANGED_LINK)
{
//リンクが変更になった
key _av=llAvatarOnSitTarget(); //座っているアバターのUUIDを取得します。
if (_av!=NULL_KEY) //NULL_KEYでない⇒誰かが座っている。
{
if (pilot==NULL_KEY) //pilotがNULL_KEY⇒誰かが初めて座った。
{
pilot=_av; //pilotに座った人のUUIDを設定
llRequestPermissions(pilot,PERMISSION_CONTROL_CAMERA | PERMISSION_TAKE_CONTROLS); //カメラ操作とパイロットのキーやマウス操作の監視の権限を要求します
llListenRemove(handle); //今まで聞いていたかもしれないListenをやめます。
handle=llListen(0,"",pilot,""); //パイロットのチャット発言の傍受を開始します。
}
}
else //座っているアバターのUUIDがNULL_KEYなら誰かが立ち上がったか、または最初から座っていません。
{
init();
}
}
}
run_time_permissions(integer permissions)
{
//権限が許可または不許可であった場合に発生するイベント
if (permissions & PERMISSION_TAKE_CONTROLS) //アバターがキーやマウス操作の監視を許可した場合
{
//各種のキー操作の監視と、通常の動作の停止を要求します
llTakeControls(CONTROL_UP | CONTROL_DOWN | CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT | CONTROL_ML_LBUTTON | CONTROL_LBUTTON, TRUE, FALSE);
llSetStatus(STATUS_PHYSICS,TRUE); //物理をオンにします。
}
if (permissions & PERMISSION_CONTROL_CAMERA) //アバターがカメラコントロールを許可した場合
{
setCamera(); //カメラ状態を反映させます。(初期値は操作なし)
}
}
listen(integer channel, string name, key id, string message)
{
string _command=llToLower(message); //半角アルファベットをすべて小文字にします
if (_command=="c" || _command=="c" || _command=="C")
{
//コマンド”C”。飛行機では一般的にこのコマンドはカメラ操作に割り当てられます。
camon=!camon; //カメラ状態を現在と逆にします。
setCamera(); //カメラ状態を反映させます。
}
}
control(key name, integer keyPress, integer edges)
{
//llTakeControls()で要求したキー・マウス操作が行われた場合に発生するイベント
integer _keyDown=keyPress & edges; //押されているキーのうちで状態が変ったキーは今押され始めたキーです。keyPressとedgesのビット論理和(AND)を取ると取得できます。
integer _keyUp=~keyPress & edges; //押されているキーの逆のうちで状態が変ったキーは今離されたキーです。keyPressのビット反転とedgesのANDを取ると取得できます。


//--------------------------------------------------------
//スロットル(前進速度)
//PgUp(CONTROL_UP)で増速、PgDwn(CONTROL_DOWN)で減速します。
//--------------------------------------------------------
if (keyPress & CONTROL_UP) throttle=throttle+0.01; //この書き方もできるし。。
if (keyPress & CONTROL_DOWN) throttle-=0.01; //この書き方も出来ます。
if (throttle>1.0) throttle=1.0; //最大を超えそうなら最大にします。
else if (throttle<0.0) throttle=0.0; //最少を下回りそうなら最小にします。

//--------------------------------------------------------
//エルロン(ロール・左右傾斜)
//←→キー(CONTROL_ROT_LEFT/CONTROL_ROT_RIGHT)で操作します。
//--------------------------------------------------------
if (keyPress & CONTROL_ROT_LEFT) angular_motor.x-=0.1;
if (keyPress & CONTROL_ROT_RIGHT) angular_motor.x+=0.1;
if (_keyUp & CONTROL_ROT_LEFT) angular_motor.x=0.0; //飛行機では通常、キーを離したらならすぐに回転力をゼロにリセットします。
if (_keyUp & CONTROL_ROT_RIGHT) angular_motor.x=0.0;
if (angular_motor.x>1.0) angular_motor.x=1.0; //最大を超えそうなら最大にします。
else if (angular_motor.x<-1.0) angular_motor.x=-1.0; //最少を下回りそうなら最小にします。

//--------------------------------------------------------
//エレベーター(ピッチ・上下首ふり、水平尾翼)
//↑↓キー(CONTROL_FWD/CONTROL_BACK)で操作します。
//飛行機スクリプトでは慣習的に↑キーで機首下げです。
//↓キーで機首上げです。
//--------------------------------------------------------
if (keyPress & CONTROL_FWD) angular_motor.y+=0.1;
if (keyPress & CONTROL_BACK) angular_motor.y-=0.1;
if (_keyUp & CONTROL_FWD) angular_motor.y=0.0;
if (_keyUp & CONTROL_BACK) angular_motor.y=0.0;
if (angular_motor.y>1.0) angular_motor.y=1.0; //最大を超えそうなら最大にします。
else if (angular_motor.y<-1.0) angular_motor.y=-1.0; //最少を下回りそうなら最小にします。

//--------------------------------------------------------
//ラダー(ヨー・左右首ふり、垂直尾翼)
//SHIFT+←→キー(CONTROL_LEFT/CONTROL_RIGHT)で操作します。
//--------------------------------------------------------
if (keyPress & CONTROL_LEFT) angular_motor.z+=0.1;
if (keyPress & CONTROL_RIGHT) angular_motor.z-=0.1;
if (_keyUp & CONTROL_LEFT) angular_motor.z=0.0;
if (_keyUp & CONTROL_RIGHT) angular_motor.z=0.0;
if (angular_motor.z>1.0) angular_motor.z=1.0; //最大を超えそうなら最大にします。
else if (angular_motor.z<-1.0) angular_motor.z=-1.0; //最少を下回りそうなら最小にします。

llSetForce(<0.0,0.0,llGetMass()*9.8*throttle>,TRUE); //揚力を設定
//速度の最大値を27.0m/sで、それに0.0~1.0をかけて設定します。
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION,<27.0*throttle,0.0,0.0>);
//ロール、ピッチ、ヨー回転にそれぞれ最大値に現在の状態をかけて設定します。
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION,<10.0*angular_motor.x,1.0*angular_motor.y,0.5*angular_motor.z>);
}
}



説明が舌足らずな部分もあるかと存じますが、パラメーターを色々いじって調整して体感する方が早いと思います。
次回は、タイマーを組み込んでもう少し細かく挙動を調整する方法を書いてみたいと思います。


ひとつ前を読む


タグ :lsl飛行機

同じカテゴリー(LSLで作る)の記事画像
飛行機をつくる:(1)~もっとも短い(?)飛行機のサンプル
同じカテゴリー(LSLで作る)の記事
 飛行機をつくる:(2) カメラコマンドをつける (2016-01-27 03:49)
 飛行機をつくる:(1)~もっとも短い(?)飛行機のサンプル (2016-01-24 23:46)

Posted by RBK Drachnyd(しお) at 21:04│Comments(0)LSLで作る
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。