ソラマメブログ
< 2024年04月 >
S M T W T F S
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
Mail

2007年05月03日

script:しつこいPOP(6)

pestyAD links
script:しつこいPOP(6)

しつこいPOPの仕組みは前のエントリーに書いた通り、
その場にとどまるパーティクルです。

今回は詳細の説明です。
ソースコードはエントリーの最後に公開してあります。

script:しつこいPOP(6)
まず、下準備として、プリムを何かしら置いておきます。
タッチしたりやパイメニューを出すことができるように
表示するPOPとほぼ同じ大きさにします。
(パーティクルはマウス操作に反応しないのです。)
この例ではCylinderを置いておきました。
横から見たとき四角っぽくなるのと、
(上下動しない限り)どの角度から見ても同じ形になるからです。
でも、BoxでもSphereでも何でもいいです。

そしてその中にPOPのテクスチャと下記ソースのモジュール、
モジュールを利用するメインのscriptを入れて置きます。

このプリムは透明にして置いてください。
llSetAlpha(0,ALL_SIDES);
とかscriptで書くと良いです。

ところで。scriptでalphaを0に設定したプリムは
右クリックに反応してパイメニューを表示できますが、
透明のテクスチャを貼り付けた場合はそれができないんですね。
先ほど気づきました。
透明テクスチャであってもeditモードに入れば触る事ができますが…。


POPのパーティクルはこのプリムの真ん中に表示されます。
さて、scriptはパーティクルを作る部分だけを例によって
モジュール(と勝手に呼んでいる)形式にまとめました。

パーティクルのパラメータは膨大なので、
使いやすい汎用化した関数を作ることは難しいです。

しかし、用途によってお決まりのパターンはできてくるでしょうし、
その中で微調整したいパラメータという物も出てくると思うので、
今回の場合はその場にとどまるPOPを出すためだけの関数を作り、
再利用しやすくするため、モジュールの形にしたわけです。

まあ、コピペでも全然いいんですが、1つのソースが長くなると
見通しが悪くなったり、変数名がかぶったりしますので…。
この辺り、好みです。

また、もっと良いモジュールの作り方もあると思います。
自分でこしらえることで、色々勉強になると思いやってます。
モジュールをまとめた、ライブラリ集みたいなプリムがあるといいかもですね。
探せばもうあるかな。

◆ソースコード(単体では動きません)
モジュール化のため、複雑&冗長になっているので、
今回のパーティクルを作成するパラメータ設定については、
ShowParticle関数の中だけ見てください。

//StableParticle Module ver 1.00
// by harayoki 2007/5/2
integer debug = FALSE;
Trace(string s){
if(debug) llOwnerSay(s);
}
string COMMAND_NAME = "harayoki.stablePtcl";
integer ARGUMNET_LENGTH = 5;
string ARGUMENT_SEP = " ";
list MyString2List(string s,string sep,integer len){
list res = [];
list l = llParseString2List(s,[sep],[]);
integer listLen = llGetListLength(l);
integer i;
if(len<=0) return res;
if(listLen<len) for(i=0;i<len-listLen;i++) l += [""];
for(i=0;i<-1+len;i++) res += [llList2String(l,i)];
res += llDumpList2String(llList2List(l,i,-1),sep);
return res;
}
ShowParticle(list l){
Trace("ShowParticle "+llDumpList2String(l,","));
integer bOn = (llList2String(l,1) == "TRUE");
if(!bOn){
HideParticle();
return;
}
list dat = [];
integer flag = PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_FOLLOW_SRC_MASK;
//fullBright
integer bFullBright = (llList2String(l,5)=="TRUE");
Trace("fullBright : "+(string)bFullBright);
if(bFullBright) flag = flag | PSYS_PART_EMISSIVE_MASK;
dat += [PSYS_PART_FLAGS,flag];
//pattern
dat += [PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_ANGLE];
//texture
string texture = llList2String(l,2);
Trace("texture : "+texture);
dat += [PSYS_SRC_TEXTURE,texture];
//color
vector col = (vector)llList2String(l,3);
Trace("color : "+(string)col);
dat += [PSYS_PART_START_COLOR,col];
dat += [PSYS_PART_END_COLOR,col];
//alpha
float alpha = 1.0;
dat += [PSYS_PART_START_ALPHA,alpha];
dat += [PSYS_PART_END_ALPHA,alpha];
//scale
vector scale = (vector)llList2String(l,4);
Trace("scale : "+(string)scale);
dat += [PSYS_PART_START_SCALE,scale];
dat += [PSYS_PART_END_SCALE,scale];
//ptcl angles
dat += [PSYS_SRC_ANGLE_BEGIN,PI];
dat += [PSYS_SRC_ANGLE_END,PI];
//speed
dat += [PSYS_SRC_ACCEL,<0,0,0>];
dat += [PSYS_SRC_BURST_SPEED_MIN,0.0];
dat += [PSYS_SRC_BURST_SPEED_MAX,0.0];
//rotation
dat += [PSYS_SRC_OMEGA,<0,0,0>];
//about a ptcl
float lifetime = 1.0;
dat += [PSYS_SRC_BURST_RATE,lifetime];
dat += [PSYS_PART_MAX_AGE,lifetime];
dat += [PSYS_SRC_BURST_PART_COUNT,1];
//emitter lifetime
dat +=[PSYS_SRC_MAX_AGE,0.0];

llParticleSystem(dat);
}
HideParticle(){
Trace("HideParticle ");
llParticleSystem([]);
}
default{
state_entry(){
HideParticle();
}
on_rez(integer num){
llResetScript();
}
link_message(integer sender,integer num,string s,key id){
if(llSubStringIndex(s+ARGUMENT_SEP,COMMAND_NAME)==0) ShowParticle(MyString2List(s,ARGUMENT_SEP,ARGUMNET_LENGTH+1));
}
}


これを別のscriptから下記のように呼び出します。

◆とどまるパーティクルを出す時
string texture = "myTexture";//POPのテクスチャ名
string col = "<1,1,1>";//色
string scale ="<2,2,2>";//大きさ 最大4x4x4
string bFullBright = "TRUE";//最大の明るさにするか?
llMessageLinked(LINK_THIS,0,"harayoki.stablePtcl TRUE "+texture+" "+col+" "+scale+" "+bFullBright,NULL_KEY);


◆とどまるパーティクルを消すとき
llMessageLinked(LINK_THIS,0,"harayoki.stablePtcl FALSE",NULL_KEY);


こんな感じです。
次だかその次だかのエントリーにモジュールの使用例を書きます。
たぶん。

--
追記
プリムはphantom属性にするのが邪魔にならなくて良いです。
自分は最初気がつきませんでしたが、
しつこいPOP(1)へのSeagelさんのコメントを受けてそうしました。

--
追記
5/6 バージョンアップされました
チラチラさせない

5/9 不具合情報
半透明プリムが後ろにあると画像が消える

同じカテゴリー(固定Particle)の記事画像
ver.UP:しつこいPOP(9)
同じカテゴリー(固定Particle)の記事
 DL:しつこいPOP(10) (2007-05-15 06:55)
 ver.UP:しつこいPOP(9) (2007-05-06 06:04)
Posted by harayoki at 18:40│Comments(1)固定Particle
この記事へのトラックバック
その場に留まるパーティクル http://harayoki.slmame.com/e4179.html
diary/2007-05-06【Help Secondlife (PukiWiki/TrackBack 0.4)】at 2007年05月06日 10:54
この記事へのコメント
Mojule → Moduleのタイポを直しました。
今までのも間違ってます。
徐々に直します。
Posted by harayoki at 2007年05月03日 22:32
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。