<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0">
<channel>
<title>物見遊山</title>
<link>http://tanakaakio.slmame.com</link>
<description></description>
<language>ja</language>
<pubDate>Thu, 20 Dec 2007 19:25:17 +0900</pubDate>
<lastBuildDate>Thu, 20 Dec 2007 19:25:17 +0900</lastBuildDate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs> 
<generator>CLOG</generator>


<item>
<title>分割してテクスチャを貼るためのスクリプト3</title>
<description>タグ(名前)を付けて、テクスチャグリッドを貼るスクリプト。すいません。101行目訂正しました。誤: llSetTexture(tex, ALL_SIDES); 正:llSetTexture(tex, face);これが前回使用した数字テクスチャです。string    tex1            =    	"f4bb40ac-b9c6-1019-0b59-cffa8fb12b68";これが前々回使用した絵柄テクスチャです。string    tex0            =  	"0c5fb359-7ca3-00f2-8362-a6c2f0e5e8e9";　これらを今回も使って、テクスチャグリッドに名前を付けて貼り付けてみます。listの登録がだらだらと続きますが、それさえすめば名前だけでテクスチャグリッドを貼れます。それはそれで面倒ですが、電卓を片手に細かい小数計算をして入力しなくてすみます。ちょっと見難いかもしれませんが、テクスチャのライブラリのような感じでもあります。　ありがちなミスとしては、・テクスチャを再アップしたけどスクリプトのUUIDを変えてなくてテクスチャが変わらない。・同じ名前を登録してしまって、思ったものと違うものが表示される。・名前に余計なスペースが入っていて、ありませんといわれる。・各listの登録数があっていない。・各listの数が同じように見えたが、目の錯覚で実際数えてみると数が違っていた。・リストが長いので、コンマや括弧が分かりにくくて入れ間違え、狭いスクリプトコンソールでシンタックスエラー(構文エラー)で苦しむ。自分だけかなこんなミスをするのは・・・//TaggedTexGridSample.lsl//テクスチャグリッドにタグ(名前)をつけてリストに登録し、タグでテクスチャグリッドを貼れるようにする。//各タグのグリッドの分割数(列行)、グリッド番号とテクスチャもリストに登録する。//テクスチャのUUIDかオブジェクトコンテンツでの名前を指定する。//これらのサンプルテクスチャにはフルパーミッションを与えてあるので、誰でもこのテクスチャで実行できるはず。//絵柄サンプルテクスチャstring    tex0            =       "0c5fb359-7ca3-00f2-8362-a6c2f0e5e8e9";//数字サンプルテクスチャstring    tex1            =        "f4bb40ac-b9c6-1019-0b59-cffa8fb12b68";//***グリッドのタグ(名前)。list        tag              =     [//絵柄テクスチャを8(2x4)分割。        "Board"            ,       "Ice"        ,"Lily"               ,       "Warning"        ,"Ribbon"         ,        "Whiteboard"        ,"Blue"             ,       "Celt"//数字テクスチャを4(2x2)分割。        ,"0"                  ,       "1"        ,"2"                  ,       "3"//数字テクスチャを16(4x4)分割。        ,"00"                ,       "01"                        ,        "02"         ,          "03"        ,"04"                ,       "05"                        ,        "06"         ,          "07"        ,"08"                ,       "09"                        ,        "10"         ,          "11"        ,"12"                ,       "13"                        ,        "14"         ,          "15"        ];//***各グリッドタグのテクスチャを設定する。list        tagTex        =      [//絵柄テクスチャを8(2x4)分割。         tex0                ,        tex0        ,tex0                ,        tex0        ,tex0                ,        tex0        ,tex0                ,        tex0//数字テクスチャを4(2x2)分割。        ,tex1                ,        tex1        ,tex1                ,        tex1//数字テクスチャを16(4x4)分割。        ,tex1                ,        tex1                      ,         tex1          ,            tex1         ,tex1                ,        tex1                      ,         tex1          ,            tex1         ,tex1                ,        tex1                      ,         tex1          ,            tex1         ,tex1                ,        tex1                      ,         tex1          ,            tex1        ];//***各グリッドタグの分割数と番号を設定する。list        tagGrid        =       [//絵柄テクスチャを8(2x4)分割。                   ,               ,          ,                    ,          ,               ,          ,       //数字テクスチャを4(2x2)分割。        ,          ,               ,          ,           //数字テクスチャを16(4x4)分割。        ,           ,                    ,             ,                ,           ,                    ,             ,               ,           ,                    ,           ,               ,         ,                  ,           ,               ];//テクスチャグリッドのオフセットを返す。//index:テクスチャのグリッド番号(0から始まる)。//numOfCol:テクスチャのグリッド列数。//numOfRow:テクスチャのグリッド行数。vector getGridTexOffset(integer index, integer numOfCol, integer numOfRow) {    integer     Col         = index % numOfCol;        integer     Row     = index / numOfCol;    float        pitchCol       =    1    /    (float)numOfCol;    float        pitchRow     =    1    /    (float)numOfRow;    float        offX    =    -0.5   +  pitchCol  / 2  +  Col  * pitchCol;    float        offY    =      0.5   -  pitchRow / 2  -  Row  * pitchRow;        return         &lr; offX, offY, 0.0&gt;;}//テクスチャグリッドのスケールを返す。//numOfCol:テクスチャのグリッド列数。//numOfRow:テクスチャのグリッド行数。vector    getGridTexScale(integer numOfCol, integer numOfRow)    {    return        &lr; 1/(float)numOfCol,  1/(float)numOfRow, 0.0&gt;;        }//タグ名のテクスチャグリッドを指定面に貼り付ける。//name:タグ名。//face:貼り付ける面番号。setTaggedGridTex(string  name, integer    face)    {    integer    pos    =    llListFindList(tag, [name]);    if    (pos==-1)    {        string    s = "＊＊＊ " + name + " is not found.　＊＊＊";        llOwnerSay(s);        llSetText("tag=" + s, , 1.0);    }    else    {        vector           grid    =    llList2Vector(tagGrid, pos);                    vector            scale     =    getGridTexScale((integer)grid.x, (integer)grid.y);        llScaleTexture(scale.x,    　scale.y,     face);         vector            offset     =    getGridTexOffset((integer)grid.z, (integer)grid.x, (integer)grid.y);            llOffsetTexture(offset.x, offset.y, face);        key              tex    =    llList2Key(tagTex, pos );                llSetTexture(tex, face);                                           }        }//登録されているタグ名のテクスチャグリッドを順にすべて貼りつけていく。チェック用。demo()    {    integer    i;    for    (i=0; i &lr; llGetListLength(tag) ; i++)    {        string    s    =    llList2String(tag, i);//        llOwnerSay("tag=" + s);                    llSetText("tag=" + s, , 1.0);        setTaggedGridTex(s, ALL_SIDES);        llSleep(2);    }                    llSetText("", , 1.0);}     default    {    state_entry()    {        //デモ表示        demo();//        //登録されてないのでエラー表示が出る        setTaggedGridTex("foo", ALL_SIDES);        //テクスチャを実際に貼り付ける時は、この部分だけタグと面を変えて各プリムで実行する。        setTaggedGridTex("Whiteboard", ALL_SIDES);    	}}</description>
<link>http://tanakaakio.slmame.com/e167022.html</link>
<guid>http://tanakaakio.slmame.com/e167022.html</guid>
<category>実用スクリプト</category>
<pubDate>Sat, 08 Mar 2008 22:11:08 +0900</pubDate>

