2007年05月27日
ビデオ撮影にQuickTime Playerが必要
SLビューアのメニューの"File" - "Start/Stop Movie to Disk Ctrl-Shift-A"を選んでも
何も起こらないのは、QuickTime Playerが入っていないせい。
昨日入れたので、試しに今日やってみた所、"名前を付けて保存"の窓が出るようになった。
ファイル名を入れてOKを押してゲームに戻ったが、移動ができなくなった。
その場で回転はOK。
aviファイルもできていない。
何か別な問題がありそうだ。
もう一度入りなおしたら、録画中も移動もできるようになった。
しかし、録画停止した後に再度録画しようとしたら、"名前を付けて保存"の窓が出ない。
SLビューア再起動ででるようになった。
で、保存先をC:\にしたら"ビデオの圧縮"という窓が出て、
圧縮プログラム(C):で、Microsoft RLE とか、全フレーム(未圧縮)とかが選べるようになった。
RLEの時は、圧縮の品質も選べる。
この窓が出ている間はSLビューアは停止していてCPUも0%になる。
OKボタンを押した時点で、ファイルが作成されるので、うまくいっているか確認できる。
時間がかかったせいか、歩けない状態が再発。ログアウト。
録画に成功。
・ウインドウの枠内にある画像は、他のウインドウだろうがタスク切り替え窓だろうが保存される
・メニューやデバッグウインドウも保存される(スクリーンショットとは違うので注意)
・ファイル名は"SLmovie_001.avi"のように、指定した名前+_nnnで保存される
・Ctrl+Shift+Aで一時停止してもう一度とると、もう一度"ビデオの圧縮"ウインドウが出て、ファイルの番号は1つ増える。999までやったらどうなるかは不明。
CPUファンがうなっている。
Runtime Errorで落ちるのは謎である。
R6025 - pure virtual function call
と言われてもよく分からない。
ログイン直後にやるとまずいのか?
C:\My Documents にも保存できるのは以外だった。パス名に空白がはいるとNGなのかと思っていた。
C:\Documents and Settings にも保存できた(が、上述のランタイムエラーで落ちた)。
C:\あああ には保存できなかった。(C:\に「縺ゅ≠縺・SLmovie_001.avi」という名前でファイルが作られたが、上述のランタイムエラーで落ちた)。
C:\Xあ には保存できなかった。(C:\に「x縺・SLmovie_001.avi」という名前でファイルが作られた)
C:\xソフト には保存できなかった。(ファイルが作られなかった)。
D:\にも保存できた(が、上述のランタイムエラーで落ちた)。
マイ ドキュメント 配下には保存できなかった。(ファイルが作られなかった)
「あ」はunicodeでU+3042、UTF-8ではE3 81 82 である。
「縺」(レン もつ・れる もつ・れ)は、IMEパッドの文字一覧で調べると、シフトJISで0xe381である。
「あああ」はUTF-8でE3 81 82 E3 81 82 E3 81 82 で
「縺ゅ≠縺」はシフトJISで0xe381 0x82e3 0x8182 0xe381 である。
フルスクリーンにしてキャプチャしたら途中で落ちた。
出来上がったaviを見ると、メニューバーに青い線がちらちら入り、下側が切れていた。
1ファイルのサイズ4GBの制限にひっかからないように注意。
2007年05月27日
謁見、セミナー、クイズ大会、語り合い
セミナーとクイズ大会終了後にikebukuroのtakarajimaのmattari hirobaに戻って
おしゃべりしていると色々な人がやってきた。aquaさんの人徳。
感激したのは、Seagelさんにお会いできたこと。
本当にあの姿で笑顔がキュートだった。
聞きたいことも色々あったはずなのに、いざ本人(本狐?w)を目の前にすると出てこない。
それまで椅子に足を組んで座っていたのを、足をそろえて膝に手を置くポーズに変更。
Seagelさんはさっそく椅子のスクリプトをお調べになられ、TINYのHULさんが
椅子に埋まっているのを見て、座る位置調整のスクリプトを皆に配ってくださる。
llSetLinkPrimitiveParams使ってるあたり、ばりばりの現役スクリプターである。
師匠と呼ばせてもらう事に勝手に決定。
コーディングスタイルに良い所がすごく多いので、そこは一字一句真似しよう。
気さくで、前向きなおかたであった。
話が前後するが、RL-SL連動のセミナー。SL側のサブ会場のスタッフの一員として参加。
会場で誘導やアナウンスの手伝いをちびっとやった。
RLで行われているセミナーの中継やSLとの連動なんてできるのかと半信半疑だったが、
実際に見てみるとそれほど違和感がない事にとても驚いた。
声が小さかったり映像が開始されない人への対応などで
内容までゆっくり見られなかったので、後でどこかにUPされるのを期待。
シャイアンさん、ストンクさんと私の合作となった紅白旗もほぼ無事に機能した。
自分たちの作ったものが目の前で使ってもらえているのを見られるのは
大きな喜びだ。
RL会場でも紅白の紙が配られて、アンケートでは1つの質問にRL-SL3会場の両方で
答えられ、一体感という点が達成できたと思う。
13時~17時過ぎと長丁場だったが皆さんほんとにお疲れさまでした。
準備も含め短期間だったのに団結してスピーディーに進められたのは
楽しいからなんだろう。
休憩。体をほぐしに行くついでに晩飯を買ってきた。
22時からクイズ大会。
セミナーで力尽きたと見えて、過去の優勝経験者や常連の優勝候補者が不在。
司会者のryuさん、セミナーのSLメイン会場の設置や当日の運営の指揮をとって
いたのにクイズもアナウンスどおりきっちりやるのはパワフルだ。
最初のマルバツは運だけで通過した。通過を決めた問題は
「ぜんせかいでファミコンはスーファミより売れた?」だった。
ロボのyatsukiさんとともに決勝進出。
4人で行われた決勝ではサービス問題も多く点差がほとんど開かない。
横取り20点もなく最終問題の時点でも誰でも優勝の可能性があった。
途中のボケ問題で頭を絞ってボケたのが司会者に気に入ってもらえたのと、
最後の問題が分からなかったので適当に押したのが、
たまたま正解だったので、なぜか優勝。賞金ももらってしまった。
次回は10回目記念で優勝賞金は5000LD$を予定しているそうな。
参加者多そうだな。
その後のikebukuroでのおしゃべりは、Seagelさんにお会いしたのは上述のとおりだが、
他にも色々(としか表現できない)。
SLとRLとか企業に求めることとかボイス機能どうとか。
気づけば4時だった。
最後のほうは自分でもわけの分からない持論を展開していたような気もするが、
覚えていない(^^)
2007年05月26日
2007年05月24日
旗完成
TINY用のは、頭の上で振るように位置も少し直した。
配布BOXに貼るための写真をとらないと。
MLに入っていなかったのでようやく登録メールを出した。
llRegionSay()は気になるが、今は後回し。

