オブジェクトの動作制限を行うことができるのか?
という疑問のもとネットで検索。
そうしたら、
http://rag.moe-nifty.com/miya/2007/03/post_89e5.html
という記事が。
どうやらできるみたい。
地面をクリックしたあと、「土地情報」から設定ができる模様。
なので、
「飛ぶことを禁止する区画」とか
「オブジェクトを置けない区画」とか
できる・・・
はず。
オブジェクトの動作制限を行うことができるのか?
という疑問のもとネットで検索。
そうしたら、
http://rag.moe-nifty.com/miya/2007/03/post_89e5.html
という記事が。
どうやらできるみたい。
地面をクリックしたあと、「土地情報」から設定ができる模様。
なので、
「飛ぶことを禁止する区画」とか
「オブジェクトを置けない区画」とか
できる・・・
はず。
これまでに書いたように、
パーティクルを生成するには、関数としてはひとつでいいが、
実際に値を設定するとなると
パラメータの数が半端なく多い。
なので、
パラメータの意味がわかるようにある程度のものを
入力形式でコードを生成するプログラムを作成。
まだかなり適当に作っているので、コードとしては不完全な部分があると思いますが、
使いましょう。
んで、改良しましょう。
■■■パーティクルパラメータ生成プログラム■■■
ちなみにこれで生成されるコードは、
変数の設定値と処理をする関数。
stateがon、offでパーティクル処理を動かす or パーティクル処理を終了する
をわける関数を作成している。
ちなみにパーティクル処理を終わらすには、
パーティクルのリスト項目を「なし」にすればいい。
パーティクルを使って色々するには、
01~03までの
処理を行い、なにかしらの方法で判別を行えばよい。
なるほど。そこまでこれは難しくなかった。
パーティクルを作成するときに使えるテンプレート
※すべての設定をまずは有効にしてある。
-----------------------------------------------
integer PART_BOUNCE_MASK =0;
integer PART_EMISSIVE_MASK = PSYS_PART_EMISSIVE_MASK; //=0;
integer PART_FOLLOW_SRC_MASK = PSYS_PART_FOLLOW_SRC_MASK;//=0;
integer PART_FOLLOW_VELOCITY_MASK = PSYS_PART_FOLLOW_VELOCITY_MASK;//=0;
integer PART_INTERP_COLOR_MASK = PSYS_PART_INTERP_COLOR_MASK; //=0;
integer PART_INTERP_SCALE_MASK = PSYS_PART_INTERP_SCALE_MASK; //=0;
integer PART_TARGET_LINEAR_MASK = PSYS_PART_TARGET_LINEAR_MASK; //=0
integer PART_TARGET_POS_MASK = PSYS_PART_TARGET_POS_MASK; //=0;
integer PART_WIND_MASK = PSYS_PART_WIND_MASK; //=0;
integer PART_PATTERN = PSYS_SRC_PATTERN_EXPLODE ;
//PSYS_SRC_PATTERN_ANGLE;
//PSYS_SRC_PATTERN_ANGLE_CONE;
//PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY;
//PSYS_SRC_PATTERN_DROP;
float PART_START_ALPHA = 1.0;
float PART_END_ALPHA = 0.0;
vector PART_START_COLOR = <1.0,1.0,1.0>;
vector PART_END_COLOR = <0.6,0.6,0.6>;
vector PART_START_SCALE = <0.32,0.32,0.0>;
vector PART_END_SCALE = <4.0,4.0,0.0>;
float SRC_MAX_AGE = 0.0;
float PART_MAX_AGE = 4.5 ;
vector PART_ACCEL = <0.0,0.0,0.2>;
float PART_ANGLE_BEGIN = PI ;
float PART_ANGLE_END = PI ;
integer PART_BURST_COUNT = 4 ;
float PART_BURST_RADIUS = 0.0 ;
float PART_BURST_RATE = 0.0 ;
float PART_BURST_SPEED_MIN = 0.2 ;
float PART_BURST_SPEED_MAX = 0.3 ;
vector PART_OMEGA = <0.0,0.0,0.0> ;
string PART_TEXTURE = "ここにテクスチャの名前" ;
key PART_TARGET_KEY = NULL_KEY ;
パーティクルのパラメータの説明概略
-------------------------------------
□変更できるかできないかのみの設定
■integer PART_BOUNCE_MASK=0;
オブジェクトのZ軸の高さより下にパーティクルが行かない。
■integer PART_EMISSIVE_MASK = PSYS_PART_EMISSIVE_MASK;
⇒キラキラ光る
⇒有効にするときは、PSYS_PART_EMISSIVE_MASKをセット。無効は0。
■integer PART_FOLLOW_SRC_MASK=0;
⇒オブジェクトと一緒にパーティクルが動くか否か。有効にするとオブジェクトの動きにあわせてパーティクルも動く
⇒有効にするときは、PSY_PART_FOLLOW_SRC_MASKをセット、無効は0。
■integer PART_FOLLOW_VELOCITY_MASK=0;
⇒パーティクルが回転するかしないか。
⇒有効にするときは、PSYS_PART_FOLLOW_VELOCITY_MASK、無効は0。
■integer PART_INTERP_COLOR_MASK=PSYS_PART_INTERP_COLOR_MASK;
⇒パーティクルの色が変わるようにする。
⇒有効ではPSYS_PART_INTERP_COLOR_MASK、無効は0。
■integer PART_INTERP_SCALE_MASK=PSYS_PART_INTERP_SCALE_MASK;
⇒パーティクルのサイズを可変にするか否か。
⇒有効はPSYS_PART_INTERP_SCALE_MASK、無効は0。
■integer PART_TARGET_LINEAR_MASK=0;
⇒パーティクルがターゲットに向かって一直線にとんでいく。
⇒有効は、PSYS_PART_TARGET_LINEAR_MASK、無効は0。
■integer PART_TARGET_POS_MASK=0;
⇒ターゲットに向かって飛んでいく。ホーミングミサイルのように。
⇒有効は、PSYS_PART_TARGET_POS_MASK、無効は0。
■integer PART_WIND_MASK=PSYS_PART_WIND_MASK;
⇒風に流されるかどうか。
⇒有効はPSYS_PART_WIND_MASK、無効は0。
□パターンとか
■integer PART_PATTERN=パターン定義
パーティクルの発生の形状を決める
以下パターン定義
◇PSYS_SRC_PATTERN_EXPLODE;
⇒爆発
◇PSYS_SRC_PATTERN_ANGLE;
⇒平面型(扇型に噴射)
◇PSYS_SRC_PATTERN_CONE;
⇒コーン型(コーン状に噴射)
◇PSYS_SRC_PATTERN_CONE_EMPTY
⇒逆コーン型(上記の逆)
◇PSYS_SRC_PATTERN_DROP
⇒ドロップ型(ポトンと落ちる)
□詳細パラメータ
■float PART_START_ALPHA=1.0;
■float PART_END_ALPHA=1.0;
⇒1.0:完全不透明。0.0:完全透明
■vector PART_START_COLOR = <1.0,1.0,1.0>;
■vector PART_END_COLOR = <0.6,0.6,0.6>;
⇒RGBの値で設定。ただし、0.0~1.0の範囲。
■vector PART_START_SCALE = <0.32,0.32,0.0>;
■vector PART_END_SCALE = <4.0,4.0,0.0>;
⇒パーティクルのサイズ。最大値4.0でXY座標のみ(パーティクルは平面に見えるため)
■float SRC_MAX_AGE =0.0;
⇒パーティクルの有効時間。単位は秒。値を0にするとずっと噴射。
■float PART_MAX_AGE =0.0;
⇒ひとつのパーティクルの有効時間。単位は秒。透明度などはこのパラメータを基準に動く。
■vector PART_ACCEL = <0.0,0.0,0.3>
⇒パーティクルの加速度。
■float PART_ANGLE_BEGIN=PI;
■float PART_ANGLE_END=PI;
⇒アングルの開始及び終了角度の指定
■integer PART_BURST_COUNT =4;
⇒一度にいくつ発射するか。
■float PART_BURST_RADIUS =0.0;
⇒パーティクルを噴射するときの半径。
■float PART_BURST_RATE=0.0;
⇒どのくらいの間隔でパーティクルを発射するか。
■float PART_BURST_SPEED_MIN = 0.2;
■float PART_BURST_SPEED_MAX = 0.3;
⇒噴射されるときの最小スピードと最大スピード
■vector PART_OMEGA = <0.0,0.0,0.0>;
⇒パーティクルの噴射方向を回転させる。
■string PART_TEXCUTE = "past_sound";
⇒パーティクルのテクスチャを指定
■key PART_TARGET_KEY = NULL_KEY;
⇒パーティクルが飛んでいくターゲットのキーを指定
パーティクルとは粒子状のオブジェクト。
例えば、
煙、霧、水しぶき、噴水の水、滝、炎、火花、爆発、花火、花吹雪、落ち葉、雨、雪
など。
これらはスクリプトでしか制御できまへん。
しかもパーティクルを制御する関数は
llParticleSystem(list param);
だけ。
こいつを使うだけでできるらしい。
では、そのパラメータは?
ということで、
まず、引数を見てみると、listつまり配列形式となる。
中身は一つ(配列)ということなので、
パラメータは多いがそれらを一つのライブラリにしておくと楽とのこと。
これらのパラメータは次回。(かなり多い。)
パーティクルを使って色々するには、
01~03までの
処理を行い、なにかしらの方法で判別を行えばよい。
なるほど。そこまでこれは難しくなかった。
パーティクルを作成するときに使えるテンプレート
※すべての設定をまずは有効にしてある。
-----------------------------------------------
integer PART_BOUNCE_MASK =0;
integer PART_EMISSIVE_MASK = PSYS_PART_EMISSIVE_MASK; //=0;
integer PART_FOLLOW_SRC_MASK = PSYS_PART_FOLLOW_SRC_MASK;//=0;
integer PART_FOLLOW_VELOCITY_MASK = PSYS_PART_FOLLOW_VELOCITY_MASK;//=0;
integer PART_INTERP_COLOR_MASK = PSYS_PART_INTERP_COLOR_MASK; //=0;
integer PART_INTERP_SCALE_MASK = PSYS_PART_INTERP_SCALE_MASK; //=0;
integer PART_TARGET_LINEAR_MASK = PSYS_PART_TARGET_LINEAR_MASK; //=0
integer PART_TARGET_POS_MASK = PSYS_PART_TARGET_POS_MASK; //=0;
integer PART_WIND_MASK = PSYS_PART_WIND_MASK; //=0;
integer PART_PATTERN = PSYS_SRC_PATTERN_EXPLODE ;
//PSYS_SRC_PATTERN_ANGLE;
//PSYS_SRC_PATTERN_ANGLE_CONE;
//PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY;
//PSYS_SRC_PATTERN_DROP;
float PART_START_ALPHA = 1.0;
float PART_END_ALPHA = 0.0;
vector PART_START_COLOR = <1.0,1.0,1.0>;
vector PART_END_COLOR = <0.6,0.6,0.6>;
vector PART_START_SCALE = <0.32,0.32,0.0>;
vector PART_END_SCALE = <4.0,4.0,0.0>;
float SRC_MAX_AGE = 0.0;
float PART_MAX_AGE = 4.5 ;
vector PART_ACCEL = <0.0,0.0,0.2>;
float PART_ANGLE_BEGIN = PI ;
float PART_ANGLE_END = PI ;
integer PART_BURST_COUNT = 4 ;
float PART_BURST_RADIUS = 0.0 ;
float PART_BURST_RATE = 0.0 ;
float PART_BURST_SPEED_MIN = 0.2 ;
float PART_BURST_SPEED_MAX = 0.3 ;
vector PART_OMEGA = <0.0,0.0,0.0> ;
string PART_TEXTURE = "ここにテクスチャの名前" ;
key PART_TARGET_KEY = NULL_KEY ;
パーティクルのパラメータの説明概略
-------------------------------------
□変更できるかできないかのみの設定
■integer PART_BOUNCE_MASK=0;
オブジェクトのZ軸の高さより下にパーティクルが行かない。
■integer PART_EMISSIVE_MASK = PSYS_PART_EMISSIVE_MASK;
⇒キラキラ光る
⇒有効にするときは、PSYS_PART_EMISSIVE_MASKをセット。無効は0。
■integer PART_FOLLOW_SRC_MASK=0;
⇒オブジェクトと一緒にパーティクルが動くか否か。有効にするとオブジェクトの動きにあわせてパーティクルも動く
⇒有効にするときは、PSY_PART_FOLLOW_SRC_MASKをセット、無効は0。
■integer PART_FOLLOW_VELOCITY_MASK=0;
⇒パーティクルが回転するかしないか。
⇒有効にするときは、PSYS_PART_FOLLOW_VELOCITY_MASK、無効は0。
■integer PART_INTERP_COLOR_MASK=PSYS_PART_INTERP_COLOR_MASK;
⇒パーティクルの色が変わるようにする。
⇒有効ではPSYS_PART_INTERP_COLOR_MASK、無効は0。
■integer PART_INTERP_SCALE_MASK=PSYS_PART_INTERP_SCALE_MASK;
⇒パーティクルのサイズを可変にするか否か。
⇒有効はPSYS_PART_INTERP_SCALE_MASK、無効は0。
■integer PART_TARGET_LINEAR_MASK=0;
⇒パーティクルがターゲットに向かって一直線にとんでいく。
⇒有効は、PSYS_PART_TARGET_LINEAR_MASK、無効は0。
■integer PART_TARGET_POS_MASK=0;
⇒ターゲットに向かって飛んでいく。ホーミングミサイルのように。
⇒有効は、PSYS_PART_TARGET_POS_MASK、無効は0。
■integer PART_WIND_MASK=PSYS_PART_WIND_MASK;
⇒風に流されるかどうか。
⇒有効はPSYS_PART_WIND_MASK、無効は0。
□パターンとか
■integer PART_PATTERN=パターン定義
パーティクルの発生の形状を決める
以下パターン定義
◇PSYS_SRC_PATTERN_EXPLODE;
⇒爆発
◇PSYS_SRC_PATTERN_ANGLE;
⇒平面型(扇型に噴射)
◇PSYS_SRC_PATTERN_CONE;
⇒コーン型(コーン状に噴射)
◇PSYS_SRC_PATTERN_CONE_EMPTY
⇒逆コーン型(上記の逆)
◇PSYS_SRC_PATTERN_DROP
⇒ドロップ型(ポトンと落ちる)
□詳細パラメータ
■float PART_START_ALPHA=1.0;
■float PART_END_ALPHA=1.0;
⇒1.0:完全不透明。0.0:完全透明
■vector PART_START_COLOR = <1.0,1.0,1.0>;
■vector PART_END_COLOR = <0.6,0.6,0.6>;
⇒RGBの値で設定。ただし、0.0~1.0の範囲。
■vector PART_START_SCALE = <0.32,0.32,0.0>;
■vector PART_END_SCALE = <4.0,4.0,0.0>;
⇒パーティクルのサイズ。最大値4.0でXY座標のみ(パーティクルは平面に見えるため)
■float SRC_MAX_AGE =0.0;
⇒パーティクルの有効時間。単位は秒。値を0にするとずっと噴射。
■float PART_MAX_AGE =0.0;
⇒ひとつのパーティクルの有効時間。単位は秒。透明度などはこのパラメータを基準に動く。
■vector PART_ACCEL = <0.0,0.0,0.3>
⇒パーティクルの加速度。
■float PART_ANGLE_BEGIN=PI;
■float PART_ANGLE_END=PI;
⇒アングルの開始及び終了角度の指定
■integer PART_BURST_COUNT =4;
⇒一度にいくつ発射するか。
■float PART_BURST_RADIUS =0.0;
⇒パーティクルを噴射するときの半径。
■float PART_BURST_RATE=0.0;
⇒どのくらいの間隔でパーティクルを発射するか。
■float PART_BURST_SPEED_MIN = 0.2;
■float PART_BURST_SPEED_MAX = 0.3;
⇒噴射されるときの最小スピードと最大スピード
■vector PART_OMEGA = <0.0,0.0,0.0>;
⇒パーティクルの噴射方向を回転させる。
■string PART_TEXCUTE = "past_sound";
⇒パーティクルのテクスチャを指定
■key PART_TARGET_KEY = NULL_KEY;
⇒パーティクルが飛んでいくターゲットのキーを指定
パーティクルとは粒子状のオブジェクト。
例えば、
煙、霧、水しぶき、噴水の水、滝、炎、火花、爆発、花火、花吹雪、落ち葉、雨、雪
など。
これらはスクリプトでしか制御できまへん。
しかもパーティクルを制御する関数は
llParticleSystem(list param);
だけ。
こいつを使うだけでできるらしい。
では、そのパラメータは?
ということで、
まず、引数を見てみると、listつまり配列形式となる。
中身は一つ(配列)ということなので、
パラメータは多いがそれらを一つのライブラリにしておくと楽とのこと。
これらのパラメータは次回。(かなり多い。)
セカンドライフ内で文字を表示させる方法に
llSay()があるが、
これは、20070620現在日本語の入力ができない。
そこで、別の手法として、
「utf8をURLエンコードした文字列を llUnescapeURLすることで表示可能」
とのことなので、
やってみた。
その際に使わせてもらったHP
http://ryus.co.jp/mini/text2utf8url.php
ここの入力フィールドに表示させたい文字列を入力し、変換。
そのあと、
llSay(0,表示されるコード)
で表記が可能。
なるほど~。
どうやら、ワールド座標とローカル座標があるようだが、
意味は、わかるがそれが、実際どうなっているのかがよくわからん。
特に球体はオブジェクトを生成したときに
変な座標系になるような・・・。
でグループ化したときに果たして・・・という感じ。
座標系に関してはもう少し調査が必要。
キントウンが作成されたが、
物理属性がいまいち邪魔をする。
ちゃんと座れるように四角を用意したが、
逆に四角が地面とこすれて、摩擦で動かない。
また飛ぶときに
飛行機仕様にしているが、
なぜか旋回して、しまう。
これもまた調査が必要じゃ。
llSitTargetの第2引数である回転についての補足説明
この回転はベクトル変数なので、
x,y,zすべてに値を代入しないといけない。
しかもこの値はラジアン値。
なので、結構面倒くさい。
そこで、
角度入力の値をラジアン変換してくれるような便利なものがある。
llEuler2Rot()というもの。
使用例)
llEuler2Rot(<0.0, 0.0, 270.0> * DEG_TO_RAD)
という風に使う。
これをllSitTargetの第2引数にぶち込むとOK。というわけ。
なるほど。
integer omegumi = 1;
default{
state_entry(){
llRequestPermissions(llGetOwner(),PERMISSION_DEBIT);
//許可をもらうアバターのキーと許可の種類
}
money(key id,integer amount){//このイベントで支払い画面ができる
if(amount != omegumi){//omegumiではなかったら返金する
llGiveMoney(id,amount);
}
}
}
-----------
流れとしては、
1.お恵みをくれる人に対して、支払いのパーミッションを与える
llGetOwner()で相手のidを取得して、そのidに対して「支払い」というパーミッションを与える
⇒これで、お恵みをくれる人が決定する
2.支払いをしてもらう
moneyイベントが表示されると、相手のメニューに支払い項目が表示される。
第1引数は相手のid、第2引数は払ったお金。
3.そのお恵みの値段が、指定したリンデンドルでなかった場合返金する。
llGiveMoney(id,amount)でお金をidの人にあげるという方法をとる。
⇒この判断をするために、スクリプトの頭にomegiumi=1としてる。
ということ。
今回はomegumi=1と指定しているが、
これを指定しない場合、とことんお金をいただくことはできる。
おめぐみくだせ~。
□チュートリアルより引用
直線モーターを制御するパラメータ。
■VEHICLE_LINEAR_MOTOR_DIRECTION : ベクター値
⇒乗り物の目標速度(メートル/秒)、最大40:(時速144km相当)
■VEHICLE_LINEAR_MOTOR_OFFSET : ベクター値
⇒直線モーターの力が加わる場所の、乗り物の質量の中心(重心)からのオフセット位置
※この値はデリケートなものでもあるので小さい値から設定していくこと。
■VEHICLE_LINEAR_MOTOR_TIMESCALE : フロート値
⇒乗り物のモーターが ”VEHICLE_LINEAR_MOTOR_DIRECTION” で設定した目標速度まで
どれくらいの時間で到達するのかを設定する。最小値は0.06秒
■VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE : フロート値
⇒モーターの効力がこの値によって指数関数的に減衰する。最大値120秒。常に有効
だってこれがないと止まらないっしょ?暴走機関車になってしまいます。
直線モーターに影響するフラグは
■VEHICLE_FLAG_LIMIT_MOTOR_UP :
地上を走る乗り物につかうフラグ。例えば、浮いたときとかに重力の影響を与える。
角度モーターを制御するパラメータ
■VEHICLE_ANGULAR_MOTOR_DIRECTION : ベクター値
⇒乗り物を回転させるときのラジアン値を指定するもの。毎秒○○ラジアン
■VEHICLE_ANGULAR_MOTOR_TIMESCALE :フロート値
⇒乗り物の回転速度が ”VEHICLE_ANGULAR_MOTOR_DIRECTION”で指定した値になるまでの時間
最小値は0.06秒。
■VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE : フロート値
⇒モーターの回転効力が指数関数的に減衰
■VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY :フロート値
⇒上昇または加工のときにどれだけピッチに影響をおよぼすかの値を指定。
0.0なら影響なし1.0なら垂直上昇で機首が上を向く。
■VEHICLE_ANGULAR_DEFLECTION_TIMESCALE : フロート値
⇒VEHICLE_ANGULAR_DEFLECTION_EFFICIENCYがどれくらいで有効になるかを指定
とりあえず。今はこんなところ。
挑戦しているものは「乗り物系」。
処理としては、
1.コントロールキー上で前進
2.コントロールキー下で後退
3.左右キーで右左折
4.UPキーで上昇
5.Downキーで下降
って感じのカンタンなものを考えている。
だけど、なんか色々な設定が必要なのか、
うまくいかない。
困ったなぁ。
座る位置とかそのあたりの微調整もうまくいかない。
もう少し調べてみる必要がある模様。llSitTargetは
座る位置の設定を行うもので、引数は
llSitTarget("座る座標のオフセット値","回転")
ということみたい。
引数の値をゼロベクタにしてしまうと、
座ってないよという感知になってしまうらしく、
座ったことを感知させたいならば、ちょろっとでも真ん中からずらすこと。
で、プリムを使うときに回転角度を考えるように。
llSitTargetは
座る位置の設定を行うもので、引数は
llSitTarget("座る座標のオフセット値","回転")
ということみたい。
引数の値をゼロベクタにしてしまうと、
座ってないよという感知になってしまうらしく、
座ったことを感知させたいならば、ちょろっとでも真ん中からずらすこと。
で、プリムを使うときに回転角度を考えるように。