<?xml version="1.0" encoding="utf-8" ?>
<feed version="0.3" xml:lang="ja" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><title>LSLって何？</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/" /><modified>2007-02-22T00:32:34+09:00</modified><tagline>LSL(the scripting language of Second Life)とは、
secondlifeのスクリプトで利用される言語です。
それをちょっとやってみようかと。健忘録も兼ねまして。</tagline><generator url="http://jugem.cc/">JUGEM</generator><entry><title>エレベータ（もどき？）を作ってみる</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=93299" /><id>http://secondlife.room510.com/?eid=93299</id><issued>2007-02-22T00:32:33+09:00</issued><modified>2007-02-21T15:32:33Z</modified><created>2007-02-21T15:32:33Z</created><summary>ただ移動するだけならば飛んだりsitで瞬間移動したりすればいいのですが、
そこをあえて時間を掛けて移動したいということでエレベータ（見たいな物）を
つくってみました。

同じ場所を行ったりきたりするスクリプトです。
いつもどおり難しいことはできませんので...</summary><author><name>LSL勉強中</name></author><dc:subject>土地建物</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[ただ移動するだけならば飛んだりsitで瞬間移動したりすればいいのですが、<br />
そこをあえて時間を掛けて移動したいということでエレベータ（見たいな物）を<br />
つくってみました。<br />
<br />
同じ場所を行ったりきたりするスクリプトです。<br />
いつもどおり難しいことはできませんので<br />
プリムにsitした状態でtouchするとプリムが目的の場所まで<br />
連れて行ってくれます。<br />
「まっすぐ進むだけだとつまらない」というご意見を受け、<br />
ちょっとだけジグザグに移動します。<br />
※sitせずにクリックするとプリムだけ<br />
どっかに行ってしまいます。<br />
<br />
以下、そのスクリプトの紹介<br />
<br />
<span style="color:#FF0000"><br />
//１階にいるか２階にいるかを判別します。<br />
integer updownflg = 0; <br />
<br />
default<br />
&#123;<br />
    state_entry()<br />
    &#123;<br />
        llSetText("sit & touch bar!", <1,0,0>, 1.0);<br />
    &#125;<br />
<br />
    touch(integer total_number)<br />
    &#123;<br />
    	//もし１階にいたら・・・<br />
        if(updownflg == 0)&#123;<br />
            //go to 2nd floor<br />
            //現在の場所を取得<br />
            vector foo = llGetLocalPos();<br />
<br />
            //for文のための変数<br />
            integer x;<br />
            //oku ni 5m<br />
            //0.5ｍずつ１０回移動する→5m（一気に移動すると瞬間移動になってしまうため）<br />
            for (x = 0; x < 10; x++)<br />
            &#123;<br />
            	//現在位置に対して、ベクターでx軸に0.5m足す。<br />
            	//ベクターの単位はｍのようです。<br />
                //赤い軸がX軸、矢印が向いているほうに数字が増えていく<br />
                llSetPos(foo + <0.5, 0, 0>);<br />
                //移動後の位置を取得し、再度変数に格納する<br />
                foo = llGetLocalPos();<br />
            &#125;<br />
<br />
            //同様にY軸の移動、とZ軸の移動を行う<br />
            //hidari ni 10m<br />
            for (x = 0; x < 20; x++)<br />
            &#123;<br />
                //緑がY軸<br />
                llSetPos(foo + <0, 0.5, 0>);<br />
                foo = llGetLocalPos();<br />
            &#125;<br />
            //ue ni 8m<br />
            for (x = 0; x < 16; x++)<br />
            &#123;<br />
                llSetPos(foo + <0, 0, 0.5>);//青がZ軸<br />
                foo = llGetLocalPos();<br />
            &#125;<br />
            <br />
            //移動が終わったらフラグを２階に設定<br />
            updownflg = 1;<br />
            <br />
        &#125; else &#123;<br />
        //２階にいる場合は１階に移動する<br />
        //手順は、きたときと逆にするだけ<br />
            //go to 1st floor<br />
            vector foo = llGetLocalPos();<br />
            integer x;<br />
<br />
            //ue ni -8m<br />
            for (x = 0; x < 16; x++)<br />
            &#123;<br />
                llSetPos(foo + <0, 0, -0.5>);<br />
                foo = llGetLocalPos();<br />
            &#125;<br />
<br />
            //hidari ni -10m<br />
            for (x = 0; x < 20; x++)<br />
            &#123;<br />
                llSetPos(foo + <0, -0.5, 0>);<br />
                foo = llGetLocalPos();<br />
            &#125;<br />
<br />
            //oku ni -5m<br />
            for (x = 0; x < 10; x++)<br />
            &#123;<br />
                llSetPos(foo + <-0.5, 0, 0>);<br />
                foo = llGetLocalPos();<br />
            &#125;<br />
<br />
            updownflg = 0;<br />
            <br />
        &#125;<br />
<br />
    &#125;<br />
&#125;<br />
<br />
</span><br />
<br />
もしかして、これだと移動中にプリムをクリックすると<br />
さらにそこから移動が加算されるかも・・・<br />
テストしていませんので、利用される方は移動中判定フラグ等を<br />
入れてみてください。って無責任。<br />
]]></content></entry><entry><title>翻訳ツールを作ってみる</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=87505" /><id>http://secondlife.room510.com/?eid=87505</id><issued>2007-02-17T21:09:21+09:00</issued><modified>2007-02-17T12:19:42Z</modified><created>2007-02-17T12:09:21Z</created><summary>以前ブログに書いたHTTPREQUESTの応用で
翻訳ツールを作成してみました。