2007年05月23日
ビューアのslviewer-src-20070305a
SimulatorのMain Agentsは、linden\indra\newview\llviewermessage.cppにある
>void process_sim_stats(LLMessageSystem *msg, void **user_data)
からたどればいけるんじゃないか?と思ったが、
linden\indra\newview\llstartup.cppの
>void register_viewer_callbacks(LLMessageSystem* msg)
で
> msg->setHandlerFunc("SimStats", process_sim_stats);
などとコールバック関数にされており、とたんに分からなくなる。
最新版で遊んでみるかと思ったが、相変わらずコンパイル通すまでの設定変更が面倒なので放置。
linden\indra\lscript\lscript_library\lscript_library.cpp もざっと見たけど、LSLからSIM内人数を知る関数は無いように思う。
2007年05月22日
旗なおし中
・チャンネルをある程度ランダムに設定。
・なるべくリスナーを無効にしておく。
・llListenControl(LHandle, FALSE);や、llListenRemove(LHandle);で後片付けする。
昨日ちょっとチャットで話したら、すぐにアニメを作ってくれたStonkさんに感謝。
2007年05月22日
複数スクリプト
1オブジェクト内なら受け渡しはどうにかなりそう。
今度試してみよう。
教えてくれたりおしゃべりにつきあってくれたりする人がいるのは嬉しいし有り難い。
2007年05月22日
紅白旗
はたを上げるポーズでそのままほおっておくと、ひじが曲がってしまう。
アニメーションで肩だけ上げていると、デフォルトの動作(腰に手を当てる)がひじに適用されるんじゃないかと教えてもらう。
アニメーションつくりにもコツがあるらしい。