</item>

<item>
<title>分割してテクスチャを貼るためのスクリプト2</title>
<description>　スクリプトの前にちょっとTipsを・・・オブジェクトのフェイス番号をチャットウィンドウに表示する。　オブジェクトフェイスの番号をチャットウィンドウに表示するには、テクスチャのフェイスを選択してから「ctrl+shift+alt」を押しながら「T」を押します。テクスチャのサイズとアルファ値も出ます(どうせなら、編集ボックスに表示すればいいと思うのですが)。　テクスチャのフェイスを選択してない場合は、オブジェクトにあるフェイス番号がすべて表示されます。分割してテクスチャを貼るためのスクリプト2　今回使用しているサンプルテクスチャです。　前回は、1つのテクスチャを8(2x4)分割して貼り付けましたが、今回は、1つのテクスチャを4(2x2)分割と16(4x4)分割で貼ってみます。実際には、絵が重ならないようにして配置します。そうすれば、１枚のテクスチャでいろいろ使えます。特にHUDなんかでこまごましたボタンがいっぱいあるときにいいかもと思います。　スクリプトの関数は変更なしで、テクスチャの指定と呼び出し方とを少し変えるだけです。変更箇所1:テクスチャの変更。//テクスチャのUUIDかオブジェクトコンテンツでの名前を指定する。//このサンプルテクスチャにはフルパーミッションを与えてあるので、誰でもこのテクスチャで実行できるはず。string		myTex				=	"f4bb40ac-b9c6-1019-0b59-cffa8fb12b68";		変更箇所2: 関数の呼び出し部分。state_entryをすべて入れ替えます。    state_entry()    {　　　　　　//繰り返したとき変化が分かりやすいようにデフォルトにする。　　　　　　setDefaultTex();　　　　　　llSleep(2);　　　　　　//テクスチャを2列2行で分割し、0番目(0から始まる)のグリッドを第0面に貼る。  　　　　　　setTex(0, 2, 2, myTex, 0);　　　　　　llSleep(2);		　　　　　　//テクスチャを2列2行で分割し、1番目(0から始まる)のグリッドを第1面に貼る。  　　　　　　setTex(1, 2, 2, myTex, 1);　　　　　　llSleep(2);		　　　　　　//テクスチャを2列2行で分割し、2番目(0から始まる)のグリッドを第2面に貼る。  　　　　　　setTex(2, 2, 2, myTex, 2);　　　　　　llSleep(2);		　　　　　　//テクスチャを4列4行で分割し、3番目(0から始まる)のグリッドを第3面に貼る  　　　　　　setTex(3, 4, 4, myTex, 3);　　　　　　llSleep(2);　　　　　　//テクスチャを4列4行で分割し、4番目(0から始まる)のグリッドを第4面に貼る。  　　　　　　setTex(4, 4, 4, myTex, 4);　　　　　　llSleep(2);　　　　　　//テクスチャを4列4行で分割し、5番目(0から始まる)のグリッドを第5面に貼る 　　　　　　setTex(5, 4, 4, myTex, 5);　　　　　　llSleep(2);    }こうゆう感じになります。</description>
<link>http://tanakaakio.slmame.com/e166578.html</link>
<guid>http://tanakaakio.slmame.com/e166578.html</guid>
<category>実用スクリプト</category>
<pubDate>Sat, 08 Mar 2008 14:06:10 +0900</pubDate>