とはいっても、lslで翻訳エンジンを作るというのは
あまりにも難易度が高いため（LSL以外の仕組みでも無理ですが・・・W）
googleの翻訳サービスを利用しています。

まず、前提条件として...</summary><author><name>LSL勉強中</name></author><dc:subject>Communications</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[以前ブログに書いたHTTPREQUESTの応用で<br />
翻訳ツールを作成してみました。<br />
<br />
とはいっても、lslで翻訳エンジンを作るというのは<br />
あまりにも難易度が高いため（LSL以外の仕組みでも無理ですが・・・W）<br />
googleの翻訳サービスを利用しています。<br />
<br />
まず、前提条件として<br />
・phpの実行可能なサーバを持っていること<br />
・そのサーバでfsockopenが利用可能なこと<br />
となります。<br />
これは別にphpでなくてもいいのですが、<br />
今回のサンプルがphpを利用している関係です。<br />
<br />
仕組みの概略としては、<br />
<br />
<span style="color:#008000">１、チャットのメッセージをlistenで拾う<br />
２、拾ったメッセージをhttprequestで自分のサーバに設置したphpのプログラムに引き渡す。<br />
３、phpのプログラムでgoogleの翻訳サービスを呼び出して翻訳をしてもらう<br />
４、phpが受け取った翻訳結果をhttpresponseとしてlslでうけとる<br />
５、lslで受け取った邦訳結果をllSayで表示する</span><br />
<br />
という流れになってます。<br />
<br />
ここで紹介するスクリプトは、なるべく単純なものにしています。<br />
phpのプログラムに変更を加えることで、特定文字列は個別に翻訳するといったこともできます。<br />
<br />
■lsl<br />
httprequestのサーバはご自分で用意してものに置き換えてください。<br />
このスクリプトを適用なプリムに貼り付けて、HUDに設定するなどしてご利用ください。<br />
<br />
<br />
<span style="color:#FF0000">key toucher;<br />
integer LHandle;<br />
integer activeflg;<br />
key requestid;<br />
<br />
default<br />
&#123;<br />
	//REZしたタイミングでスクリプトをリセットすることで<br />
	//オーナーを正しく判別しています。<br />
	//自分で作った場合は関係ないのですが、<br />
	//人にあげたりしたときのための対応です。<br />
    on_rez(integer reset)<br />
    &#123;<br />
        llResetScript();<br />
    &#125;<br />
<br />
    state_entry()<br />
    &#123;<br />
    	//llListenでチャットメッセージを拾います<br />
    	//llListenはsimに与える負荷が高くなるそうなので<br />
    	//かならずフィルター処理をします<br />
    	//この場合、チャンネルは0ですべてを拾っていますが<br />
    	//llGetOwnerで持ち主からのメッセージを受け取るように<br />
    	//フィルタリングしています<br />
        LHandle = llListen(0,"",llGetOwner(),"");<br />
        //一旦リスナーを無効にしておきます<br />
        llListenControl(LHandle, FALSE);<br />
        //翻訳機能が無効である事をllSetTextデ表示します<br />
        llSetText("stop", <255,255,255>, 1.0);<br />
        activeflg = 0;<br />
    &#125;<br />
<br />
	//プリムをタッチすることで翻訳機能の有効/無効を切り替えます<br />
    touch(integer total_number)<br />
    &#123;<br />
    	//タッチできるのをオーナーだけに限定します<br />
        toucher = llDetectedKey(0);<br />
        if(toucher == llGetOwner())<br />
        &#123;<br />
			//フラグを確認して、有効にするか無効にするかを判断します<br />
            if(activeflg == 0)&#123;<br />
                activeflg = 1;<br />
                //リスナーを有効にします<br />
                llListenControl(LHandle, TRUE);<br />
                llSetText("active", <255,255,255>, 1.0);<br />
            &#125; else &#123;<br />
                activeflg = 0;<br />
                //リスナーを無効にします<br />
                llListenControl(LHandle, FALSE);<br />
                llSetText("stop", <255,255,255>, 1.0);<br />
            &#125;<br />
        &#125;<br />
    &#125;<br />
<br />
	//このブロックでは、チャットメッセージを拾った時の処理を記述します。<br />
    listen(integer channel, string name, key id, string message)<br />
    &#123;<br />
    	//llHTTPRequestでphpを呼びます<br />
    	//念のためurlエンコードをしています<br />
        requestid = llHTTPRequest("http://ご自分のドメイン/trans_j2e.php?word=" <br />
        + llEscapeURL(message),[HTTP_METHOD,"GET"],"");<br />
    &#125;<br />
<br />
	//HTTPRequestの結果を受け取るブロックです<br />
    http_response(key request_id, integer status, list metadata, string body)<br />
    &#123;<br />
        if (request_id == requestid)<br />
        &#123;<br />
        	//翻訳結果を画面に表示させます<br />
        	//自分以外のエージェントからも見えるようにチャンネルは0を使います<br />
            llSay(0,body);<br />
        &#125; else &#123;<br />
            llSay(0,(string)status+" error");<br />
        &#125;<br />
    &#125;<br />
<br />
&#125;<br />
<br />
</span><br />
<br />
■PHPのプログラム（trans_j2e.php）<br />
<br />
<span style="color:#FF0000"><br />
&lt;?php<br />
/*<br />
ご自分で用意されたサーバに設置してください。<br />
PHPが実行可能である必要があります。<br />
また、fsockopenが実行可能な設定に鳴っている必要があります。<br />
*/<br />
<br />
//変換処理先<br />
//http://www.google.co.jp/language_tools?hl=ja<br />
<br />
&#36;word = urlencode(&#36;_GET['word']);<br />
&#36;requrl = "translate.google.com";<br />
&#36;reqmethod = "get";<br />
&#36;reqpath = "translate_t";<br />
<br />
//言語変換の設定パラメータ<br />
//hlとlangpairを変更する事で他の言語への変換が可能<br />
&#36;reqdata = "text=" . &#36;word ."&hl=ja&langpair=ja|en";<br />
<br />
//リクエストの送信と受信<br />
&#36;fp = fsockopen(&#36;requrl, 80, &#36;errno, &#36;errstr, 30);<br />
if (!&#36;fp) &#123;<br />
   echo "&#36;errstr (&#36;errno)&yen;n";<br />
&#125; else &#123;<br />
   &#36;out = &#36;reqmethod." /".&#36;reqpath."?".&#36;reqdata."  HTTP/1.1&yen;r&yen;n";<br />
   &#36;out .= "Host: ".&#36;reqhost."&yen;r&yen;n";<br />
   &#36;out .= "User-Agent:      Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-jp; rv:1.8.1) Gecko/20061010 Firefox/2.0&yen;r&yen;n";<br />
    &#36;out .= "Connection: Close&yen;r&yen;n&yen;r&yen;n";<br />
<br />
   fwrite(&#36;fp, &#36;out);<br />
   while (!feof(&#36;fp)) &#123;<br />
       &#36;res .= fgets(&#36;fp, 128);<br />
   &#125;<br />
   fclose(&#36;fp);<br />
&#125;<br />
<br />
//レスポンスから変換後の文字列のみを抽出<br />
&#36;mystring = &#36;res;<br />
&#36;findme  = '&lt;div id=result_box dir=ltr&gt;';<br />
&#36;pos = strpos(&#36;mystring, &#36;findme);<br />
if (&#36;pos === false) &#123;<br />
   echo "transelation error";<br />
&#125; else &#123;<br />
	&#36;step1 = substr(&#36;mystring,&#36;pos + 27);<br />
&#125;<br />
&#36;mystring = &#36;step1;<br />
&#36;findme  = '&lt;/div&gt;';<br />
&#36;pos = strpos(&#36;mystring, &#36;findme);<br />
if (&#36;pos === false) &#123;<br />
   echo "transelation error";<br />
&#125; else &#123;<br />
	&#36;step2 = substr(&#36;mystring,0,&#36;pos);<br />
&#125;<br />
<br />
//翻訳後の文字列を出力<br />
echo &#36;step2;<br />
?><br />
</span>]]></content></entry><entry><title>パーティクルで産卵</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=57767" /><id>http://secondlife.room510.com/?eid=57767</id><issued>2007-02-03T15:53:46+09:00</issued><modified>2007-02-03T06:53:46Z</modified><created>2007-02-03T06:53:46Z</created><summary>アバターから卵を産ませたかったのですが
プリムで作成しても産卵にはならない・・。
ということで、パーティクルを利用してその方法を模索してみました。

結果的にはそこそこそれっぽく見えるんじゃないかと
いうものができました。（←自己満足）
ついでに、パー...</summary><author><name>LSL勉強中</name></author><dc:subject>アバター</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[アバターから卵を産ませたかったのですが<br />
プリムで作成しても産卵にはならない・・。<br />
ということで、パーティクルを利用してその方法を模索してみました。<br />
<br />
結果的にはそこそこそれっぽく見えるんじゃないかと<br />
いうものができました。（←自己満足）<br />
ついでに、パーティクルについてもいくつか学べたことが<br />
あるのでまとめて見ます。<br />
<br />
以下は、ポロッと1つだけパーティクルが発生する例です。<br />
<br />
<span style="color:#FF0000"><br />
default &#123;<br />
    state_entry() &#123;     <br />
        llParticleSystem( [<br />
            PSYS_PART_START_SCALE, <0.3,0.3,0.0>, <br />
            PSYS_PART_END_SCALE, <0.1,0.1,0.0>, <br />
            PSYS_PART_START_COLOR, <1.0,1.0,1.0>,<br />
            PSYS_PART_END_COLOR, <1.0,1.0,1.0>, <br />
            PSYS_PART_START_ALPHA, 1.0,     <br />
            PSYS_PART_END_ALPHA, 1.0,   <br />
            PSYS_SRC_BURST_PART_COUNT, 1,  <br />
            PSYS_SRC_BURST_RATE, 7.0,  <br />
            PSYS_SRC_TEXTURE, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",<br />
            PSYS_PART_MAX_AGE, 2.0,   <br />
            PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_DROP, <br />
            PSYS_SRC_ACCEL, <0.0,0.0,-5.0>,       <br />
            PSYS_SRC_BURST_SPEED_MIN, 2.3,   <br />
            PSYS_SRC_BURST_SPEED_MAX, 5.3, <br />
            PSYS_PART_FLAGS,<br />
             ( PSYS_PART_EMISSIVE_MASK | <br />
             PSYS_PART_WIND_MASK | <br />
             PSYS_PART_FOLLOW_VELOCITY_MASK | <br />
             PSYS_PART_INTERP_COLOR_MASK | <br />
             PSYS_PART_INTERP_SCALE_MASK )<br />
        ] );<br />
    &#125;<br />
&#125;<br />
</span><br />
<br />
設定値の説明を簡単に。<br />
<br />
//粒の発生時のサイズと消失時のサイズの指定<br />
PSYS_PART_START_SCALE, <0.3,0.3,0.0>, <br />
PSYS_PART_END_SCALE, <0.1,0.1,0.0>, <br />
<br />
///粒の発生時の色と消失時の色の指定<br />
PSYS_PART_START_COLOR, <1.0,1.0,1.0>,<br />
PSYS_PART_END_COLOR, <1.0,1.0,1.0>, <br />
<br />
///粒の発生時の透明度と消失時の透明度の指定<br />
PSYS_PART_START_ALPHA, 1.0,     <br />
PSYS_PART_END_ALPHA, 1.0,   <br />
※1.0で不透明のようです。<br />
<br />
//粒の同時発生数と発生間隔（秒？）<br />
PSYS_SRC_BURST_PART_COUNT, 1,  <br />
PSYS_SRC_BURST_RATE, 7.0,  <br />
<br />
//粒に貼り付けるテクスチャの指定<br />
PSYS_SRC_TEXTURE, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",<br />
xxxxには、貼り付けたいテクスチャのUUIDを入れてください。<br />
インベントリの任意のテクスチャを右クリックするとUUIDが取得（クリップボードにコピー）できます。<br />
<br />
//粒が消失するまでの時間（秒？）<br />
PSYS_PART_MAX_AGE, 2.0,<br />
<br />
//粒の落ちるパターンの指定<br />
PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_DROP,<br />
<br />
//粒の加速度？<br />
PSYS_SRC_ACCEL, <0.0,0.0,-5.0>,<br />
※落ちていくスピードと解釈しました。<br />
<br />
サンプルをここまで設定するとうまい具合に落ちてくれたので<br />
満足してしまいました。<br />
後の設定情報については、以下に情報があります。<br />
いずれ調べてみようかなあ・・・。<br />
<br />
http://rpgstats.com/wiki/index.php?title=Ja:particles<br />
http://rpgstats.com/wiki/index.php?title=Ja:llParticleSystem<br />
<br />
後、パーティクルラボが非常に参考になります。<br />
The Particle Laboratory<br />
http://slurl.com/secondlife/Teal/192/66/26/<br />
<br />
※パーティクルについての説明とサンプルの紹介があります。<br />
あと、テクスチャとスクリプトの販売もしてます。<br />
私はここでテクスチャを購入しました。<br />
webのテレポートで着いたところにあるバルーンにrideして<br />
目的地の操作盤でlabを選ぶと連れて行ってもらえますよ。<br />
]]></content></entry><entry><title>HTTPREQUEST</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=46255" /><id>http://secondlife.room510.com/?eid=46255</id><issued>2007-01-28T04:51:18+09:00</issued><modified>2007-01-28T14:17:26Z</modified><created>2007-01-27T19:51:18Z</created><summary>secondlifeの世界から外部の世界（web）に
アクセスするhttprequestを試してみました。
結構Request自体は、細かく送れるようなので
いろいろ試してみる価値はあるかも。

ただ、responseで受け取れる情報は、
「The body is currently limited to 2049 bytes.」
...</summary><author><name>LSL勉強中</name></author><dc:subject>Communications</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[secondlifeの世界から外部の世界（web）に<br />
アクセスするhttprequestを試してみました。<br />
結構Request自体は、細かく送れるようなので<br />
いろいろ試してみる価値はあるかも。<br />
<br />
ただ、responseで受け取れる情報は、<br />
「The body is currently limited to 2049 bytes.」<br />
となっているので、webサーバ側のプログラムをうまく作らないと<br />
できることが限られてしまいます。<br />
タイマーを仕掛けたオブジェクトを作成し、<br />
メールの新着アラートぐらいは作れそうですね。<br />
webサーバ側のプログラムは別途作成が必要ですが・・・。<br />
<br />
以下、サンプルです。<br />
<br />
<br />
<span style="color:#FF0000"><br />
key requestid;<br />
<br />
default<br />
&#123;<br />
    state_entry()<br />
    &#123;<br />
        llSetText("Httprequest is not yet sent", <255,255,255>, 1.0);<br />
    &#125;<br />
<br />
    touch(integer nd)<br />
    &#123;<br />
        requestid = llHTTPRequest("http://www.google.co.jp/",[HTTP_METHOD,"GET"],"");<br />
    &#125;<br />
<br />
    http_response(key request_id, integer status, list metadata, string body)<br />
    &#123;<br />
        if (request_id == requestid)<br />
        &#123;<br />
            llSetText(body, <255,255,255>, 1.0);<br />
        &#125; else &#123;<br />
            llSetText((string)status+" error", <255,255,255>, 1.0);<br />
            //llSay(0,(string)status+" error");<br />
        &#125;<br />
    &#125;<br />
&#125;<br />
</span><br />
<br />
※ここではgoogleを呼んでますが、特に意味ありません。<br />
<br />
touchイベントでllHTTPRequestを呼んでます。<br />
リクエストは、非同期通信としてレスポンスを受け取ります。<br />
レスポンスが来た時点で、http_responseイベントが発動します。<br />
ちなみに、request_idでNULL_KEYが帰ってきたときはエラーのようです。<br />
bodyは、タグを含めて2049バイトしか受け取れません。<br />
<br />
http://rpgstats.com/wiki/index.php?title=LlHTTPRequest<br />
http://rpgstats.com/wiki/index.php?title=Http_response]]></content></entry><entry><title>プリムの回転でアバターにマバタキをさせたい２</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=40664" /><id>http://secondlife.room510.com/?eid=40664</id><issued>2007-01-25T02:20:28+09:00</issued><modified>2007-01-24T17:20:28Z</modified><created>2007-01-24T17:20:28Z</created><summary>訂正です。
blogに書いたスクリプトと
primに設定したスクリプトが違ってました。

結果としては、
・アタッチメントとして取り付けた際に基準となる座標軸がずれてしまう事
は、間違いで
ちゃんとずれないでマバタキさせることができました！
（とはいっても片目...</summary><author><name>LSL勉強中</name></author><dc:subject>アバター</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[訂正です。<br />
blogに書いたスクリプトと<br />
primに設定したスクリプトが違ってました。<br />
<br />
結果としては、<br />
・アタッチメントとして取り付けた際に基準となる座標軸がずれてしまう事<br />
は、間違いで<br />
ちゃんとずれないでマバタキさせることができました！<br />
（とはいっても片目ですが・・・）<br />
<br />
原因は<br />
llGetLocalRot、llSetLocalRot<br />
を<br />
llGetRot、llSetRot<br />
と書き間違えていたこと<br />
blogに書いた内容が正解です。<br />
<br />
・・・なんで間違えたかな？<br />
<br />
]]></content></entry><entry><title>プリムの回転でアバターにマバタキをさせたい</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=32583" /><id>http://secondlife.room510.com/?eid=32583</id><issued>2007-01-22T01:43:07+09:00</issued><modified>2007-01-28T14:18:00Z</modified><created>2007-01-21T16:43:07Z</created><summary>アバターにまばたきをさせたいと思い、
こんなスクリプトを書いてみました。
結果としては、失敗に終わりましたが・・・。

敗因は２つ。
・右目と左目を同期させて動かすことができなかった事。
　　（できるにはできたんですが、顔に取り付ける段になって失敗）
...</summary><author><name>LSL勉強中</name></author><dc:subject>アバター</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[アバターにまばたきをさせたいと思い、<br />
こんなスクリプトを書いてみました。<br />
結果としては、失敗に終わりましたが・・・。<br />
<br />
敗因は２つ。<br />
・右目と左目を同期させて動かすことができなかった事。<br />
　　（できるにはできたんですが、顔に取り付ける段になって失敗）<br />
・アタッチメントとして取り付けた際に基準となる座標軸がずれてしまう事<br />
<br />
両方とも、自分の力不足が原因なのですが、<br />
調べきれず無念のリタイヤ。<br />
<br />
ただ、いくつか今後も利用できるノウハウがあると思うので<br />
書いたスクリプトの解説をします。<br />
<br />
<span style="color:#FF0000"><br />
float minBlinkTime = 0.5;<br />
float maxBlinkTime = 12.0;<br />
<br />
float randBetween(float min, float max)&#123;<br />
    return llFrand(max - min) + min;   <br />
&#125;<br />
<br />
integer Mabataki(float prm1)&#123;<br />
    rotation x_180 = llEuler2Rot( <0, prm1 * 180 * DEG_TO_RAD, 0> );<br />
    rotation new_rot = llGetLocalRot() * x_180;<br />
    llSetLocalRot(new_rot);<br />
    return 1;<br />
&#125;<br />
<br />
default<br />
&#123;<br />
    state_entry()&#123;<br />
        llSetTimerEvent(randBetween(minBlinkTime,maxBlinkTime));<br />
    &#125;<br />
<br />
    timer()&#123;<br />
        llSetTimerEvent(0.0);<br />
        Mabataki(1.0);<br />
        llSleep(0.1);<br />
        Mabataki(-1.0);      <br />
        llSetTimerEvent(randBetween(minBlinkTime,maxBlinkTime));<br />
    &#125;<br />
&#125;</span><br />
<br />
上記のプログラムは、ランダムな値をタイマーの発生間隔に設定し<br />
タイマーのイベントで、プリムの軸に回転を与える、というものです。<br />
まばたきは、半円形で中を中空にしたプリムを目の上にかぶせて、<br />
それ目にかぶせるように回転させて実現しようとしました。<br />
<br />
randBetween()は、少数型の数値を最大値と最小値を指定して発生させる<br />
関数です。lsl-wikiのまんまです。<br />
これで、まばたきの発生タイミングをランダムにしています。<br />
llFrandは、引数で与えた値を最大値とする乱数を発生させる関数。<br />
返り値は、floatですが、wikiにintegerを受け取るサンプルも書いてあります。<br />
<a href="http://rpgstats.com/wiki/index.php?title=LlFrand" target="_blank">http://rpgstats.com/wiki/index.php?title=LlFrand</a><br />
<br />
Mabataki()は、プリムを回転させる関数です。<br />
引数に回転させる量を指定します。<br />
prm1 * 180 * DEG_TO_RAD<br />
180度に引数の値を係数として掛けて、<br />
さらに角度をラディアンに変換する定数を掛けてます。<br />
llEuler2Rot()は、vecter型からrotation型に変換する関数。<br />
得た値は、別のrotationに掛けることで、ベクターで指定した変化の度合いを加えることができます。<br />
<br />
llGetLocalRot()で疑問だったのがこれ。<br />
llGetRotという関数もあるですが、いまいちどっちを使ったらいいのかわかりません。<br />
LlGetRotの説明にはアタッチメントで利用する場合は、アバターのrotationが返ってくるとあるので<br />
llGetLocalRotにしました。<br />
<a href="http://rpgstats.com/wiki/index.php?title=LlGetRot" target="_blank">http://rpgstats.com/wiki/index.php?title=LlGetRot</a><br />
<a href="http://rpgstats.com/wiki/index.php?title=LlGetLocalRot" target="_blank">http://rpgstats.com/wiki/index.php?title=LlGetLocalRot</a><br />
<br />
まぶたは、顔の1プリムとしてリンクしたいので、まぶた自身のrotationがほしかったのです。<br />
llSetLocalRot()は、上記で算出した変更後のrotationの値をプリムに設定する処理。<br />
右目の子供として左目をリンクさせることで、両目に同じ変化を与えることがでます。<br />
ただ回転軸上に子プリムを配置しないと妙な回転をしてしまうので注意。<br />
<br />
で、これを顔に貼り付けると顔ごと回転してしまったり、右目しか回転しなかったりとなってしまうので<br />
顔の別のパーツのアタッチメントとしてまぶたを取り付けることにしたのですが、<br />
アタッチメントにした途端、回転の軸がずれてしまい、指定した変化の値があらぬ方向に影響し・・・。<br />
この辺の調整をうまくやる方法はどうしたらよいのですかね・・・。<br />
<br />
ただものの角度を回転させるだけとか、向きを気にせず利用できるものとかには<br />
使えるかもしれませんね、・・・オウムの頭とか？？？<br />
<br />
ファンネルもつくれるかな？]]></content></entry><entry><title>定数のこれなに？</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20815" /><id>http://secondlife.room510.com/?eid=20815</id><issued>2007-01-19T01:13:04+09:00</issued><modified>2007-01-18T16:13:04Z</modified><created>2007-01-18T16:13:04Z</created><summary>PI

パイ＝円周率
そのままか・・・。</summary><author><name>LSL勉強中</name></author><dc:subject>基本の基本</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[PI<br />
<br />
パイ＝円周率<br />
そのままか・・・。]]></content></entry><entry><title>Annoyances（迷惑）</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20814" /><id>http://secondlife.room510.com/?eid=20814</id><issued>2007-01-19T01:11:36+09:00</issued><modified>2007-01-18T16:11:36Z</modified><created>2007-01-18T16:11:36Z</created><summary>やっちゃいけない事のいろいろ
http://rpgstats.com/wiki/index.php?title=Annoyances
</summary><author><name>LSL勉強中</name></author><dc:subject>基本の基本</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[やっちゃいけない事のいろいろ<br />
http://rpgstats.com/wiki/index.php?title=Annoyances<br />
]]></content></entry><entry><title>制御構造</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20811" /><id>http://secondlife.room510.com/?eid=20811</id><issued>2007-01-19T01:10:25+09:00</issued><modified>2007-01-18T16:10:25Z</modified><created>2007-01-18T16:10:25Z</created><summary>for, do-while, if-else, return, while　は、他の言語と対して変わらない
foreachとかあれば便利なんだけど・・・
jump,stateは、個人的にはなじみが無い

jump
goto文ってことかな
ループを強制的に抜けたい時とかに使える
jump getOut;
@getOut;
「@」を付け...</summary><author><name>LSL勉強中</name></author><dc:subject>基本の基本</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[for, do-while, if-else, return, while　は、他の言語と対して変わらない<br />
foreachとかあれば便利なんだけど・・・<br />
jump,stateは、個人的にはなじみが無い<br />
<br />
<strong>jump</strong><br />
goto文ってことかな<br />
ループを強制的に抜けたい時とかに使える<br />
jump getOut;<br />
@getOut;<br />
「@」を付けて飛び先指定<br />
→<a href="http://rpgstats.com/wiki/index.php?title=Jump" target="_blank">jump</a><br />
<br />
<strong>state</strong><br />
状態を表す<br />
defaultも状態の一つ。最初から定義されている。<br />
自分で状態を作る場合は、関数と同じ。<br />
state anotherstate&#123;<br />
    xxxxxx;<br />
&#125;<br />
<br />
state anotherstate;<br />
で状態が切り替わる。<br />
<br />
defaultも状態だからstate default;で元に戻るという意味に。<br />
イベントハンドラは同じで、その処理が異なる場合に利用できます<br />
もちろん、グローバル変数を作って、ifで判別してもいいけど。<br />
→<a href="http://rpgstats.com/wiki/index.php?title=Statekeyword" target="_blank">state</a><br />
]]></content></entry><entry><title>変数</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20804" /><id>http://secondlife.room510.com/?eid=20804</id><issued>2007-01-19T01:04:56+09:00</issued><modified>2007-01-18T16:04:56Z</modified><created>2007-01-18T16:04:56Z</created><summary>integer bar = 3;
スコープがあるので、どのファンクションからでも呼びたい場合は
defaultの外に定義する。型の指定を忘れずに。

あんまり説明する事ないかな。</summary><author><name>LSL勉強中</name></author><dc:subject>基本の基本</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[integer bar = 3;<br />
スコープがあるので、どのファンクションからでも呼びたい場合は<br />
defaultの外に定義する。型の指定を忘れずに。<br />
<br />
あんまり説明する事ないかな。]]></content></entry><entry><title>型、integerとかね。</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20795" /><id>http://secondlife.room510.com/?eid=20795</id><issued>2007-01-19T00:57:08+09:00</issued><modified>2007-01-18T15:59:46Z</modified><created>2007-01-18T15:57:08Z</created><summary>→型（これも日本語！）
integer　整数
float　小数
整数と小数は、ちゃんとキャストしないといけないのをすぐ忘れてしまう。