画像は、水没中のikebukuro。SIM再起動は初めて見た。sugamoから海が見えた。
2007年05月16日
llRegionSay()はどこでも届くのか不明
どういうことなのかよく分からない。
オブジェクト編集で数値入力する欄に日本語で0を入れると落ちる場合があるのはどうにかしてもらいたい。
2007年05月14日
テクスチャは独占使用できないのか?
コピー、譲渡、販売したときにはuuidは変わるのか?
世界から消してしまいたくなったら、持ち主が削除すれば表示されなくなるのか?
そのうち調べてみたい。
2007年05月13日
2007年05月12日
フットサル参加
巣鴨FC(と勝手に命名)との初試合である。
5vs5にするためにエースストライカーを向こうにとられてしまったのは
大きな戦力ダウンだった。
覆面の忍者とロボがいるオレンジ色のユニフォームのがうちのチームである。
前半まずはダンゴ状態からはじきとばしたこぼれ球で一点先取。
しかしわずか1分後にミドルシュートをうけて同点に追いつかれる。あなどれん。
押し気味で試合を進め、今度はやや外れたコースの球が運良くねこのひとにぶつかってゴール。2-1に。
つづいてレギュラーメンバーがきれいにロングシュート。点差を3-1に広げる。
勢いにのるオレンジチームだったが、間をぬったパスで1点返された。3-2。
集中力が切れかけた前半終了間際、相手アバターをふきとばすほどの力技で1点もぎとる。4-2。
後半は巣鴨FCも操作になれてきたせいか、一進一退が続く。
終了間際にすきをついてゴール付近からのシュート。5-2に突き放して
そのまま試合終了。
これまでは人数が少なく、3vs3の時などは、ひきつけてから前にロングパス、そのままドリブルシュート
という流れが出来たが、人数が多いと悠長にひきつけているわけにはいかない。
瞬時の判断が要求される。
勝利チームには、aquaさんのご好意で賞金が渡され、みんなで5等分した。
テスクチャupload代でちょっと懐がさびしくなっていた身には大変ありがたい。
ありがたく頂戴した。
2007年05月12日
「Limit 5 コンテスト」表彰式
22時まで投票受け付けで、その後に表彰式があった。
1,2位のMoranさんは1人としてカウントしたため、2位がManjiさんで
3位がmarch、4位がLeosoさんだった。

Moranさんのラーメンはとてもリアルで湯気まであがっていた。扇風機もなびいてるひもがいい雰囲気をだしていた。
Manjiさんのマイクスタンドはマイクの高さやポーズを変えられるなど親切な作りなうえ、説明看板も分かりやすかった。
私の掲示板は、もう少し小さめのほうが字がにじまなくてよかったかな?
Leosoさんの水と一緒に回れる噴水は座ってみるとゆったりとした気分になれてよかった。
個人的にはSheltさんのロボヘッドがカッコよかったと思う。
参加者の皆さんおつかれさまでした。
2007年05月12日
ひとこと掲示板を漢字対応
ASUKAグループに招待してもらったので、グループも指定した。
listは初期化時に72個しかアイテムを持てないのは知っていたので、区切って256個のキー追加。
すると、実行時にStack-Heap Collisionが出て動かない。
この辺を見ていくつか試す。
http://lslwiki.net/lslwiki/wakka.php?wakka=memory
デバッグチャンネルで言ってくれればいいのに、オブジェクトの発言として出るから最初は見逃してしまった。
結局リストの要素は16個のキーにしてif文を使ってだらだらと書くことにした。
2007年05月10日
「Limit 5 コンテスト」に作品を出した
前から作っていた掲示板である。
漢字も対応だ!と意気込んだ。
さざなみフォントで16*16文字で256枚の画像を作って、
使いそうなところをuploadした所で力尽きた。
英数字と一部の漢字・記号しか表示できない状態である。需要があったらちゃんと漢字対応しよう。
自分のデザインセンスのなさには驚きと困惑をおぼえる。



