2007年12月22日
日英チャット対応口パクアニメーションテクスチャDEMOじゃよ

19表情アニメーションHUDを制作致したが、チャットに合わせた口パクには対応しており申さん。
何とか口パクを実現致したく、19表情を短く繋ぎ合わせて口パクのように見えないかとテストスクリプトを制作致しテスト致したものの口パクとしては使い難い現状でござる。
そこで、アニメーションテクスチャを利用しマンガチックに口パクさせることに致したのじゃ。
マンガチックゆえ使い様は限られようが、これも一興と制作致しチャットによる口パクを実現致し申した。
記事画像は拙者の忍者頭巾の目出し部分を透明に致し、簡易な口パターンを描き加えアニメーション用テクスチャに致したもの。
今回はフリーのWindows Media エンコーダにてマグログでのストリーミングファイル形式のwmvに変換しアップ致したので、マグログ版ブログのこの記事下アイコンよりストリーミングでご覧下され。
スクリプトとアニメテクスチャ設定は改めて報告するでござるよ。
2007年12月22日
眉毛編集で問題発覚&新発見!?

ルナ殿制作のMiho(右)に菊枝の髪型アイコンを装着したMiho(左)
ルナ殿が第3の新作シェイプ、Mihoを作り申した。
拙者スキンのオリジナルの眉は弓なりな丸味のある眉じゃったが、ルナ殿にて容姿編集の髪設定内にある眉を編集致し直線的な眉になされたのじゃ。(髪はボウズ頭)
「幸田くみ できてもた!!」とあったIM通り、それ風な美人で誠に結構。
しかし問題はその後、ルナ殿が他のシェイプ&スキンに変更して発覚し申した。
変更したはずのシェイプ&スキンにはMihoの眉が描かれておったのじゃ!・・
何故か編集での設定値が引き継がれてしまったようじゃ。
悶着の末、シェイプ&スキンとは別に髪型アイコンの存することがあり申すが、その髪型アイコンを装着すると髪型だけでなく眉迄も変わることに気付き申した。
つまり、髪型アイコンには眉の編集情報も含まれておるのじゃ。
なるほど、なれば髪形アイコンの装着をはずせばよいのじゃな!
と装着中表示されておる髪型アイコンを右クリック致しはずそうと致せば、
・・・ない!!
??とアバターを右クリック致し探索するも見当たらない・・・
クライアントメニューは如何と見るも其れらしきは無く座礁に乗り上げたのじゃった。
他の髪型アイコン情報に差し替えできるものの、髪形アイコンを取り外してデフォルトの状態に戻すことができない。
一旦髪型アイコンを装着致せば常に何らかの髪型アイコンを装着することになる・・・
これはつまり、販売致しおるシェイプ&スキンは当然ながら個々のイメージを定めて制作致しおるが、購入者殿が所有しおる独自の髪型アイコンを装着致し、或いは装着致しおれば髪型は良いとして眉編集されおる髪形アイコンならそうと知らず?眉まで変わってしまうということじゃ。
購入者殿がそうと知って装着致しおればよいのじゃが、拙者のみならず物持ちのルナ殿までこのことを知らなんだことを鑑みれば気付かず、或いは眉変化に気付きおるが原因・対処の判らぬ御仁が多いのではと勘考致す次第。
髪型アイコンの取り外し法、或いは拙者の認識不足を指摘いただければ幸いで御座る。
シェイプ&スキンを制作意図通り装着頂くが大事故、それぞれの容姿編集にて保存致した髪型アイコンを同梱致すべきではとルナ殿とは話し合い申したが、今のところ最終的な対策を決するに至っており申さんのでござる。
ともあれ、皆様方におかれましても斯様な問題認識を心に留め置かれ、眉に不審を抱かりせば、容姿編集の髪編集にて髪型共々好みの眉に編集致し保存にて表れくる髪型アイコンをシェイプ・スキンアイコンと同じフォルダに同梱されるがよろしいかと存ずる次第。
2007年12月17日
お手軽ビデオ撮影・変換・結合ソフト紹介と使用法でマシニマ前進