vector　ベクター
座標ってこと　vector a = ;

rotation　
これ面倒くさそうです。もっと調べてからということで
→rotation

key...</summary><author><name>LSL勉強中</name></author><dc:subject>基本の基本</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[→<a href="http://rpgstats.com/wiki/index.php?title=Ja:types" target="_blank">型（これも日本語！）</a><br />
<strong>integer　整数</strong><br />
<strong>float　小数</strong><br />
整数と小数は、ちゃんとキャストしないといけないのをすぐ忘れてしまう。<br />
<br />
<strong>vector　ベクター</strong><br />
座標ってこと　vector a = <1,2,3>;<br />
<br />
<strong>rotation　<x,y,z,s></strong><br />
これ面倒くさそうです。もっと調べてからということで<br />
→<a href="http://rpgstats.com/wiki/index.php?title=Rotation" target="_blank">rotation</a><br />
<br />
<strong>key　SL 内に存在するものを特定するkey</strong><br />
要はオブジェクトのID（一意になるように付けられた値）<br />
<br />
<strong>string　文字列型</strong><br />
長さはメモリ次第？文字コードは、UTF-8なので日本語もOKってことかな。<br />
<br />
文字列結合は、「+」<br />
mystring = yourstring + "anotherstring";<br />
<br />
エスケープ文字は<br />
&yen;t  four spaces　つまりタブ<br />
&yen;n  new line　改行<br />
&yen;"  double quote　「"」<br />
&yen;&yen;  backslash　「&yen;」<br />
→<a href="http://rpgstats.com/wiki/index.php?title=String" target="_blank">文字列型</a><br />
<br />
<strong>list　配列みたいに使えるリスト</strong><br />
list l = ["somestring",12,3.0,<3.3,4,0>,<0,0,0,1>];<br />
なんでも入るよ。<br />
<br />
項目の追加は「+」<br />
newlist = oldlist + ["oneitem","anotheritem"];<br />
<br />
値が何個目に入っているか？<br />
integer index = llListFindList( myList, [searchFor] );searchForに探したい値<br />
<br />
x個目の値を取得する。indexは０から始まる。<br />
element = llList2String(myList,x);<br />
<br />
リストの数は？<br />
integer listLength = llGetListLength(myList);<br />
→<a href="http://rpgstats.com/wiki/index.php?title=List" target="_blank">リスト</a>]]></content></entry><entry><title>まずは、算術演算子</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20783" /><id>http://secondlife.room510.com/?eid=20783</id><issued>2007-01-19T00:48:17+09:00</issued><modified>2007-01-18T16:01:01Z</modified><created>2007-01-18T15:48:17Z</created><summary>→演算子（日本語！）