台形プリムを使って3フェース表示させる方法はcheyさんに教えてもらった。
最初に思いついた人はアイデア賞モノだと思う。
2007年05月07日
llRemoteLoadScriptPinで別スクリプト呼出
複数のスクリプトの扱いについて、情報が散逸しているので自分用にまとめる。
情報源は、http://wiki.secondlife.com/wiki/ やhttp://www.lslwiki.net/lslwiki/wakka.php や
LSLGuide.pdf。
(間違いがあったら教えてください~)
・オブジェクト内には、スクリプト名のABC順に並べ変えられて格納される。
大文字小文字は関係ない。
・一番上に格納されているスクリプトが実行される
・同じオブジェクトに入っているスクリプトを呼び出す際は、PINを指定しておかなくてOK。
KEYもNULL_KEYでOK。
・別なオブジェクトに入っているスクリプトを呼ぶ場合は、呼び先がRezされている必要がある
(インベントリに入っているだけではダメ)
・呼び出すタイミング(イベント)によって、動作が変わるので注意。下記の例参照。
state_entry()で別スクリプトを呼び出すと、touch_start()の処理はinvokerが終わってからchild
touch_start()で別スクリプトを呼び出すと、
・・・だと思ったが、いったんTakeしてからでないと、最後にオブジェクトに入れたスクリプト
を最初に実行しているように見える。不明。
・PIN(Personal Identification Number)はinteger
・スクリプトをまたがって変数を受け渡す方法はなさそう。
llRemoteLoadScriptPin関数の最後の引数を使えば、llGetStartParameter関数でintegerを受け取れる
ID設定に使うなら、オブジェクトの属性としてllSetAlpha関数/llGetAlpha関数とかで受け渡したほうがいいかも。
・llRemoteLoadScriptPin関数の先頭の引数の「key target」に何を指定すればいいのかは不明。
続きを読む
//00Invoker-1 呼び出す側のスクリプトその1
default
{
state_entry()
{
llOwnerSay("rez " + llGetObjectName() + "with " + llGetScriptName());
llRemoteLoadScriptPin(NULL_KEY, "child-script", 3, FALSE, 0);
}
touch_start(integer total_number)
{
llOwnerSay("Touch start at " + llGetScriptName());
llOwnerSay("Touch end at " + llGetScriptName());
}
}
//00Invoker-2 呼び出す側のスクリプトその2
default
{
state_entry()
{
llOwnerSay("rez " + llGetObjectName() + "with " + llGetScriptName());
}
touch_start(integer total_number)
{
llOwnerSay("Touch start at " + llGetScriptName());
llRemoteLoadScriptPin(NULL_KEY, "child-script", 3, FALSE, 0);
llOwnerSay("Touch end at " + llGetScriptName());
}
}
//child-script 呼び出される側のスクリプト
default
{
state_entry()
{
llOwnerSay("rez " + llGetObjectName() + "with " + llGetScriptName());
}
touch_start(integer total_number)
{
llOwnerSay("Touch start at " + llGetScriptName());
llOwnerSay("Touch end at " + llGetScriptName());
}
}
2007年05月07日
Linden Town Hall Meeting 寝落ち
うっかり寝てしまい気づくとクライアントが落ちていた。
会場でも流れていたRadio Lindenで、苗字がLindenの人へのインタビューがあった。
スピードを半分にして5,6回聞いても半分も理解できないが、長時間がんばって働いてるぽかった。