プロフィールにマシニマ制作を目指すと書きながら未だにショート作品はおろか制作法すら取得できており申さぬが、亀足ながらも進んでおるのはおるのでござる。
今月出店致した第3のショップ、sonicmart店は借り店ながら購入手続きにて形式上オーナー登録されおりビデオと音楽を流せることは先般報告致した通り。
早速、休眠しておったMacMiniをサーバーに仕立て兎も角はと拙作・アレンジBGM「永遠(とわ)に」と急ごしらえビデオを流すに至ったのじゃった。
これにて、作品放映の段取りは整いマシニマへの歩を一つ進み得たと言えよう。
その後も、商品が増えるなど折に触れビデオ撮影をばなし、それを結合致してビデオが長大化しておるのじゃよ。
SLでのビデオはQuick Timeが使われおるゆえ、AVI撮影されたビデオをmov形式に変換致しおるのじゃが、拙者がお世話になっておるフリーの撮影・変換・結合ソフトと拙者の只今の簡易な遣い方を紹介致すでござるよ。
本日も撮影・結合致したが、仕上がり様は下にアップ致したのでご覧下され。
撮影はSLでは定番であるらしいFLAPSのフリー版を使っており申す。(画像最上部)
シェアウエアでござるが、機能限定のフリー版があり、現在はこれにて済ましおるのじゃ。
画像トップにFLAPSの文字が入ることと、ワンシーン当たり10秒の制限時間があり時間になると自動的に録画終了されるのじゃ。
音声も録音されるでござるよ。
アップ致したビデオ(本ブログでmovはストリーミング対象でないのでダウンロード要、ショップでストリーミングを確認あれ)では特別な音声を入れることもなく商品動作のデモ映像を撮って居るだけじゃが、カメラ操作時のクリック音の入りおるが聞き取れ申そう。
確か、当初のビデオ録画・終了のショートカットがF9に割り当てられおったが、F9はSLクライアントでは回転ダンス?ジェスチャに割り当てられおり、録画下開始時にそのダンスで始まりおった。
アップビデオの始まりがそれでござり、まあそれも酔狂とそのままに致したが追加シーン毎に繰り返されるのはイカンとショートカットをF4に変更致し申した。
FLAPS画像中央付近にVideo Capture HotkeyにF4とあるのがそれで、変更致すにはそこをクリック致し黒く選択されおる状態で希望のキーを押せば変わるのじゃ。
拙者の撮影設定は画像の通りにて、起動致し最小化致し邪魔にならぬ状態でキャプチャーキー(拙者はF4)を押して録画・停止の簡単操作で御座る。
拙者のお気楽アップビデオではカメラ・コントロールにてカメラ操作致し操作音が聞こえおるが、マシニマ等作品ではクライアントの余分な表示を無くし、カメラもマウス操作にて行う必要が御座ろう。
恥ずかしながらマウスでのカメラ操作は未だ収得しており申さず、機を改めて報告するでござるよ。
撮影は斯様に致し、制限時間が唐突に訪れしをそのままに結合致したる正にお気軽映像なのじゃ。
よって、只今のところカット・効果等の編集ソフトは使用致しておらず、その紹介も後日でござるよ。(汗・・)
次なるは変換ソフト。
FLAPSの成果は大容量のAVIファイルでござるが、これをば軽量なmovファイルに変換致すが中画像のBatch GOO!!でござる。
色々にカスタマイズできるソフトじゃが、拙者は画像上部3分の1程に見える通り、おまかせ:Mac向け(高画質)を利用してござる。
これを選べばその他の設定はご覧の通り(mov,640×480,30fp等)自動設定されるのじゃよ。
使い方は、上部白枠内に対象ファイルをドラッグ&ドロップ致し、右端のGo!ボタンを押せばよし。
本日追加したFLAPSでのAVIファイル307MB!が6.89MBに圧縮され申したよ。
そしてシメのmovファイル結合は画像最下段のUnitMovieでござる。
これも至極お手軽なソフトじゃ。
上部白枠内に結合致すmovファイルをドラッグ&ドロップ致し、下の保存先プルダウンメニューより保存先を選んで結合ボタンを押すだけじゃ。
結合されたファイルは一番最初にドラッグ&ドロップ致したファイル名となるのじゃが、これがサーバー用ファイル更新に便利至極。
今までの放映ビデオファイルを先にドラッグ&ドラッグ致し、新たに追加致すビデオファイルをその後に入れて結合致せば新たな放映用ビデオファイルの名前が変わらぬ寸法。
結合後のビデオファイルをそのままサーバーにあるビデオファイルと差し替えるだけで追加更新完了じゃ。
今気づいたのじゃが、UniteMovieをダウンロード致せばビデオファイルをカット致せるcutmovie.exeも同じフィルダに入っており申すよ。
性能の限界
UniteMovieで画質や音質の異なる動画を結合することは出来ません。
結合出来たとしても、プレイヤーでうまく再生されません。あしからずご了承ください。
斯様な説明があるゆえ、BatchGOO!!設定が同じファイル同士を結合致すぞよ。
これにて手軽にビデオ放映致せること必定!
そなたもビデオ道に励みなされ!!
2007年12月15日
Shape&Skin完成!と19表情HUDスクリプト公開!!

