乗物を進行方向に向ける
非物理でも llSetKeyfaramedMotion を用いることで、スムースな動きを作ることができます。このときに姿勢を進行方向に合わせるにはどうするかという質問があったので、ここにその方法を説明します。乗物が現在向いている方向 now_arrow を、移動先を向く方向 new_arrow に回転させる new_rotation は llRotBetween関数を使って次のように求められます。
new_rotation = llRotBetween(now_arrow, new_arrow);
移動がX-Y平面に限られる場合は、これでOKです。
移動が上下方向にも動く場合は、やっかいな問題が生じます。上記の方法で回転させると、向きの回転に伴って乗物の前後軸(X軸)を中心にする回転、ロール(roll)が生じます。下手をすると車体が裏返しになったりしてしまいます。
ロールなしに向きだけ変えるには、まず水平(X-Y平面上)で回転させたのちに上下方向の傾きを加えるようにします。
目標地点があまりに近いときや、ほぼ垂直移動の場合に向きがコロコロ変わるのも防いでおかねばなりません。
float TOO_CLOSE = 1.0; //meter, skip rotation
float SMALL_TILT = 0.1; //0.0-1.0, skip rotation when horizontal movement is small
vector STD_ARROW = <1.0, 0.0, 0.0>; //headding east
rotation new_rotation(vector pos)
{
vector now_pos = llGetPos();
rotation now_rot = llGetRot();
rotation new_rot = ZERO_ROTATION;
vector now_arrow = STD_ARROW*now_rot;
vector arrow = pos - now_pos;
vector h_arrow = arrow;
h_arrow.z = 0.0;
h_arrow = llVecNorm(h_arrow);
if ( llVecMag(arrow) < TOO_CLOSE ) return ZERO_ROTATION;
if ( llVecMag(h_arrow) < SMALL_TILT ) return ZERO_ROTATION;
new_rot = llRotBetween(STD_ARROW, h_arrow)*llRotBetween(h_arrow, arrow)/now_rot;
return new_rot;
}
基本は上記のようなやり方になります。これに急角度に曲がることに制限を加えたり、気球のようにZ軸の姿勢は動かさない場合とか、曲がるときにバンクを加えたりなどのアレンジはもう少し複雑になります。
No comments - Edit - Delete
ヘリの改造(2)スクリ構成
ヘリの改造(1)の続きです。非物理のヘリコプター各プリムに入っているスクリプトとその働きを列記します。
ルート・プリム(Base)内のスクリプト
NonPhysicsHelicopter - 動きを制御するエンジン部分、メイン・スクリプトです。
sitpose - アバターの座る位置や固定カメラ、アニメーションを司るスクリプトです。座る位置、固定カメラ位置はノートカード SITCONFIG に記述します。スクリプトの変更は必要ありません。アニメはプリム内にあるものを自動的に採用します。プリム内にはアニメを一つだけ入れてください。
FollowCamera - アバターを追いかける Follow Cameraの設定はこちらのスクリプトで指定します。固定カメラの位置指定は SITCONFIG でと、それぞれ別になります。
messenger - パイロットにInstantMessageを送るとメイン・スクリプトが一時停止しますので、それを避けるために、その仕事だけをこのスクリプトが担当します。変更の必要はありません。
WaterSplash - 水中に入ったときに水しぶきを上げるスクリプト。水しぶきのテクスチャは goo です。「バシャーン」という音は、このスクリプト冒頭で指定します。
AutoReturn - 乗物を乗り捨てて一定時間経つと自動的に出発地点に戻ります。この機能が必要なければ取り除いてください。待ち時間はスクリプト冒頭で指定できます。
main propella内のスクリプト
screw texture rotator - プロペラは薄い円盤にプロペラの形をテクスチャで貼ったもの。このスクリプトはこのテクスチャを回転させます。
プロペラが1プリムの場合はテクスチャを回転させるのではなくプリムを回転させることができます。その場合は次のスクリプトに変更してください。
string KEYWORD = "engine";
vector AXIS = <0.0, 0.0, -1.0>;
integer INITIAL_RPS = 0;
float TIME_LAG = 1.0;
float last_omega = 0.0;
run(integer speed)
{
float w = 2.0*PI*(float)speed;
llTargetOmega(AXIS, (0.3*w + 0.7*last_omega), 1.0);
llSleep(TIME_LAG);
if (speed)
{
llTargetOmega(AXIS, w, 1.0);
}
else llTargetOmega(AXIS, 0.0, 0.0);
last_omega = w;
}
default
{
state_entry()
{
run(INITIAL_RPS);
}
link_message(integer sender, integer num, string text, key id)
{
if ( text == KEYWORD ) run(num);
}
}
rear propella
main propella と同じスクリプトが入っています。プリムを回転させる場合は、さきに示したスクリプトのうち冒頭部分にある AXIS を下記のように回転軸をY軸に変更したものを入れてください。
vector AXIS = <0.0, 1.0, 0.0>;
front seat, rear seat right, rear seat left
それぞれに sitpose と SITCONFIG がアニメとともに、また FollowCamera が入っています。
light
LightDimmerNoTouch - ライトを点滅します。
No comments - Edit - Delete
ヘリの改造(1)部品
Shinobar Annexスクリプトの館などで入手できる非物理のヘリコプターはコピー改変可。機体を入れ替えるなど、この改造法を記します。すでに他の乗物改造の経験のある方はご承知でしょう。機体の下部に透明なルート・プリムがあり、これがエンジンとなり、主要なスクリプトはここに入っています。上の図は「リンク部分を編集」で、このプリムの透明度を50%に変更して見せています。青色に塗ってあります。
ルート・プリム以外に子プリムにもスクリプトが入っているものがあります。それを示したものが下の図です。このヘリコプターの場合、ライトはルート・プリムである土台に埋まっており、土台部分を移動しけなければ取り出せません。
円盤状のプリムを座席の上に置いてアバターを座らせています。パイロットはロート・プリムである土台に座ることになるので、パイロット用の円盤はありません。
各プリムに組み込まれているスクリプトについては次の記事 ヘリの改造(2) をお読みください。
No comments - Edit - Delete
非物理のヘリコプター
物理を使わない乗物の第一弾として、非物理のヘリコプターをリリースしました。Japan Open Grid(JOG)内Canyonの Boat Terminalで試乗ができます。これをコピーしてもらっていいですが、併せて Shinobar Annex スクリプトの館でも無料配布しています。操作法
[Page Up]/[Page down]が上昇/下降、矢印キーで前後移動と左右回転、[Shift]+左右キーでは姿勢を変えることなく左右にスライドします。ギアというかスロットル操作はありません。飛行中に機体をクリックするとカメラ位置が切り替わり、コックピット内の視点が楽しめます。
物理と非物理
Secondlife でも Opensim でも出回っているヘリコプターのスクリプトは iTec のものがメジャーです。それらは物理を使っています。しかし非物理でも llSetKeyfaramedMotion を用いることで、スムースな動きを得ることは可能です。そこで作ったものが非物理のヘリコプターです。加速・減速などもそれらしく再現しています。
非物理の利点は、サーバーへの負荷が軽く、リージョン境界でもデッドロックがないことです。また比較的楽にリージョンを越えることができます。いっぽうの難点は、衝突判定がなくファントムのような振る舞いをするので、建物などをすり抜けてしまうことです。
建物などをすり抜けてしまうことの対処のため、屋上にヘリパッドを置き、これを検知してその上に着陸させるようにしました。それでも建物の横からだと普通にすり抜けてしまいます。
改造
このヘリはフルパー、コピー改変可です。機体の入れ替えなど改造法の詳細は述べませんが、次の記事を参考にしてください。
ヘリの改造(1)部品
ヘリの改造(2)スクリ構成
(初稿:4 Apr 2018, 0:25)
No comments - Edit - Delete
ブログ開設
これまで そらまめブログ で Secondlifeや OpenSimの話題を書いてきましたが、どうも使い勝手が悪いと感じてきました。そこで自前でブログを開設することとしました。URLは http://shino.pos.to/secondlife/blog/ です。 仮想世界Japan Open Grid(JOG) など OpenSimの話題を扱っていきます。よろしくお願いします。
No comments - Edit - Delete