2007年05月05日
2007年05月05日
文字の変わる箱
「/3 A」とかやると文字の変わる箱を作った。
余計なコードやデバッグ用のコードが残っているが、自分メモとして。
大半はパクリ。
フォントは東雲なんでとりあえず安心。
string texture;
float x;
float y;
float u;
float v;
integer xmax = 16;
integer ymax = 16;
integer LHandle;
integer CHANNEL = 3;
//--------
//see http : // wiki.secondlife.com/wiki/XTEA_Strong_Encryption_Implementation
//--------
//Function: ord
//Returns the index of an ASCII character
integer ord(string chr)
{
string ASCII = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
if(llStringLength(chr) != 1) return -1;
if(chr == " ") return 32;
return llSubStringIndex(ASCII, chr);
}
//Function: DWord2Hex
//Converts a dword containted in a LSL integer to hexadecimal format.
string DWord2Hex(integer m){
string result;
integer i = 0;
integer index = 0;
//Define character string [0-F] for use in building the hex.
string characters = "0123456789ABCDEF";
//Step through 8 times, for a total of 32 bits, 8 nibbles, and 8 hexadecimal digits.
for (i = 0; i < 8; i++){
//Get a nibble by right-shifting and masking off 4 bits.
index = (m >> (i * 4)) & 0xF;
//Grab character from the characters string at index position and add it to the result string.
result = llInsertString(result, 0, llGetSubString(characters,index,index));
}
return result;
}
integer initialize()
{
LHandle = llListen(CHANNEL, "", NULL_KEY, "");
llListenControl(LHandle, TRUE);
llSleep(0.5);
llOwnerSay("listen start. ch=" + (string)CHANNEL);
return 0;
}
vector ascii2pos(integer code)
{
integer x;
integer y;
vector pos;
//
x = code % xmax;
if(x > xmax || x < 0)
{
x = 0;
}
pos.x = (1.0 / xmax) * ((xmax / 2) - x - 0.5);
pos.x *= (-1);
//
y = code / xmax; //xmax is. NOT ymax.
if(y > ymax || y < 0)
{
y = 0;
}
pos.y = (1.0 / ymax) * ((ymax / 2) - y - 0.5);
//pos.y *= (-1);
//
return pos;
}
vector setAsciiTexture(integer code)
{
vector pos = ascii2pos(code);
llOffsetTexture(pos.x, pos.y, ALL_SIDES);
llOwnerSay("setAsciiTexture " + (string)pos);
//
u = 1.0 / xmax;
v = 1.0 / ymax;
llScaleTexture(u, v, ALL_SIDES); // kakudai
return pos;
}
default
{
state_entry()
{
//x = (1.0 / xmax) * -3.5;
//y = (1.0 / ymax) * 6.5;
//u = 1.0 / xmax;
//v = 1.0 / ymax;
//llOffsetTexture(x, y, ALL_SIDES);
//llScaleTexture(u, v, ALL_SIDES); // kakudai
//llOwnerSay("x=" + (string)x + ",y=" + (string)y + ",u=" + (string)u + ",v=" + (string)v);
//
initialize();
}
listen(integer channel, string name, key id, string message)
{
string oneStr = llGetSubString(message, 0, 0);
llOwnerSay("[" + oneStr + "] is " + (string)ord(oneStr) + ". 0x" + DWord2Hex(ord(oneStr)) + ".");
llOwnerSay("[" + oneStr + "] is " + (string)ord(oneStr) + ". 0x" + DWord2Hex(ord(oneStr)) + ".");
integer a = ord(oneStr);
integer pos_x = a % 16;
integer pos_y = a / 16;
llOwnerSay((string)a + "=(" + (string)pos_x + "," + (string)pos_y +")");
//
llOwnerSay((string)ascii2pos(a));
setAsciiTexture(a);
}
}
2007年05月04日
コードの貼り付け
キーワードを色付けとかはプラグインがいるのかな。
default
{
state_entry()
{
llSay(0, "Hello, Avatar!");
}
touch_start(integer total_number)
{
llSay(0, "Touched.");
}
}