直感的によく使うと思われるのは、算術演算子と比較演算子

算術演算子
+, -, *, /, %, +=, -=, *=, /=, %=
%(mod)は、意外と便利なんですよね。要は「余り」を取得できます。

比較演算子
&amp;&amp;, ||, !, ==, !=, 
これも他の言語と同じでわ...</summary><author><name>LSL勉強中</name></author><dc:subject>基本の基本</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[→<a href="http://rpgstats.com/wiki/index.php?title=Ja:operators" target="_blank">演算子（日本語！）</a><br />
<br />
直感的によく使うと思われるのは、算術演算子と比較演算子<br />
<br />
算術演算子<br />
+, -, *, /, %, +=, -=, *=, /=, %=<br />
%(mod)は、意外と便利なんですよね。要は「余り」を取得できます。<br />
<br />
比較演算子<br />
&&, ||, !, ==, !=, <=, <, >=, ><br />
これも他の言語と同じでわかりやすいです。<br />
phpだと暗黙castなので<br />
「===」といった方も比較する演算子があるのですが、<br />
<br />
lslは、型が結構厳密な気がします。このへんjavaチック？<br />
]]></content></entry><entry><title>LSL wikiのTutorialを読んで学びました</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20776" /><id>http://secondlife.room510.com/?eid=20776</id><issued>2007-01-19T00:42:42+09:00</issued><modified>2007-01-18T15:42:42Z</modified><created>2007-01-18T15:42:42Z</created><summary>■独自で定義したfunctionについて
defaultよりも前に書く事