</item>

<item>
<title>分割してテクスチャを貼るためのスクリプト</title>
<description>　アップ代を節約するためにテクスチャを分割したりしますが、けっこう計算とか面倒ですね。そのためのスクリプトです。使用しているサンプルテクスチャ。//ParameterForGridTexture.lsl//グリッド(格子状)に分割してテクスチャを貼る、もしくはそのときのスケールとオフセットの値を得る。//テクスチャは、オブジェクトのサイズとは関係なく比率で貼り付けられる。//デフォルトテクスチャstring    	defaultTex		= "89556747-24cb-43ed-920b-47caed15465f";   		//テクスチャのUUIDかオブジェクトコンテンツでの名前を指定する。//このサンプルテクスチャにはフルパーミッションを与えてあるので、誰でもこのテクスチャで実行できるはず。string		myTex				=	"0c5fb359-7ca3-00f2-8362-a6c2f0e5e8e9";				//テクスチャグリッドのオフセットを返す。//index:テクスチャのグリッド番号(0から始まる)。//numOfCol:テクスチャのグリッド列数。//numOfRow:テクスチャのグリッド行数。vector getGridTexOffset(integer index, integer numOfCol, integer numOfRow) {    integer 	Col 		= index % numOfCol;        integer 	Row 	= index / numOfCol;    float    	pitchCol       =    1    /    (float)numOfCol;            float    	pitchRow     =    1    /    (float)numOfRow;    float    	offX    =    -0.5   +  pitchCol  / 2  +  Col  * pitchCol;    float    	offY    =      0.5   -  pitchRow / 2  -  Row  * pitchRow;        return     	&lr; offX, offY, 0.0&gt;;}//テクスチャグリッドのスケールを返す。//numOfCol:テクスチャのグリッド列数。//numOfRow:テクスチャのグリッド行数。vector    getGridTexScale(integer numOfCol, integer numOfRow)    {    return        &lr; 1/(float)numOfCol,  1/(float)numOfRow, 0.0&gt;;        }//テクスチャのスケールとオフセットをオーナーにSayする。//index:テクスチャのグリッド番号(0から始まる)。//numOfCol:テクスチャのグリッド列数。//numOfRow:テクスチャのグリッド行数。sayPara(integer index, integer numOfCol, integer numOfRow)        {    vector    scale     =    getGridTexScale(numOfCol, numOfRow);    llOwnerSay("顔ごとに繰り返す(scale)  水平(u)=" + (string)scale.x  + ", 垂直(v)=" + (string)scale.y);        vector    offset     =    getGridTexOffset(index, numOfCol, numOfRow);        llOwnerSay("ずれ(offset)  水平(u)=" + (string)offset.x  + ", 垂直(v)=" + (string)offset.y);        }//スケールとオフセットを設定してからテクスチャを指定面に貼り付ける。//index:テクスチャのグリッド番号(0から始まる)。//numOfCol:テクスチャのグリッド列数。//numOfRow:テクスチャのグリッド行数。//tex:テクスチャ名またはテクスチャのUUID//face:貼り付ける面番号。setTex(integer index, integer numOfCol, integer numOfRow, string tex, integer face)        {    vector    scale     =    getGridTexScale(numOfCol, numOfRow);	llScaleTexture(scale.x,	　scale.y, 	face);     vector    offset     =    getGridTexOffset(index, numOfCol, numOfRow);    	llOffsetTexture(offset.x, offset.y, face);	llSetTexture(tex, face); 	}//テクスチャの状態をデフォルトにする。setDefaultTex()	{	llSetTexture(defaultTex, ALL_SIDES);			llScaleTexture(1.0,	1.0, 	ALL_SIDES); 	llOffsetTexture(0.0, 0.0, ALL_SIDES);	}default    {    state_entry()    {		//繰り返したとき変化が分かりやすいようにデフォルトにする。		setDefaultTex();		llSleep(2);				//テクスチャを2列4行で分割し、3番目(0から始まる)のグリッドを貼るときのスケールとオフセットをオーナーにSayする。   		sayPara(3, 2, 4); 			//テクスチャを2列4行で分割し、3番目(0から始まる)のグリッドが全面に表示されるようにテクスチャを貼る。  		setTex(3, 2, 4, myTex, ALL_SIDES);		llSleep(2);				//変化が分かりやすいようにデフォルトにする。		setDefaultTex();		llSleep(2);				//テクスチャを2列4行で分割し、0～5番目のグリッドのスケールとオフセットをオーナーにSayしながら、0～5番の面にテクスチャを貼る。  		integer	i;		for	(i=0; i</description>
<link>http://tanakaakio.slmame.com/e166167.html</link>
<guid>http://tanakaakio.slmame.com/e166167.html</guid>
<category>実用スクリプト</category>
<pubDate>Sat, 08 Mar 2008 00:33:54 +0900</pubDate>