実に長い道程でござったが、拙者入魂のスキンがルナ殿入魂シャイプと合体し菊枝殿となって完成致し申した。
画像をご覧あれ、豊満な胸の光沢が実に艶かしく魅入ってしまうのじゃ。
スキンとシェイプの相性よろしく絵に描いたるが如き和風美人、ルナ殿に名前を如何致すかと問えば即座に「菊枝」とインスピレーションでの命名でござった。
美しさに更なる磨きをかけるべくFace & Body Lightを所望され、制作並びにライトの調整を致し付属致し申した。
先に完成致しおったRuna & Rinブランドロゴをあしらった販売ポスターを各店に設置致せば高級感ありと見え、ブランド出発の感慨もひとしお。
さて、次はなにを制作致そうか?
唐突なついでじゃが、19表情チェンジHUDスクリプトを掲載するでござるよ。
前回記事でのつもりが容量オーバーでアップできなんだのじゃ。(笑)
//オーナーの0チャンネルをリッスンして、最後に入力された00~18の数字によりインデクス判断して表情アニメ
//19Expression_change_HUD
list hyoujou=[
"express_afraid_emote",
"express_anger_emote",
"express_bored_emote",
"express_cry_emote",
"express_disdain",
"express_embarrassed_emote",
"express_frown",
"express_kiss",
"express_laugh_emote",
"express_open_mouth",
"express_repulsed_emote",
"express_sad_emote",
"express_shrug_emote",
"express_smile",
"express_surprise_emote",
"express_tongue_out",
"express_toothsmile",
"express_wink_emote",
"express_worry_emote"
];
key agent;
integer hyoujou_index;
integer handle;
string hyoujou_name;
string index_msg;//リッスンイベントにてオーナーチャット発言最後2文字の表情インデクス文字代入
string urlenco;
integer url_num;
integer english_or_not;//英語と日本語分岐判定フラグ
string urlenco_1;//チャット最後2文字URLエンコード結果1文字目
default {
state_entry()
{
hyoujou_name="express_toothsmile";
agent=llGetOwner();
handle = llListen(0, "",agent , "");//オーナーのオープンチャンネルでのチャットリッスンON
}
on_rez(integer i){
llResetScript();
}
run_time_permissions(integer perm) {
if ((perm & PERMISSION_TRIGGER_ANIMATION)&&(english_or_not==0)){
//llOwnerSay("Japanese & HUD");//check
if(urlenco=="%EF%BC%90%EF%BC%91"){
llMessageLinked(LINK_ALL_CHILDREN,0,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=0;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%90%EF%BC%92"){
llMessageLinked(LINK_ALL_CHILDREN,1,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=1;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%90%EF%BC%93"){
llMessageLinked(LINK_ALL_CHILDREN,2,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=2;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%90%EF%BC%94"){
llMessageLinked(LINK_ALL_CHILDREN,3,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=3;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%90%EF%BC%95"){
llMessageLinked(LINK_ALL_CHILDREN,4,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=4;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%90%EF%BC%96"){
llMessageLinked(LINK_ALL_CHILDREN,5,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=5;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%90%EF%BC%97"){
llMessageLinked(LINK_ALL_CHILDREN,6,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=6;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%90%EF%BC%98"){
llMessageLinked(LINK_ALL_CHILDREN,7,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=7;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%90%EF%BC%99"){
llMessageLinked(LINK_ALL_CHILDREN,8,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=8;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%90"){
llMessageLinked(LINK_ALL_CHILDREN,9,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=9;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%91"){
llMessageLinked(LINK_ALL_CHILDREN,10,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=10;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%92"){
llMessageLinked(LINK_ALL_CHILDREN,11,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=11;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%93"){
llMessageLinked(LINK_ALL_CHILDREN,12,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=12;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%94"){
llMessageLinked(LINK_ALL_CHILDREN,13,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=13;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%95"){
llMessageLinked(LINK_ALL_CHILDREN,14,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=14;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%96"){
llMessageLinked(LINK_ALL_CHILDREN,15,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=15;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%97"){
llMessageLinked(LINK_ALL_CHILDREN,16,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=16;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%98"){
llMessageLinked(LINK_ALL_CHILDREN,17,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=17;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%91%EF%BC%99"){
llMessageLinked(LINK_ALL_CHILDREN,18,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=18;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(urlenco=="%EF%BC%92%EF%BC%90"){//URLエンコード20時HUDボタン時処理
llStartAnimation(hyoujou_name);
}else{
return;//その他インデクス指定なし一般チャット時
}//else
}else if((perm & PERMISSION_TRIGGER_ANIMATION)&&(english_or_not==1)){//英語チャット時
llOwnerSay("English");//check
if(index_msg=="01"){//0はパーミッション時に除いているので0分岐削除して1から
llMessageLinked(LINK_ALL_CHILDREN,0,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=0;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="02"){
llMessageLinked(LINK_ALL_CHILDREN,1,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=1;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="03"){
llMessageLinked(LINK_ALL_CHILDREN,2,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=2;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="04"){
llMessageLinked(LINK_ALL_CHILDREN,3,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=3;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="05"){
llMessageLinked(LINK_ALL_CHILDREN,4,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=4;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="06"){
llMessageLinked(LINK_ALL_CHILDREN,5,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=5;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="07"){
llMessageLinked(LINK_ALL_CHILDREN,6,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=6;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="08"){
llMessageLinked(LINK_ALL_CHILDREN,7,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=7;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="09"){
llMessageLinked(LINK_ALL_CHILDREN,8,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=8;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="10"){
llMessageLinked(LINK_ALL_CHILDREN,9,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=9;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="11"){
llMessageLinked(LINK_ALL_CHILDREN,10,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=10;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="12"){
llMessageLinked(LINK_ALL_CHILDREN,11,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=11;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="13"){
llMessageLinked(LINK_ALL_CHILDREN,12,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=12;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="14"){
llMessageLinked(LINK_ALL_CHILDREN,13,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=13;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="15"){
llMessageLinked(LINK_ALL_CHILDREN,14,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=14;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="16"){
llMessageLinked(LINK_ALL_CHILDREN,15,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=15;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="17"){
llMessageLinked(LINK_ALL_CHILDREN,16,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=16;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="18"){
llMessageLinked(LINK_ALL_CHILDREN,17,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=17;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else if(index_msg=="19"){
llMessageLinked(LINK_ALL_CHILDREN,18,"", NULL_KEY);//チャット分岐時ルート~全ボタン(子プリム)に送信
hyoujou_index=18;
hyoujou_name=llList2String(hyoujou, hyoujou_index);//選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
}else{
return;
}//else
}//上位else if
}//run_time_permissions
link_message(integer sender_num, integer num, string str, key id){//表情ボタン受信処理、else処理ではこのままで変更なしOK
hyoujou_index=num;//plus
english_or_not=0;//HUDボタンは日本語URLエンコード20での扱い
urlenco="%EF%BC%92%EF%BC%90";//HUDボタンはURLエンコード20扱い
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
hyoujou_name=llList2String(hyoujou, num);//選択表情アニメ名セット
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);//アニメパーミッション発動
}
listen(integer channel, string name, key id, string message){
index_msg=llGetSubString(message,-2,-1);//受信したmessageの最後2文字目を取得、-1は最後の文字
//llOwnerSay(index_msg);//check_OK
urlenco=llEscapeURL(index_msg);//日本語入力されたチャットのインデクスをURLエンコードして扱えるように
//llOwnerSay(urlenco);//check
urlenco_1=llGetSubString(urlenco,0,0);//URLエンコード結果1文字目を取得
if(urlenco_1!="%"){
english_or_not=1;//英語フラグ設定
//url_num=(integer)urlenco;//英語時はintegerキャストせずindex_msgのまま分岐処理
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);//アニメパーミッション発動
}else if(urlenco_1=="%"){
english_or_not=0;//日本語フラグ設定
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);//アニメパーミッション発動してイベント内で分岐
}
}
}
//各表情ボタン、 ルートへは名前と表情アニメインデクス送信~後は全てルートにて処理
string self_name="bored";//各表情ボタン名
integer index_num=2;//各表情ボタンアニメインデクス=表情リストに対応
default {
state_entry(){
llSetColor(<1.0,1.0,1.0>,ALL_SIDES);//デフォルトは白
llSetText(self_name,<0,1, 1>, 1 );//デフォルトは水色
llSetAlpha(0.3,ALL_SIDES);
}
touch_start(integer detected){
llSetColor(<0.0,1.0,0.0>,ALL_SIDES);//オンは緑
llSetText(self_name,<1, 0,0>, 1 );//オンは赤
}
touch_end(integer detected){
llMessageLinked(LINK_ALL_OTHERS,index_num, (string)self_name, NULL_KEY);//自分以外に送信,ルートにも送信
}
link_message(integer sender_num, integer num, string str, key id){//他プリム=ボタンより受信
//llOwnerSay("root message!!");//ここまではルートからチャット分岐時メッセージ、他ボタンクリック時もここに来てる
if(str==""){//rootからチャット受信~分岐処理時メーセージ,hyoujouリストインデクス情報受信~判定
if(num==index_num){
llSetColor(<0.0,1.0,0.0>,ALL_SIDES);//オンは緑
llSetText(self_name,<1, 0,0>, 1 );//オンは赤
}else{
llSetColor(<1.0,1.0,1.0>,ALL_SIDES);//消灯にてデフォルト=白
llSetText(self_name,<0, 1, 1>, 1 );//デフォルトは水色
}
}else if(str !=""){//他ボタンからのメッセージ
llSetColor(<1.0,1.0,1.0>,ALL_SIDES);//消灯にてデフォルト=白
llSetText(self_name,<0, 1, 1>, 1 );//デフォルトは水色
}
}//link_message
}
2007年12月12日
19表情チェンジャーHUDスクリプトでの日英同時両対応

19表情チェンジHUD販売アニメーションポスター用画像
19表情チェンジHUDをボタンクリックでの表情アニメだけでなく、チャットしながらでも表情変更アニメ入力致せればより便利でござろうと日本語への対応を果たし申した。
スクリプトでの日本語の使用についてはMakapu「lslで日本語を使う」にURLエンコード用のHPページへのリンクと共に説明されおるにて合点を得たのは既報の通り。
したところ、英語への対応をも致すべきじゃろうとの思いが湧きおったのじゃ。
英語は日本語の如き工夫なく使えるゆえ対応については日本語のURLエンコード処理を除けばよく簡単。
と思いきや、難題にぶつかり申した。
どちらでチャットされるかはオーナー殿次第じゃが、スクリプトのリッスンにて日本語と英語チャットを如何に判別致せばよいのじゃろう・・・・・・・?
斯様な知識・情報はあり申もうさず、Makapuのlsl関数・イベント一覧にもそれらしきは無し・・・
URLエンコード変換チェック表
変換前 バイト URLエンコード変換後 バイト SL内integerキャスト結果
04 4 %ef%bc%90%ef%bc%94 18 0
16 4 %ef%bc%91%ef%bc%96 18 0
00 2 00 2 0
01 2 01 2 1
15 2 15 2 15
00 4 %ef%bc%90%ef%bc%90 18 0
01 4 %ef%bc%90%ef%bc%91 18 0
02 4 %ef%bc%90%ef%bc%92 18 0
16 4 %ef%bc%91%ef%bc%96 18 0
04 2 04 2 4
16 2 16 2 16
ji 2 Ji 2 0
JI 2 JI 2 0
h5 2 h5 2 0
H5 2 H5 2 0
いえ 4 %e3%81%84%e3%81%88 18 0
家庭 4 %e5%ae%b6%e5%ba%ad 18 0
犬7 4 %e7%8a%ac%ef%bc%97 18 0
AB 4 %ef%bc%a1%ef%bc%a2 18 0
経過はさておき上のURLエンコード変換チェック表をご覧あれ。
HUDへのチャット入力による表情アニメ指示は、チャット最後の01~19(HUD各ボタン名最後の数字)2文字入力によるのじゃが、表は半全角入り乱れて踊っておる。
じゃなく、日本語と英語で2文字入力した場合の変換前バイト数・URLエンコード結果・変換後バイト数・変換文字をSL内スクリプトにてinteger(整数)キャスト(変換)した結果なのじゃ。
チャットより取り出した最後2文字のバイト数は日本語4バイト、英語は2バイト故、これにて判別できぬかと勘考致したが2文字を代入致した変数のバイト数を取得する関数が見当たらなんだ。
SL内で整数にキャストした結果は、英語では使えそうじゃが日本語では全て0になっており判別不可能じゃ。
じゃが、ハタとURLエンコード変換結果を利用する法に気づき申した!
英語では数字もしくはアルファベットに変換されおるが、日本語は全て%で始まっており申す。
よって、変換文字の最初の一文字が%かどうかで判別可能であったのじゃ。
下はチャットをHUD本体(ルート)のスクリプトにてリッスン致しおる部分でござる。
listen(integer channel, string name, key id, string message){
index_msg=llGetSubString(message,-2,-1);//受信したmessageの最後2文字目を取得、-1は最後の文字
urlenco=llEscapeURL(index_msg);//日本語入力されたチャットのインデクスをURLエンコードして扱えるように
urlenco_1=llGetSubString(urlenco,0,0);//URLエンコード結果1文字目を取得
if(urlenco_1!="%"){
english_or_not=1;//英語フラグ設定
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);//アニメパーミッション発動
}else if(urlenco_1=="%"){
english_or_not=0;//日本語フラグ設定
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);//アニメパーミッション発動してイベント内で分岐
}
}
オーナー殿のチャットはlistenイベント引数のstring messageに入っておるが、始めに表情アニメを指定致すチャット最後の2文字を
index_msg=llGetSubString(message,-2,-1);にて取り出しindex_msgに代入しており申す。
それをURLエンコード致した結果をurlencoに代入致し、最初の1文字目をurlenco_1に入れ申した。
次のif文にてurlenco_1が%かどうかの判定にて英語もしくは日本語フラグを設定しておるのじゃ。
最後に表情アニメのためにパーミッションを発動いたし居るが、表情アニメを実行致す段ではフラグにより日本語と英語を大きく分岐致す寸法。
例の如くルナ殿に見て戴いた処、チャットに数字が入るのはどうかしら?絵文字は使えないの??
と指摘があり申したが、絵文字までの対応は致しかね、代わりに数字を望まぬオーナー殿が代わりの2文字を指定致せるようカスタマイズ詳細説明ノートカードを添付致すことにし申した。
既に各店には記事画像の販売用ポスターを設置致しおるが、このポスターはアニメ致す19の表情とデフォルトを併せ20の表情が順次常時されるアニメポスターでござる。
中々に面白ろきゆえ、このポスターに19表情チェンジHUDとノートカードが入った状態にて購入致せるよう設定しており申す。
是非ご覧あれ。
2007年12月11日
眼球(テクスチャ)の異状表示対策が判り申した!!
テクスチャ表示異状で目がグレーな拙者
懸案の19表情チェンジHUDの日本語と英語チャットによる表情アニメインデクス指定への同時対応に成功致し、いよいよ販売ポスター用の画像撮影を致そうとインした処、画像の如く目が変になっておった。
これではポスター用撮影が叶わんと対策検索に突入。
確か以前記事を読んだ記憶があったものの見つからず、已む無くクライアントメニューに其れらしきはないかと試し探索致したのじゃ。
これにより、デバッグメニュー(Ctrl+Alt+Dでメニュー項目出現)で表示されるClietメニューからCharacter~Rebake Textures(Ctr-Alt-R)で正常に表示され申したよ。
以前、やはりサーバー異状?で手や服装に黒帯の現れしことがあり申したが、この対策はテクスチャ全般の焼き直しを致すもののようにて、テクスチャ表示異状全般に有効やも知れん。
販売用ポスターは19の表情をアニメ致す仕様の心づもり。
次回より日英チャット両対応スクリプト共々報告するでござる。
2007年12月08日
表情チェンジャーHUDスクリプトでの日本語使用
製作中のRuna & Rinブランド記念19表情チェンジHUD
日本語の扱いとURLエンコード結果の大文字化
Runa &Rinブランドロゴが決定致し、何ぞ記念の商品が欲しいぞよとビルトインで19ある表情をボタンクリックで表情アニメさせるHUDを制作致したら、日本語でのチャット入力時に表情アニメさせる機能が欲しくなり申した。
チャット文字に合わせて口パクさせるのは現状ではチト難しい故、チャット入力の最後部2文字に00~18の19表情対応指定用文字を入力致す方式を考え申した。
”あ、それいいね。05”、”なに言ってるの?16”のようにチャットの最後に、各HUDボタンに名前と共に表示されおる数字を入力致せば対応するボタンの表情アニメがなされる寸法。
これならセリフ毎に自由に表情を割り当てることが可能じゃし、セリフがなくとも”17”、”05”、”11”等と表情アニメだけ行うも自由。
これを実現すべく、リッスン致したチャットの最後の2文字を取り出してアニメーションパーミッションを発動致す部分が下のスクリプト
listen(integer channel, string name, key id, string message){
index_msg=llGetSubString(message,-2,-1);
//受信したmessageの最後2文字目を取得、-1は最後の文字
urlenco=llEscapeURL(index_msg);
//日本語入力されたチャットのインデクス(2文字数字)をURLエンコードして扱えるように
//llOwnerSay(urlenco);//check
llStopAnimation(hyoujou_name);//現在表情アニメをまずストップ
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);
//アニメパーミッション発動
}
スクリプト内では日本語を直接扱えない故、取り出したチャット最後2文字を代入致したindex_msgをllEscapeURL(index_msg)にてURLエンコーディング致してurlenco(string型)に代入しており申す。
URLエンコーデングはMakapuで紹介されおるこのHPで行い申した。
変換入力欄下の文字コードではプルダウンメニューよりUTF-8を選んでくだされ。
例えば02をURLエンコード致すと%ef%bc%90%ef%bc%92の文字列が返るのじゃ。
つまりurlencoが%ef%bc%90%ef%bc%92なら02のことじゃから、
if(urlenco=="%ef%bc%90%ef%bc%92")のように判定致して02時の処理を実行させることが出来申す。
斯様の発想でパーミッション取得時に発されるイベントにて各表情アニメーションを実行いたすスクリプト部が下の通り
run_time_permissions(integer perm) {
if (perm & PERMISSION_TRIGGER_ANIMATION){
if(urlenco=="%ef%bc%90%ef%bc%90"){//右側は00のURLエンコーディング結果
hyoujou_index=0;//表情リストインデクスの0を指定
hyoujou_name=llList2String(hyoujou, hyoujou_index);//1番目の選択表情アニメ名セット
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name); //表情アニメーションスタート
}else if(urlenco=="%ef%bc%90%ef%bc%91"){
hyoujou_index=1;
hyoujou_name=llList2String(hyoujou, hyoujou_index);
//llOwnerSay(hyoujou_name);//check
llStartAnimation(hyoujou_name);
・・・・・・・・・・・・・
以下18まで続く
日本語でのチャット入力最後の2文字を判定致して表情アニメ致す外は先に制作致したボタンのみのHUDと同じ処理ゆえ問題なく動くはず・・・・・・
が、動かない!!・・・・・?????
スクリプトをじっくり見返すも不審な点は見当たり申さぬが何故・・・・!!??
ともかく確認じゃと上例ではコメントアウトしおる
llOwnerSay(urlenco);//check
llOwnerSay(hyoujou_name);//check
の二つをスクリプト挿入致したところ、一番目のurlencoの数字は思惑通りチャット欄に現れたが2番目のチャットは出てこなんだのじゃ。
表情リストより実行される表情アニメ名が選択されておらん・・・・
???????????
念のため、if(urlenco=="%ef%bc%90%ef%bc%90")でのurlencoをチャットでチェックとif文内に
llOwnerSay(urlenco);//check
を追加致したら %EB%BC%90%EF%BC%90 とチャットされたのじゃ。
アルファベットが大文字になりおるが原因かと
if(urlenco=="%EF%BC%90%EF%BC%90")
のように修正致したら見事表情アニメが実行され申した!!
これにて日本語チャット入力に表情アニメ機能を付加致せて目出度し目出度し!!
じゃが、拙者の脳裏をふとある思いが掠め申した。
英語でのチャット入力にも対応できればいいな・・・・
日本語と英語同時対応ならなお更いい・・・な・・・
これで次なる奮闘に突入!!・・・
現在取り組み中ゆえ解決次第報告するでござるよ。
2007年12月04日
目的別ブログ記事リンク一覧でござるよ
ブログにてSLノウハウを様々に記しおり申すが、拙者の記事内容はどうもタイトルから判別しにくく、尚且つ様々な情報が同時記載されることも多くインデクスでの分類に収まりきらぬ故、目的の情報を後から探すのが困難でノウハウの書き捨てになっておると感じており申す。
それではもったいなく、目的別ブログ記事リンク一覧を設け個々のノウハウ等を見出し易く致したのでご利用下され。
記事写真の右側が目的別ブログ記事一覧じゃが、左側のサイトマップ一覧に掲載されおる記事は含まれておらんので全体から探して下され。
ノウハウ探索が主眼で読み物的なブログ記事は概ねリンクされておらんでござるよ。
目的別ブログ記事リンク一覧へ
それではもったいなく、目的別ブログ記事リンク一覧を設け個々のノウハウ等を見出し易く致したのでご利用下され。
記事写真の右側が目的別ブログ記事一覧じゃが、左側のサイトマップ一覧に掲載されおる記事は含まれておらんので全体から探して下され。
ノウハウ探索が主眼で読み物的なブログ記事は概ねリンクされておらんでござるよ。
目的別ブログ記事リンク一覧へ
2007年12月04日
Runa & Rin ロゴ決定にてテレポート&回転ロゴ設置

ようようが誠に多ござるが、Runa & Rinのブランドロゴが決まったのじゃ。
記事画像がそれでござるが、ルナ殿のOKもさることながら普段は厳しい妻の評価も良しとのことにて上々の出来かと喜んでおる次第。
このロゴにはルナ殿と拙者の信頼・協調により成果の実る祈念を込めて居り申す。
3店各ショップに設置致したが、kihijoji店はスペースとプリム数制限の都合で静止ロゴのみ、Animation Free Space店は回転ロゴ、SONIC MART店では両方を設置いたしてござる。
kichijoji店とAnimation Free Space店のロゴにタッチ致せばSONICMART店へのテレポートマップが現れるでござるよ。
しかし、SONICMART SIMではSIMへのテレポートポイントが設定されおるらしく、店前にテレポート設定致しおるが少し離れた場所にテレポート致すのじゃ。
見渡せば赤い光柱が見えようゆえ、それをば目印に飛んで来て下され。
上空より拙者の瞬きカンバンと上のロゴが見えるはずじゃ。
参考までにTeleport & Rotation Rogo スクリプトを掲載するでござるよ。
//Teleport & Rotation Rogo アニメーションランド用
string sim_name="sonicmart";
vector axis = <0.0, 0.0, 1.0>;
vector pos = <197,117,29>;
float spinrate = 0.2;
float gain = 1.0;
default {
state_entry(){
llSetText("Let's touch and go to\nSONIMART SHOP!!",<0, 1, 0>, 1 );
llTargetOmega(axis, spinrate, gain);
}
touch_start(integer total_number){
llMapDestination(sim_name, pos,ZERO_VECTOR);
}
}
2007年12月02日
ビデオスクリーンお持ち帰り&自曲ストリーム設置報告
0L$購入致せるSONICMART SHOPのビデオスクリーン(画像は忍法雲隠れ映像)
さて、前回はビデオ放映の報告を致し申したが、その後SONICMART SHOPにて拙者作曲・編曲の「永遠(とわ)に」BGMバージョンを設定致したので報告するでござるよ。
BGMバージョンとはヴォーカルがないのであるが、実はこの曲には歌詞も付いておるのじゃ。
宅録にてボーカル収録致したが、自作にも関らず拙者にはチト高音域な曲で、無理な発声に高音が苦しいのみならず音程まであおりをくろうて公開するに足踏み致して急遽メロディをソフト音源に差し替えたのじゃ・・・(汗)
少年時代より井上 陽水が好きで歌っておったが、拙者の高音域は限界超えでさぞかし聞き苦しかったろうと推察致す次第。
それでも未だに高音域への憧れと野望を抱き居るが、近頃ひょんなことから発声の改善が見えてきたのでござる。
それというのも、拙者が無理して歌うのを見た妻より「不細工な顔で歌うは後法度、聴くのみならず見るも心苦しきゆえ美しい顔で歌うべし」と戒めを受けたのが始まり。
絶叫しかめ面をば優しき笑顔に変じよとの天啓、頬と人中の筋肉をば左様に意識致して歌えば何と!高音域発声の改善が見られ、いや聞こえたのじゃ。
どうやら笑顔が声帯の開き具合に影響するらしく、詰まって出なかった高音が出やすくなったのじゃ。
これは嬉き発見!!
只今、日々修練中にて拙者のボーカルお披露目も近かるべし!?
まずは、公開中のBGMを是非お聞き下され。
ビデオ同様、自宅MacMIniを発信元サーバーに致しての設定。
SL側では、SLクライアントの世界メニュー~土地情報をクリック致せば土地情報パネルが現れ申す。
そのメディアタブ中ほどの「ミュージックURL:」下のURL設定欄に
http://○.○.○.○/~kanten/Towani.mp3(MacMiniはグローバルIPアドレス故、○4つにて隠しおり申す。~kantenはホームルートフォルダ直下にkantenフォルダがあり、その中にTowani.mp3ファイルがあることを示しおるのじゃ。)
とMacMini内のTowani.mp3のURLを設定致して完了。
これによりて、ショップに入れば音楽用プレイコントロールがクライアント右下に現れる寸法。
記事写真ではスクリーン上にビデオコントロール画像を示して説明しておるが、クライアント右下にビデオ用と並び音楽用コントロールが♪♩と共に表示されおるゆえすぐに判るじゃろう。
自動再生ではなく、両者共に利用者のプレイボタンクリックによりスタート致すのじゃ。
SONICMART SHOPに設置致しおる記事画像のビデオスクリーンじゃが、0L&購入致せるでござるよ。
モデファイ・コピー・転売OKじゃから、お持ち帰り頂きビデオ放映スクリプトの参考に致し下され。
歌詞を記載しておくでござるよ。
永遠(とわ)に 作詞 rinsui Hax
1・いつの間か廃(すた)れだした この身体
漲(みなぎ)る 時は過ぎて・・・
疲れの纏(まとい)もなく
やがて朽ちるのを
思わずに 居られた
なのにもう 今はこの身を襲う
避けることさえ出来ぬ
この世の定め?
2・朽ちてゆく身体 定め晒(さら)しても
精神(こころ)は 時を超える
刻んだ思いの魂(たま)
やがて離れても
消え去らず 持ちゆく
*だからもう 迷い陥りはせず
永遠(とわ)の生命(いのち)を想い
この世を生きる
*繰り返し
永遠(とわ)の生命(いのち)を想い
この世を生きる
永遠(とわ)の生命(いのち)を想い
この世を生きる