スクリプト言語として考えた場合、
テキストの上部から順に解釈されて
実行されると思われます。

その上で、これらのスクリプトがprimというオブジェクト（classに相当すると考えると）
defaultがオブ...</summary><author><name>LSL勉強中</name></author><dc:subject>LSLチュートリアル</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[■独自で定義したfunctionについて<br />
<strong>defaultよりも前に書く事</strong><br />
<br />
スクリプト言語として考えた場合、<br />
テキストの上部から順に解釈されて<br />
実行されると思われます。<br />
<br />
その上で、これらのスクリプトがprimというオブジェクト（classに相当すると考えると）<br />
defaultがオブジェクトのコンストラクタになるわけで、<br />
<br />
つまり、先に独自メソッド呼び、オブジェクトが生成された際に<br />
defaultがコールされる。<br />
その際に、functionが先に読み込まれてないと困るという、そういう事かな？<br />
javascriptみたいだと考えればいいという事か。<br />
<br />
stateの事を考えるとコンストラクタとは言い難い気もしますが。<br />
まあいいか。<br />
]]></content></entry><entry><title>ここを読めれば・・・</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20770" /><id>http://secondlife.room510.com/?eid=20770</id><issued>2007-01-19T00:37:37+09:00</issued><modified>2007-01-18T15:43:21Z</modified><created>2007-01-18T15:37:37Z</created><summary>LSL wikiのチュートリアルを読めれば、LSLの大概のイメージは掴める。
けど、
英語なんだよね。
難しい英語ではないから、読めない事は無いのですが。
技術系の文章は読みやすいけど、・・・疲れる。