</item>

<item>
<title>便利で危険なObjectZoomer</title>
<description>　オブジェクトのサイズを自在に変更できるスクリプトです。便利かなと思って使って見ましたが・・・　ちょっと使い方を間違うとオブジェクトがボコボコになってしまうこともｗ大事なものに使うときはコピーをとってからにしてください。まったく責任は持てませんので・・・　使い方は、プリムのコンテンツにこのスクリプトを入れて、チャットからコマンドを入力します。複数のプリムから成るオブジェクトでは、全部のプリムのコンテンツの中に入れます。（プリム数が多いと実はこれがけっこう大変です。）　たくさん子プリムがあるときは、一度持ち物の中にスクリプトを作っておいて、それをプリムのコンテンツにドラッグした方が便利そうです。コマンドは、チャットから/22 magnify=数値 　　指定した倍率で拡大縮小します。2は2倍、0.5は半分になります。      /22 size=数値　　親プリムのサイズx,y,ｚで一番大きいものが指定した数値(メートル)になるようにします。　　0.3は30センチ、5は5メートルです。/22 remove　　このスクリプトをプリムから取り除きます。/22 info　　含まれるすべてのプリムの番号、サイズ、位置、ローテーションなどの情報をオーナーにsayします。/22 ch=番号　　入力チャンネルを変更します。  ミスが起こりやすい点。・このスクリプトをremoveするのを忘れて、他のオブジェクトにコマンドを出したつもりが違うもののサイズも変わってビックリ。・拡大とサイズ指定を勘違いしてとんでもなく大きく(小さく)してしまう。・親プリムを基準にして拡大縮小するが、親といいながら実はオブジェクトの中で一番小さかったりする場合は勘違いしやすい。・縮小で小さいプリムが計算上1cm未満なるときや、拡大で大きいプリムが計算上１０メートルを超えるときに、拡大縮小がうまくいかずに各オブジェクトの比率がおかしくなってしまう。指定を勘違いしたときに起こしやすいが警告もなにも出ない。しかもオブジェクトはボコボコに。//ObjectZoomer.lsl ver1.0integer    LMN_SAY_INF	    						=          -9990010;integer    LMN_REMOVE_INVENTORY    		=          -9990020;integer    LMN_MAGNIFY								=			-9990030;	integer 	chatcomandchannel  = 22;integer 	chatHandle;integer    isIntOrFloat(string s)    {    s = llStringTrim(s,STRING_TRIM);    integer decimalPoint    =    llSubStringIndex(s,".");    integer sLen = llStringLength(s);    if    (decimalPoint == -1)    {        return     isNum(s);    }    else {        if    (decimalPoint==0 )    {    // e.g.     .123            return isNum(llGetSubString(s, decimalPoint+1,sLen-1));        }    else    if (decimalPoint ==sLen-1)    { // e.g.  123.            return isNum(llGetSubString(s, 0,decimalPoint-1));        }  else    {                string s1    =    llGetSubString(s, 0, decimalPoint-1);            if (llSubStringIndex(s1," ")!=-1)    {    //search invalid sapces                return    FALSE;            }            string s2    = llGetSubString(s, decimalPoint+1,sLen-1);            if (llSubStringIndex(s2," ")!=-1)    {    //search invalid sapces                return    FALSE;            }            return    isNum(s1) &amp;&amp; isNum(s2);        }    }}integer isNum(string str){    integer int =  (integer)str;     if(str == (string)int )   {        return TRUE;     }   else    {        return FALSE;    }}startListen()	{	removeListen();	　　//append	llOwnerSay("PrimName=" + llGetObjectName() 			+ " channel=" + (string)chatcomandchannel +" is opened." );	chatHandle    = llListen(chatcomandchannel  , "", llGetOwner(), "");  }removeListen()	{	if	(chatHandle!=0)	{		llOwnerSay("PrimName=" + llGetObjectName() + " channel=" 			+ (string)chatcomandchannel + " is closed.");		llListenRemove(chatHandle);  		chatHandle	=	0;			}}command(string message)        {    if    (llToLower(llGetSubString(message,0, 7))=="magnify=")    {        string    operand    =    llGetSubString(message, 8, llStringLength(message)-1);          if  (isIntOrFloat(operand))    {			llMessageLinked(LINK_SET, LMN_MAGNIFY, operand, NULL_KEY); 			return;		}    }	else	if    (llToLower(llGetSubString(message,0, 4))=="size=")    {        string    operand    =    llGetSubString(message, 5, llStringLength(message)-1);          if  (isIntOrFloat(operand))    {			float	size	=	(float)operand;			vector	v	=	llGetScale();			float	max	=	v.x;			if	(v.y	&gt;	max)	max=v.y;			if	(v.z	&gt;	max)	max=v.z;			float	mag		=	size	/	max;				llMessageLinked(LINK_SET, LMN_MAGNIFY,(string)mag , NULL_KEY); 			return;		}			}    else if    (llToLower(llGetSubString(message,0, 5))=="remove")    	{		llMessageLinked(LINK_SET, LMN_REMOVE_INVENTORY, "", NULL_KEY); 				return;	}    else if    (llToLower(llGetSubString(message,0, 3))=="info")    	{			llMessageLinked(LINK_SET, LMN_SAY_INF, "", NULL_KEY); 			return;		    }     else    if    (llToLower(llGetSubString(message,0, 2))=="ch=")        {		string    operand    =    llGetSubString(message, 3, llStringLength(message)-1);  		if    (isNum(operand))    {            chatcomandchannel    =    (integer)operand;            if  (    chatcomandchannel    &gt;=1       &amp;&amp;        chatcomandchannel</description>
<link>http://tanakaakio.slmame.com/e163024.html</link>
<guid>http://tanakaakio.slmame.com/e163024.html</guid>
<category>実用スクリプト</category>
<pubDate>Wed, 05 Mar 2008 02:22:23 +0900</pubDate>

</item>


</channel>
</rss>