LSLTutorials

何かコンピュータ言語を知っている方は、
Tut...</summary><author><name>LSL勉強中</name></author><dc:subject>LSLチュートリアル</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[LSL wikiのチュートリアルを読めれば、LSLの大概のイメージは掴める。<br />
けど、<br />
英語なんだよね。<br />
難しい英語ではないから、読めない事は無いのですが。<br />
技術系の文章は読みやすいけど、・・・疲れる。<br />
<br />
<a href="http://rpgstats.com/wiki/index.php?title=LSLTutorials" target="_blank">LSLTutorials</a><br />
<br />
何かコンピュータ言語を知っている方は、<br />
<a href="http://rpgstats.com/wiki/index.php?title=Tutorial" target="_blank">Tutorial</a><br />
から読めばOK。]]></content></entry><entry><title>まず始めに</title><link rel="alternate" type="text/html" href="http://secondlife.room510.com/?eid=20763" /><id>http://secondlife.room510.com/?eid=20763</id><issued>2007-01-19T00:31:04+09:00</issued><modified>2007-01-18T15:31:04Z</modified><created>2007-01-18T15:31:04Z</created><summary>まず始めに
room510.comっていうページでですね、ギャラリーサイト(http://room510.com)をやっている訳ですが、
最近始めたsecondlifeの情報をそのウラでやるかな、と思い立ちまして。 
で、secondlifeの始め方や楽しみ方の情報は既にベテランの方が開いてくださってい...</summary><author><name>LSL勉強中</name></author><dc:subject>思う事など</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[まず始めに<br />
room510.comっていうページでですね、ギャラリーサイト(http://room510.com)をやっている訳ですが、<br />
最近始めたsecondlifeの情報をそのウラでやるかな、と思い立ちまして。 <br />
で、secondlifeの始め方や楽しみ方の情報は既にベテランの方が開いてくださっているので、自分の健忘録もかねてSLのスクリプトであるLSL(the scripting language of Second Life)について調べた事を書き貯めていく事にしました。 <br />
間違った事、不確かな事だらけになってしまうと思いますが、ご容赦を。 <br />
LSLを作成される方の一助になれば幸いです。  <br />
<br />
豊富な情報を提供してくださっている先人の方々に感謝をこめて。]]></content></entry></feed>