ソラマメブログ
HUDCampTimerMessageBoard WittyRadar

2008年04月30日

2008年04月30日

Witty Radar マニュアル


文章で書くと長くなってしまいました・・・
なんというかSLって記憶力がないと厳しい。
何が何やら訳が分からなくなりがちです。


A HUD gadget for exploring about Second Life.
セカンドライフを探検するためのHUDガジェット
=======================================================
Witty Radar1.0 マニュアル 2008.4.29
=======================================================
[==概 要==]
*レーダー、カメラ、アバタの自動移動を組み合わせたHUDガジェットです。
テレポート履歴機能もあります。
*主にボタンをタッチすることで操作できますが、ダイアログ操作とチャットからのコマンド入力もあります。


[==各エディションによる違い==]
*WittyRadar1.0H20 (20時間制限版)
----20時間時間使用可能
----transfer
----全機能利用可
----ノートカードの編集不可


*WittyRadar1.0 (通常版)
----時間制限なし
----modify copy
----全機能利用可



[==レーダー機能==]
*検知対象をワンタッチでアバタかオブジェクトに切り替えることができます(AvatarとObjectボタン)。
*最大16件の検知結果がフローティングテキストで表示されます(フローティングテキスト長の制限のため長い名前は省略されます)。
*フローティングテキストに距離、方位、高度差が表示されます。「15↓」は15メートル下という意味です。
*小さい円いカラーボタンをタッチして色の変更ができます(デフォルトは白)。背景色でフローティングテキストが見にくい場合などに便利です。
*アラーム(サーチ)機能
アラームリストに登録したアバタやオブジェクトの名前でサーチできます。発見するとアラーム(口笛)が鳴りチャットまたはダイアログで位置を通知します。デフォルトは部分的で大文字と小文字を区別しないマッチングパターンです。
*探索半径を20, 48, 96mに変更できます(Dialog>Range>20 or 48 or 96)。
*高度をあわせて矢印の方向に進めば、ターゲットに到着できます。


[==カメラ機能==]
*カメラ機能のボタンは黄色で機能中は明るくなります。中止するときは明るくなったボタンをもう一度タッチしてください。
*ブラウズ(Browse)
全ての検知結果をカメラを移動して順に見ることができます。
*フォーカス(Focus)
ターゲットを写し続ける追尾カメラです。
アバタの場合は正面、オブジェクトの場合は少し上からフォーカスします。
オブジェクトの場合は、自分のアバタを左右の方向キーで回転させるとカメラもそれに合わせて回転します。
*カメラツアー(CamTour)
Dialogボタン > dialog> CamTour
ノートカード(CameraTour)から読み込んだ座標順にカメラを移動していきます。
----(1)ScanHigh, ScanLow:simを上空からくまなく見て回ります。
----(2)FromCorner:simの四隅から中央に向けてフォーカスします。
etc...
開始するとCamTourというボタンがBrowseボタンの左に現れます。途中でやめるときはCamTourをタッチしてください。
*【メモ】カメラ機能で画面が変化しないときやカメラが元に戻らないときは、[ESC]を何度か押してカメラをリセットしてください。Alt-Zoom中はスクリプトでカメラ制御ができないからです。


[==オーバーヘッドカム(OHcam)機能==]
Dialogボタン > dialog> OHcam
*通常使うカメラをオーバーヘッドカム(上から見下ろすカメラ)にします。
【メモ】一時的なものではないので、Dialogからoffにしないと元に戻りません。


[==マップ(Map)表示機能==]
*ターゲットの位置をマップに表示します。大きな赤いマークも表示されるので便利です。


[==アプローチ(Approach)機能==]
*ターゲットの位置に向けてアバタを移動できます。テレポートではなくアバタを押して移動させます。
【メモ】飛行した方がスムーズで素早い移動ができます。
【メモ】高度差がある場合は飛行状態でないと、アバタが飛べないので到達できません。
*Approachボタンをタッチすると開始され、ボタンが明るくなります。止める場合はもう一度Approachをタッチしてください。
*アプローチ中は「ピィ」という音が5秒おきになります。
*ターゲット位置に直線的に進みます。
*衝突を防ぐためターゲット以外の近くのアバタを避けようとします。
*障害物が近くにあると速度を落としますが避けようとはしません。
*アプローチまたはオートパイロットであっても、方向キーである程度アバターを移動できますので障害物があったら手動で避けてください。


[==オートパイロット(AutoPilot)機能==]
Dialogボタン > dialog> AutoPilot
*ノートカード(AutoPilot)から読み込んだ航路座標を順に巡っていきます。
*何も障害物のない上空100メートルぐらいに移動してから開始してください。
----(1)FlyOverSim 上空約90メートルで、sim全体をくまなく巡航します。オートパイロット中はカメラが上から見下ろすようになるので、上空から眺めることができます。
----(2)CrossSim sim上空を斜めに横断します。
----(3)Dive sim上空500mからダイブします。
*オートパイロット中も「ピィ」という音が5秒おきになります。
*オートパイロット中も、Approachボタンが明るく表示されるので、止める場合はもう一度Approachをタッチしてください。
*他のフライトアシスト(サポート)と同時に装着するとアプローチ機能とオートパイロット機能が正常に動作しないことがあります。
THiRD-i v1.3bと同時に装着した場合は、アバタの高度を変化させることができません。
飛行設定をしたsl-ime ver1.1またはsl-ime ver1.2.1と同時に装着しても問題なく動作しました。


[==テレポートヒストリー機能==]
*テレポートの履歴を保存し、後でそこにテレポートする機能です。約90件記録までします。
*ダイアログからテレポート先を選択します。
Dialogボタン > dialog> Teleport
[AddHere]ボタンで今いる位置も記録できます。
*履歴をSLURL形式でsayできます。
Dialogボタン > dialog> SayTpHistory
sayされたSLURLをクリックしてもマップが開きます。テキストなのでコピーしていろいろ利用することもできるかと思います。ダイアログの場合、件数が多いと改頁して探すのに手間がかかるのでSLURL形式でsayしてから探す方が便利です。
*SLURL形式で記述したノートカード(TpHistory)を読み込ませて履歴として追加できます。


[==装着とログイン時==]
*装着すると既定で画面の右上に表示されます。
*装着またはログイン時には「制御入力に対応 よろしいですか?」と尋ねるダイアログが3回出てきますが、すべて「はい」をクリックして下さい。
*HUDであればどこにでも配置できますが、小さい矢印をタッチすると上下に移動し、所定の場所に移動します。


[==表示==]
*小さい下の矢印をクリックすると全体が上に移動して、上半分が隠れます。もう一度クリックすると元に戻ります。
*小さい下の矢印はアバタの向いている方向を示します。上が北です。


[==ターゲット欄==]
*上部にターゲット欄があります。
始めは透明になっていますがターゲットを指定すると方向を示す大きい矢印が表示されます。
その上にターゲットの名前、距離、高度差、座標、方向がフローティングテキストで表示されます。
また、大きい矢印の右に
----フォーカス(Focus)
----マップ(Map)
----アプローチ(Approach)
のボタンも表示されます。
*矢印が真上のときは正面にターゲットがあります。
*矢印が明るい黄色の場合はレーダーがターゲットを捕捉中で、暗い場合は見失っています。見失っていても座標は残っていますので上記3つのボタンは有効です(ターゲットはもうそこにいないかもしれませんが)。
*ターゲットの指定方法
----1)フローティングテキストの左端にある1),2),3)…と同じ番号ボタンをタッチする。
----2)チャットコマンドで座標を入力する。(例 /33 pos=128,130,50)
----3)アラーム機能が発見したときダイアログでYesをクリックする(アラームリストを登録し、alarm=on, dialog=onにしておく必要があります)。
*ターゲットのクリア方法
----「C」ボタンをクリックするとクリアされ透明に戻ります。


[==スクリプト禁止エリアでも稼動==]
*スクリプト禁止エリアでも稼動します。
*装着、ログイン、リセットでスクリプト禁止エリアにいる場合は、スクリプトの起動ができません。
*スクリプト禁止エリアでの稼動は、今後のSLのバージョンでも可能かどうかわかりません。


[==フライトアシスト機能==]
*飛行を安定させて制限を超えた高度に移動できます。装着すると自動的に開始します。


[==ノートカードの修正と読み込み==]
*カメラツアー(CameraTour)、オートパイロット(AutoPilot)、テレポート履歴(TpHistory)のノートカードを編集して読み込ませればカスタマイズできます。
【メモ】時間制限版はモディファイ不可なのでノートカードの編集はできません。


[==アラームの設定==]
(1)Dialogボタン > ダイアログ > ChatComで、チャットチャンネルを開きます。
(2)アラームリストに追加する。
チャットから
 /33 addlist=名前
と入力します。
(3)アラームをonにする。
「/33 alarm=on」と入力するかDialogを開いてalarm=onをクリックします。


[==カメラと描画距離(ビューアの設定でより遠くまで見れるようにする)==]
*カメラの移動制限の解除
デフォルトではカメラの移動に制限がかかっていて、アバタから50メートルぐらいまでしか移動できません。
----(1)[Ctrl+Alt+D]でデバッグモードにする。
----(2)Advancedメニューから、Disable Camera Constraints」のチェックをする。
と遠くまでカメラを移動できるようになります。
*描画距離を広げる
カメラが移動できても、描画距離を超えるとオブジェクトやアバタは表示されず地形だけが表示されます。
----「編集>環境設定>表示(タブ)>カスタム(チェックする)をしてから、描画距離のスライダーで変更します。
*PCのスペックなどにより、これらの設定をするとビューアが重くなることがあります。


[******* 異常時の対処方法 *******]
*使用時の異常
----(1)カメラが元に戻らない。
----(2)アバタが暴走する。
----(3)アバタが特定の場所に押されて行こうとする。
----(4)HUDの動作不良(ボタン表示がおかしい場合など)。
*対処法
以下のどちらかを行ってください。
----(1)はずして装着しなおす。]
----(2)スクリプト可の場所でダイアログを開いてリセットする。


[==注意事項==]
*simにラグがあったり、異常あると正常に動作しない場合があります。
*テクスチャ読み込み中には、フローティングテキストの表示が数分変わらないことがあります。
*アプローチ機能とオートパイロット機能は、他のフライトサポータ(アシスト)と同時に装着するとうまく動作しないことがあります。
*一時的にフロートテキストが重なることがあります。
*容姿の変更やオブジェクト編集後もAlt-Zoomになっていることがあります。Alt-Zoom中はスクリプトでカメラをコントロールできません。カメラ機能を使うときは[ESC]を押してカメラをリセットしてください。
*スクリプトが検知するアバタの向いている方向は、アバタの自動移動・sit・容姿の変更・アニメーション、自動移動中は見た目と異なりますので、矢印の方向が違う方向を示します。
*テレポートや移動で他のsimへ入ったときはアプローチ機能、オートパイロット機能、カメラ機能は停止します。座標がsim内でしか有効でないからです。
*ログイン直後、テレポート直後には音が鳴らない場合があります。
*ビューア起動後に画面をリサイズするとHUDの位置がおかしくなることがあります。
*simの状況、ビューアの違いでアプローチ機能とオートパイロット機能が正常に動作しない場合があります。simのシステムやビューアはよく変更され、物理関係スクリプトの動作が変わることがあるからです。


[==チャットコマンド一覧==]
Dialogボタン ---> ダイアログのChatCom でチャットチャンネルを開いてから入力します。
入力がないと30秒で閉じてしまいます。

既定値は、「alarm=off, dialog=on, strict=off」です。

----アラームの状態とコマンドの使用法を表示。
/33 help : to display alarm status and usage of commands.
----アラームリストにアバタかオブジェクトの名前を追加する。
/33 addlist=name : Add a name(avatar or object) to alarm list.
----アラームリストからアバタかオブジェクトの名前を削除する。
/33 dellist=name : Delete a name(avatar or object) from alarm list.
----アラームリストをsayする。
/33 saylist : Say alarm list.
----アラームリストをクリアする。
/33 clearlist : Clear alarm list.
----アラームをonにする。
/33 alarm=on : Turn on alarm.
----アラームをoffにする。
/33 alarm=off : Turn off alarm.
----アラーム時にダイアログを表示する。
/33 dialog=on : Show dialog when alarm.
----アラーム時にダイアログを表示しない。
/33 dialog=off : Not show dialog when alarm.
----厳密な名前のマッチング…まったく同じ文字列で大文字と小文字を区別してマッチング。
/33 strict=on : entire case-sensitive matching for alarm.
----曖昧な名前のマッチング…名前に入力した文字が含まればマッチし、大文字と小文字を区別しない。
/33 strict=off : partial not case-sensitive matching for alarm.
----simの座標を入力し、位置をターゲットにする。
/33 pos=x,y,z : Input a target in position. x,y,z is a coordinate of sim region.


どうもありがとうございました。
このガジェットで楽しんでいただければうれしいです。

TANAKAAKO Inshan.
=======================================================
The Endless Firmament, it is paradise left for we vagabonds.
果てしない大空は我らバカボン(ド)に残された楽園
=======================================================  
Posted by 田中明夫 at 16:57Comments(0)TrackBack(0)Witty Radar

2008年04月22日

リンク番号と名前を調べるスクリプト

 20個ぐらいまでならなんとかリンク番号が狂わないように編集できますが、
いっぱいになってくるとそれもなかなか大変です。

 リンクオブジェクトの場合は、0番はないのでNULL_KEYが帰ってくるようです。
(0 means no link, 1 the root/parent, 2 for first child)

1番から始まるので、
終了判定を
 i < llGetNumberOfPrims() 
とせずに
 i <= llGetNumberOfPrims()
としないとだめなようです。


//CheckLinkName.lsl
default {
state_entry() {
integer i;
for (i=0; i<=llGetNumberOfPrims() ;i++) {
llOwnerSay((string)i+ ") " + llGetLinkName(i));
}
}
}


例)
[6:48] Object: 0) 00000000-0000-0000-0000-000000000000
[6:48] Object: 1) WittyRadarM24
[6:48] Object: 2) Map
[6:48] Object: 3) Approach
[6:48] Object: 4) TargetNameDisplay05  
Posted by 田中明夫 at 23:08Comments(0)TrackBack(0)簡単スクリプト

2008年04月22日

Terra Magic Carpet

 空をウロウロしていると、イカニモって感じだったので乗ってみました。
キーボードで操作するんですが、座るとカメラがアバタの真後になるんです。
 それでは地面に座ってるのと変わらなくて面白くなかったので、
自分のHUDで動かして見たところチャント動きました。
それでカメラが自由に動かせたからそれらしい雰囲気になったかな。


  
Posted by 田中明夫 at 21:54Comments(0)TrackBack(0)その他

2008年04月20日

How to search avatar or object

How to search avatars or objects by name.
In this instance, search an object named [MnM] Cat sofa "Big Daddy" dark fur
type.

アバタかオブジェクトを名前で探す方法。
この例はオブジェクトを名前で探しています。



  
Posted by 田中明夫 at 20:57Comments(0)TrackBack(0)Witty Radar

2008年04月20日

この白い点は何?

Second Life 1.19.1 (4) Apr 2 2008 11:59:37 (Second Life Release)
Second Life Server 1.20.1.85162
Graphics Card: GeForce 8800 GT/PCI/SSE2

  
Posted by 田中明夫 at 11:57Comments(3)TrackBack(0)その他

2008年04月20日

Set target,Focus,Map,Approach

How to set a target, Focus, Map, Approach with a Witty Radar.
Combination of a radar, camera contro,l map, and automated cruise in Second Life.

Witty Radarのデモ。ターゲットの指定、フォーカス、マップ、アプローチ。




  
Posted by 田中明夫 at 08:33Comments(0)TrackBack(0)Witty Radar

2008年04月11日

カメラについて11 AutoPilotのアバタをAltズーム

 止まっているときは自分のアバタをAltズームで見れますが、
移動の操作をすると解除されてしまいます。
 AutoPilot中で移動の操作をしてないので、
移動中の自分のアバタをAltズームでいろんな角度から撮影できました。

 もっと綺麗な画像で見たいから、新しいPCが欲しくなってきました。









YouTube

   
Posted by 田中明夫 at 20:32Comments(0)TrackBack(0)カメラについて

2008年04月07日

カメラについて10 レーダーが検知したオブジェクトをブラウズ

 レーダーが検知したオブジェクトを順に見ていってます。
センサーで座標がわかるんですから、カメラを移動してみました。

 レーダーが一度に検知するのは16件までなので、
とてもお店の商品を全部みれませんが、
意外な視野で見れるので、面白かったりします。

 気になると所があれば、途中でAltズームすればそこをじっくり見れます。




YouTube版
  
Posted by 田中明夫 at 19:34Comments(0)TrackBack(0)カメラについて

2008年04月07日

カメラについて9 カメラツアースクリプト

2008.4.15 すいません。訂正しました。
llSitTarget(<0,0,0.1>,ZERO_ROTATION);
をオブジェクトで一度は実行しないといけないので、
state_entry()に追加しました。

 このスクリプトでsimを一巡して見れます。
ただ、simの土地が高いと地面とか地中になってしまいます。

 このスクリプトをオブジェクトに入れて、装着するかSitしてタッチするとカメラツアーが始まります。
オブジェクトを編集した後は、[ESC]を押してカメラをリセットしないとタッチしても画面は変わりません。
遠くを見るので、ビューアの設定も変えておく必要があります。
簡単にしたため途中でとめるには立つかはずすしかありません。

 カスタマイズすれば、お気に入りの場所とか、
お客さんが座るだけで商品とか魅力的な場所を順に見れるようにするとかに使えるかもしれません。

focus_positionsは、フォーカスの座標リストです。
camera_offsetsは、フォーカスからカメラをどれだけ離すかです。
カスタマイズは、この2つのベクトルを変えればいいわけです。
timer_intは、表示時間です。

 run_time_permissions(integer perm) の後に、いきなりllClearCameraParams()でクリアしてるのは、前回座った人が途中で立ったとき、カメラの設定が残ってしまうためです。
クリアしないと次の人が座るといきなり遠くの場所が表示されてとまったままで、オブジェクトをタッチできませんw

 しかし、この場合のパーミッションって誰に得てるんでしょうかね?
座ったり装着したらダイアログも出なくてユーザの承諾なしに勝手にパーミッションをスクリプトが得てしまいますから、意味がなくスクリプトがややこしくなるだけと思うんですが。


 今回は、色付けツールでうまく変換できました。


//CamTour.lsl.lsl

//positions of fixed_cam in sim coordinates.
list focus_positions = [ <40,129,45>, <40,172,45>, <40,215,45>, <40,255,45>, <86,255,45>
, <86,215,45>, <86,172,45>, <86,129,45>, <86,86,45>, <86,43,45>
, <129,43,45>, <129,86,45>, <129,129,45>, <129,172,45>, <129,215,45>
, <129,255,45>, <172,255,45>, <172,215,45>, <172,172,45>, <172,129,45>
, <172,86,45>, <172,43,45>, <215,43,45>, <215,86,45>, <215,129,45>
, <215,172,45>,<215,215,45>,<215,255,45>,<255,255,45>,<255,215,45>
, <255,172,45>,<255,129,45>,<255,86,45>,<255,43,45>];
//camera offsets relative to focus_positions.
list camera_offsets = [ <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>
, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>
, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>
, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>
, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>
, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>
, <5,5,2>, <5,5,2>, <5,5,2>, <5,5,2>];

float timer_int = 3;

integer loop;

key target;

fixed_cam( ) {
llOwnerSay("loop=" + (string)loop);
vector fixed_focus_position = llList2Vector(focus_positions, loop);
vector fixed_camera_position = fixed_focus_position + llList2Vector(camera_offsets, loop);

//~ default_cam();
//llClearCameraParams(); // reset camera to default
llSetCameraParams([
CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
//CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees
//CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds
//CAMERA_DISTANCE, 0.0, // ( 0.5 to 10) meters
CAMERA_FOCUS, fixed_focus_position, // region relative position
//CAMERA_FOCUS_LAG, 0.0 , // (0 to 3) seconds
CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)
//CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
//CAMERA_PITCH, 80.0, // (-45 to 80) degrees
CAMERA_POSITION, fixed_camera_position, // region relative position
//CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds
CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)
//CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
CAMERA_FOCUS_OFFSET, ZERO_VECTOR // <-10,-10,-10> to <10,10,10> meters
]);
}

default {
state_entry() {
llSitTarget(<0,0,0.1>,ZERO_ROTATION); //2008.4.15 added
if (llGetAttached()) {
llRequestPermissions(llGetOwner(), PERMISSION_CONTROL_CAMERA);
llSleep(1);
}
llOwnerSay("llGetListLength(focus_positions)=" + (string)llGetListLength(focus_positions) );
llOwnerSay("llGetListLength(camera_offsets)=" + (string)llGetListLength(camera_offsets) );
}

touch_start(integer total_number) {
integer perm = llGetPermissions();
if ( target != llDetectedKey(0)) {
llSay(0, llKey2Name(llDetectedKey(0)) + " must attach or sit on me.");
return;
}
if (perm & PERMISSION_CONTROL_CAMERA) {
loop = 0;
fixed_cam();
llSetTimerEvent(timer_int);
} else {
string s = "*** " + llGetScriptName() + " has \"NOT\" PERMISSION_CONTROL_CAMERA perms for "
+ (string)llGetPermissionsKey() + " ***";
llOwnerSay(s);
}
}

run_time_permissions(integer perm) {
if ((perm & PERMISSION_CONTROL_CAMERA) == PERMISSION_CONTROL_CAMERA) {
llClearCameraParams();
llOwnerSay("Camera permissions have been taken");
}
}

changed(integer change) {
if (change & CHANGED_LINK) {
target = llAvatarOnSitTarget();
if (target) {
llRequestPermissions(target, PERMISSION_CONTROL_CAMERA);
} else {
llSetTimerEvent(0);
}
}
}

attach(key agent) {
target = agent;
if (target!= NULL_KEY) {
llRequestPermissions(target, PERMISSION_CONTROL_CAMERA);
} else {
llSetTimerEvent(0);
}
}

timer() {
loop++;
if ( loop < llGetListLength(focus_positions) ) {
fixed_cam();
} else {
llSetTimerEvent(0);
llClearCameraParams();
}
}

}
  
Posted by 田中明夫 at 02:33Comments(0)TrackBack(0)カメラについて

2008年04月06日

JOB CENTER

 JOB CENTERとあったので、ちょっとどんな物かちょっとのぞいて見た。
日本にもこんなのあったかな。こういうのがあるといいのかもしれなとも思った。


 しかし、求人ボードはほとんど空いている。
人も全然いなくて、128X128のテクスチャを貼りノートカードを配る仕組みで1日ならL$15か。
ウム。


埋まっている左側の方は友好的な人を探してるというだけで、意味がよくわかならい。
右側は・・・ダンサーの募集か? ノートカードを見てみる。

I've had people misunderstanding this before, so here goes: As a dancer at Sweet's Beach, you're a stripper.
「以前に誤解してきた人たちがいた。Sweet's Beachでは、ダンサーはストリッパーです」
ウム。
誤解というか、ストリッパー募集と書かないのがよくないような気がしないでもない。

募集要項は・・・
What we are looking for:
~ A minimum experience of 1 month in SL(more is a definite plus)
~ A good quality skin and shape
~ Previous dancing experience is not a requirement but would be preferred
~ Ability to emote well as well as friendliness and a great sense of humor are a must! You also need a good grasp of the english languag

いいスキンとシェイプ・1月のSL経験・ダンスはやったことはなくてもいいがあればなお良し。
感情表現が豊かでフレンドシップと優れたユーモアが必要。英語の理解力も必要。

しかし、右のも左のも全然給料のことは書いていない。
  
Posted by 田中明夫 at 22:42Comments(0)TrackBack(0)その他

2008年04月06日

カメラについて8 カメラのスクリプトモード中にAltズーム

 オートパイロット中は、スクリプトでオーバーヘッドカム(上から見下ろすカメラ)にしています。
なので、カメラはスクリプトモードです。

 途中で、広場の真ん中が気になったので、そこを[Alt+左クリック]でズームしました。
カメラはそこで止まりますが、アバタはオートパイロット中なので画面から消えてしまいます。

 その後、[ESC]キーを押してスクリプトモードに戻ったので、またアバタが表示されました。

  
Posted by 田中明夫 at 21:13Comments(0)TrackBack(0)カメラについて

2008年04月06日

カメラについて7 カメラモード

カメラモードの大雑把な図です。


ノーマルモード:リセットされた通常の状態。
スクリプトモード:スクリプトがコントロールしている状態。
Altズーム:オブジェクト、アバタ、地面または空間に固定している状態。
マウスルックは、画面左上に文字も表示されすぐわかりますので省いています。

1)スクリプトはAltズームを奪えない
 ノーマルモードなのかAltズームなのかは、画面に表示されないので分かりにくいです。
問題なのは、スクリプトがカメラコントロールしようとしてもAltズーム中は画面が変わらないということです。
[ESC]を押してAltズームを終了させないとスクリプトはカメラをコントロールできません。
ときには、[ESC]を数回押さないと駄目なときもあります。
オブジェクトを編集した後も同様です。

2)スクリプトモードからでもAltズームにできる
スクリプトがカメラをコントロールしていても、[Alt+左クリック]でAltズームにできます。
この場合、[ESC]を押してもスクリプトモードに戻り、ノーマルモードには戻りません。

3)スクリプトに異常があるとノーマルモードに戻らない
スクリプトモードで
 ・スクリプト禁止エリアに入る
 ・スクリプトにバグがある
 ・simに異常がある
の場合にはスクリプトはカメラをノーマルモードに戻すことができません。

4)カメラが変な状態のまま戻らなくなったら、オブジェクトをはずせば元に戻る
カメラがおかしくなって元に戻らない場合は、そのオブジェクトをはずせば元に戻ります。
  
Posted by 田中明夫 at 08:35Comments(0)TrackBack(0)カメラについて

2008年04月05日

カメラについて6 サンプルスクリプト

  うーん、一度公開した後に試してたら、うまく動かなくて非公開にしたんですが、
再装着しようとしたらアタッチできず。どうやらsimがおかしかったようです。
この辺りの不安定さが開発しにくいところです。

 なんかおかしいなと思ったら軽そうなsimをいくつか回ってみる。
そういう感じでしょうかね。


 フリービーで拾ったスクリプトを少し変えたものを載せます。
このコードをオブジェクトに入れて、装着するかSitすると使えます。
カメラが移動してタッチできなくなったりするので、試すにはHUDに装着するのがいいと思います。

 スクリプトをオブジェクトに入れたり修正するときはオブジェクトを編集するわけですが、
編集モード後には、[ESC]でカメラをリセットしないと表示が変わりません。
これに気づかないとけっこう悩んだりします。

 リンデンラボのスクリプトらしいのですが、カメラと全然関係のないパーミッションの表示用コードがあったり、全然使っていない関数やら変数があってややこしかったのでそれを取り除きました。
そんな感じだったので、はじめて見たときよく意味がわかりませんでした。
 
 一見ややこしそうですが、ダイアログからの指定でカメラの設定を変えるというパターンばかりです。

 Focus on Meというのは固定カメラですが、Trap ToggleをOnにすると2秒おきにFocus on Meで、アバタを追いかけるようになっているようです。

 simの座標で固定するカメラ用にFixed Cam( fixed_cam )というのを追加しました。
以下のベクトルを変えれば、simのどこでも見れるようになります。
これが、一番簡単だったりします。
(ただし、遠くを見るにはビューアの設定をかえる必要があります)。
//positions of fixed_cam in sim coordinates.
vector fixed_focus_position = <128, 128, 30>;
vector fixed_camera_position = <130, 130, 40>;

 装着してるときは、コンパイル毎にデアタッチ・アタッチをしないとパーミッションを獲得しないようになってましたが、
コードを変えていろいろ試すときに面倒なので、state_entry()にも装着しているときはパーミッションを獲得しに行くようにしてます。

 色付けツールで載せたかったのですが、ツールではうまく変換できませんでした。


//CameraControl2.lsl

//Linden Labs
//Dan Linden

//Revised by TANAKAAKIO Inshan 2008.04.05

integer CHANNEL; // dialog channel
list MENU_MAIN = ["Default", "Overhead Cam", "Spin Cam", "Trap Toggle", "Spaz Cam", "Drop Cam"
, "Worm Cam", "Side Cam", "Driving Cam", "More...", "Cam ON", "Cam OFF"]; // the main menu
list MENU_2 = ["More...","Focus on Me", "Fixed Cam", "...Back"]; // menu 2

integer on = FALSE;
integer trap = 0;

//positions of fixed_cam in sim coordinates.
vector fixed_focus_position = <128, 128, 30>;
vector fixed_camera_position = <130, 130, 40>;


take_camera_control(key agent) {
llOwnerSay("take_camera_control " + llKey2Name(agent)); // say function name for debugging
llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);
llSetCameraParams([CAMERA_ACTIVE, 1]); // 1 is active, 0 is inactive
on = TRUE;
}

release_camera_control(key agent) {
llOwnerSay("release_camera_control"); // say function name for debugging
llSetCameraParams([CAMERA_ACTIVE, 0]); // 1 is active, 0 is inactive
llReleaseCamera(agent);
on = FALSE;
}

focus_on_me() {
llOwnerSay("focus_on_me"); // say function name for debugging
// llClearCameraParams(); // reset camera to default
vector here = llGetPos();
llSetCameraParams([
CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees
CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds
CAMERA_DISTANCE, 0.0, // ( 0.5 to 10) meters
CAMERA_FOCUS, here, // region relative position
CAMERA_FOCUS_LAG, 0.0 , // (0 to 3) seconds
CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)
CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
// CAMERA_PITCH, 80.0, // (-45 to 80) degrees
CAMERA_POSITION, here + <4,4,4>, // region relative position
CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds
CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)
CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
CAMERA_FOCUS_OFFSET, ZERO_VECTOR // <-10,-10,-10> to <10,10,10> meters
]);
}

default_cam() {
// llOwnerSay("default_cam"); // say function name for debugging
llClearCameraParams(); // reset camera to default
llSetCameraParams([CAMERA_ACTIVE, 1]);
}
driving_cam() {
llOwnerSay("driving_cam"); // say function name for debugging
default_cam();
llSetCameraParams([
CAMERA_ACTIVE, 1,
CAMERA_BEHINDNESS_ANGLE, 45.0,
CAMERA_BEHINDNESS_LAG, 0.5,
CAMERA_DISTANCE, 8.0,
//CAMERA_FOCUS, <0,0,5>,
CAMERA_FOCUS_LAG, 0.05 ,
CAMERA_FOCUS_LOCKED, FALSE,
CAMERA_FOCUS_THRESHOLD, 0.0,
CAMERA_PITCH, 20.0,
//CAMERA_POSITION, <0,0,0>,
CAMERA_POSITION_LAG, 0.1,
CAMERA_POSITION_LOCKED, FALSE,
CAMERA_POSITION_THRESHOLD, 0.0,
CAMERA_FOCUS_OFFSET, <3,0,2>
]);
}

side_cam() {
llOwnerSay("side_cam");
llClearCameraParams();
llSetCameraParams([
CAMERA_ACTIVE, 1,
CAMERA_BEHINDNESS_ANGLE, 0.0,
CAMERA_BEHINDNESS_LAG, 0.0,
CAMERA_DISTANCE, 0.0,
//CAMERA_FOCUS, <0,0,5>,
CAMERA_FOCUS_LAG, 0.0 ,
//CAMERA_FOCUS_LOCKED, FALSE,
CAMERA_FOCUS_THRESHOLD, 0.0,
//CAMERA_PITCH, 80.0,
//CAMERA_POSITION, <0,0,0>,
CAMERA_POSITION_LAG, 0.0,
//CAMERA_POSITION_LOCKED, FALSE,
CAMERA_POSITION_THRESHOLD, 0.0,
CAMERA_FOCUS_OFFSET, <0,3,0>
]);
}

overhead_cam() {
llOwnerSay("overhead_cam"); // say function name for debugging
default_cam();
llSetCameraParams([
CAMERA_ACTIVE, 1,
CAMERA_BEHINDNESS_ANGLE, 180.0,
CAMERA_BEHINDNESS_LAG, 0.5,
CAMERA_DISTANCE, 10.0,
//CAMERA_FOCUS, <0,0,5>,
CAMERA_FOCUS_LAG, 0.05 ,
CAMERA_FOCUS_LOCKED, FALSE,
CAMERA_FOCUS_THRESHOLD, 0.0,
CAMERA_PITCH, 80.0,
//CAMERA_POSITION, <0,0,0>,
CAMERA_POSITION_LAG, 0.0,
CAMERA_POSITION_LOCKED, FALSE,
CAMERA_POSITION_THRESHOLD, 0.0,
CAMERA_FOCUS_OFFSET, <0,0,0>
]);
}

drop_camera_5_seconds() {
llOwnerSay("drop_camera_5_seconds"); // say function name for debugging
llSetCameraParams([
CAMERA_ACTIVE, 1,
CAMERA_BEHINDNESS_ANGLE, 0.0,
CAMERA_BEHINDNESS_LAG, 0.5,
CAMERA_DISTANCE, 3.0,
//CAMERA_FOCUS, <0,0,5>,
CAMERA_FOCUS_LAG, 2.0,
CAMERA_FOCUS_LOCKED, FALSE,
CAMERA_FOCUS_THRESHOLD, 0.0,
CAMERA_PITCH, 0.0,
//CAMERA_POSITION, <0,0,0>,
CAMERA_POSITION_LAG, 0.05,
CAMERA_POSITION_LOCKED, TRUE,
CAMERA_POSITION_THRESHOLD, 0.0,
CAMERA_FOCUS_OFFSET, <0,0,0>
]);
llSleep(5);
default_cam();
}

worm_cam() {
llOwnerSay("worm_cam"); // say function name for debugging
llSetCameraParams([
CAMERA_ACTIVE, 1,
CAMERA_BEHINDNESS_ANGLE, 180.0,
CAMERA_BEHINDNESS_LAG, 0.0,
CAMERA_DISTANCE, 8.0,
//CAMERA_FOCUS, <0,0,5>,
CAMERA_FOCUS_LAG, 0.0 ,
CAMERA_FOCUS_LOCKED, FALSE,
CAMERA_FOCUS_THRESHOLD, 4.0,
CAMERA_PITCH, -45.0,
//CAMERA_POSITION, <0,0,0>,
CAMERA_POSITION_LAG, 1.0,
CAMERA_POSITION_LOCKED, FALSE,
CAMERA_POSITION_THRESHOLD, 1.0,
CAMERA_FOCUS_OFFSET, <0,0,0>
]);
}

spaz_cam() {
llOwnerSay("spaz_cam for 5 seconds"); // say function name for debugging
float i;
for (i=0; i< 50; i+=1)
{
// llOwnerSay((string)xyz);
vector xyz2 = llGetPos() + ;
llSetCameraParams([
CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
CAMERA_BEHINDNESS_ANGLE, 180.0,
CAMERA_BEHINDNESS_LAG, llFrand(3),
CAMERA_DISTANCE, llFrand(10),
//CAMERA_FOCUS, xyz,
CAMERA_FOCUS_LAG, llFrand(3),
CAMERA_FOCUS_LOCKED, TRUE,
CAMERA_FOCUS_THRESHOLD, llFrand(4),
CAMERA_PITCH, llFrand(125) - 45,
CAMERA_POSITION, xyz2,
CAMERA_POSITION_LAG, llFrand(3),
CAMERA_POSITION_LOCKED, TRUE,
CAMERA_POSITION_THRESHOLD, llFrand(4),
CAMERA_FOCUS_OFFSET,
]);
llSleep(0.1);
}
default_cam();
}

spin_cam() {
llSetCameraParams([
CAMERA_ACTIVE, 1,
CAMERA_BEHINDNESS_ANGLE, 180.0,
CAMERA_BEHINDNESS_LAG, 0.5,
//CAMERA_DISTANCE, 10.0,
//CAMERA_FOCUS, <0,0,5>,
CAMERA_FOCUS_LAG, 0.05 ,
CAMERA_FOCUS_LOCKED, FALSE,
CAMERA_FOCUS_THRESHOLD, 0.0,
CAMERA_PITCH, 30.0,
//CAMERA_POSITION, <0,0,0>,
CAMERA_POSITION_LAG, 0.0,
CAMERA_POSITION_LOCKED, FALSE,
CAMERA_POSITION_THRESHOLD, 0.0,
CAMERA_FOCUS_OFFSET, <0,0,0>
]);

float i;
vector camera_position;
for (i=0; i< 2*TWO_PI; i+=.05)
{
camera_position = llGetPos() + <0, 4, 0> * llEuler2Rot(<0,0,i>);
llSetCameraParams([CAMERA_POSITION, camera_position]);
}
default_cam();
}

fixed_cam() {
default_cam();
//llClearCameraParams(); // reset camera to default
llSetCameraParams([
CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
//CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees
//CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds
//CAMERA_DISTANCE, 0.0, // ( 0.5 to 10) meters
CAMERA_FOCUS, fixed_focus_position, // region relative position
//CAMERA_FOCUS_LAG, 0.0 , // (0 to 3) seconds
CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)
//CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters
//CAMERA_PITCH, 80.0, // (-45 to 80) degrees
CAMERA_POSITION, fixed_camera_position, // region relative position
//CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds
CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)
//CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters
CAMERA_FOCUS_OFFSET, ZERO_VECTOR // <-10,-10,-10> to <10,10,10> meters
]);
}

setup_listen() {
llListenRemove(CHANNEL);
CHANNEL = llRound(llFrand(1) * 100000);
llListen(CHANNEL, "", "", ""); // listen for dialog answers
}

default {
state_entry() {
llSitTarget(<0,0,0.1>,ZERO_ROTATION);
setup_listen();
llSetTimerEvent(2);
if (llGetAttached()) {
llRequestPermissions(llGetOwner(), PERMISSION_CONTROL_CAMERA);
llSleep(2);
}
}

touch_start(integer total_number) {
integer perm = llGetPermissions();
if (perm & PERMISSION_CONTROL_CAMERA) {
llOwnerSay(llGetScriptName() + " has PERMISSION_CONTROL_CAMERA perms for "+(string)llGetPermissionsKey());
} else {
string s = "*** " + llGetScriptName() + " has \"NOT\" PERMISSION_CONTROL_CAMERA perms for "
+ (string)llGetPermissionsKey();
s += "\n Click \"Cam ON\" first to get Permission." + " ***";
llOwnerSay(s);
}
llDialog(llDetectedKey(0), "What do you want to do?", MENU_MAIN, CHANNEL); // present dialog on click
}

listen(integer channel, string name, key id, string message) {
if (llListFindList(MENU_MAIN + MENU_2, [message]) != -1) {
if (message == "More...") {
llDialog(id, "Pick an option!", MENU_2, CHANNEL); // present submenu on request
} else if (message == "...Back") {
llDialog(id, "What do you want to do?", MENU_MAIN, CHANNEL); // present main menu on request to go back
} else if (message == "Cam ON") {
take_camera_control(id);
} else if (message == "Cam OFF") {
release_camera_control(id);
} else if (message == "Default") {
default_cam();
} else if (message == "Default") {
default_cam();
} else if (message == "Driving Cam") {
driving_cam();
} else if (message == "Worm Cam") {
worm_cam();
} else if (message == "Overhead Cam") {
overhead_cam();
} else if (message == "Spaz Cam") {
spaz_cam();
} else if (message == "Side Cam") {
side_cam();
} else if (message == "Drop Cam") {
drop_camera_5_seconds();
} else if (message == "Trap Toggle") {
trap = !trap;
if (trap == 1) {
llOwnerSay("trap is on");
} else {
llOwnerSay("trap is off");
}
} else if (message == "Spin Cam") {
spin_cam();
} else if (message == "Focus on Me") {
focus_on_me();
} else if (message == "Fixed Cam") {
fixed_cam();
} else {
llOwnerSay(name + " picked invalid option '" + llToLower(message) + "'."); // not a valid dialog choice
}
}
}

run_time_permissions(integer perm) {
if ((perm & PERMISSION_CONTROL_CAMERA) == PERMISSION_CONTROL_CAMERA) {
llSetCameraParams([CAMERA_ACTIVE, 1]); // 1 is active, 0 is inactive
llOwnerSay("Camera permissions have been taken");
}
}

changed(integer change) {
if (change & CHANGED_LINK) {
key agent = llAvatarOnSitTarget();
if (agent) {
setup_listen();
llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);
}
}
}
attach(key agent) {
if (agent != NULL_KEY) {
setup_listen();
llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);
} else {
llClearCameraParams();
llReleaseCamera(llGetOwner());
}
}

timer() {
if (trap == 1) {
focus_on_me();
}
}
}



  
Posted by 田中明夫 at 10:31Comments(2)TrackBack(0)カメラについて

2008年04月05日

カメラについて5 固定カメラで自分のアバタを見る

 ボックスの少し上にカメラを置いて、焦点をボックスの中心にしています。
カメラは通常アバタの動きに合わせて移動しますが、ここでは固定してます。
向きが逆なのでアバタの操作が少し難しいです。

 Youtubeで始めに表示される静止画ができるまでけっこう時間がかかりますね。
投稿時点で静止画はまだですが、クリックするとみれます。


  
Posted by 田中明夫 at 00:47Comments(0)TrackBack(0)カメラについて

2008年04月04日

チャットログ

 チャットのログはWindowsXP(SP2)では、
C:\Documents and Settings\ユーザ名\Application Data\SecondLife\アバタ名\chat.txt
に記録されています。
 
 ビューワのチャットコンソールは重くてスクロールやコピーがしにくく、ログイン後のものしか表示されないので、
 1)見たいところがかなり前
 2)見たいところが長い時
 3)見たいところがログイン前
などのときは、このログを直接開いて見てます。
テキストエディタだと検索もできます。

 人の名前が覚えるのが苦手で、しかも英数字なもんですからなかなか覚えることができません。
それで、遡ってログを開いて「えーっと、名前はどうだったかな?」と思って調べたりします。

 最新のビューアでは、テレポートしたとき
Teleport completed from http://slurl.com/secondlife/Aurum%20Oasis/222/38/32
などと表示されるようになったので以前に何処に行ってたのかもわかります。

 最近になって、EmEditor Freeというエディタ使って開いてたところ、
チャットに書き込みがあると
「外部でファイルが変更されています。読み直しますか?」と尋ねてきて表示が更新されます。
これはスクリプトからSayした大量のデバッグ等を見るときにとても便利です。
ただ、チャットに書き込みがされているときにEmEditor Freeをアクティブにしてると上記のダイアログが頻繁に出てきて困ります。

 チャットログがテキストとしてはかなり多い10Mbを超え、
長く扱いづらくなったのでファイル名を変更してみたところ、
チャットに書き込みがあると新たにchat.txtというファイルが作成されてました。
ファイルにロックがかかってないので、ビューア実行中でもできました。
これもデバッグ情報だらけで訳が分からなくなったときにクリアできるので便利です。
ただし、ファイルが壊れたりするかもしれないので自己責任でお願いします。  
Posted by 田中明夫 at 19:07Comments(0)TrackBack(0)その他

2008年04月04日

オートパイロット

 自動でsim上空をくまなく飛んでみました。
カクカクしてるのはグラボの性能が良くないせいだと思います。

Autopilot in the sky of Cocololo Island sim.
  
Posted by 田中明夫 at 02:03Comments(0)TrackBack(0)その他

2008年04月03日

Scan sim1

 非力なPCなんで古いビューアで撮影してましたが、
最新のビューアで画質もあげて撮影してみたところ、耐えてそこそこいい感じでした。
でも、3箇所ぐらい動画を撮影すると落ちますw。
それにアップするとかなり劣化しましたね。

Scan Quan Li sim
綺麗な川と海です。


Scan Oahu sim 
くつろげそうなオアフ。こうゆう所でのんびりとしたいですね。


Scan yamagata sim 
桜が満開の城下町。テクスが凝っていて綺麗なんです。
でも、テクスがロードされるまで時間がかかって、灰色のままのところが多くて何回かスキャンしました。
桜とわかるまでにはけっこうかかりましたね。


Scan Denmark sim 
前回の撮りなおし。シックな町がいいです。



あとがき
 実は、テクスのロードが遅くて灰色のところが無くなるまで、しばらくかかるsimもあります。
そういうときは、灰色のところを[Alt+マウス]でグリグリしたり、テクスチャのキャッシュを増やしたりしてみました。

  
Posted by 田中明夫 at 19:58Comments(0)TrackBack(0)Scan sim

2008年04月02日

カメラについて4 Simをカメラでスキャンする

 スクリプトでカメラを操作してSim全体をスキャンしてみました。
ノートカードにカメラの位置と焦点の座標・表示時間をいくつか記述し、
それを読み込ませて、順にカメラを移動させて表示させてます。
 ちょっと問題なのはSimの土地の高さはだいたい20~30mなんですが、
ときおりもっと高いSimもあって、そこでスキャンすると地面や地下をスキャンしてしまいます。



 スクリプトがカメラをコントロールしているときでも、
[Alt+クリック]でカメラのコントロールをユーザが奪うことができます。
つまり、Simをスクリプトにスキャンさせていて気になるところがあったら、
そこを[Alt+クリック]します。
そうすればユーザがカメラを自由にコントロールしてズームなどができるので、
そこまで移動しなくてもじっくりみたり買い物をすることもできます。

 これはSLの仕様なのですが、今カメラをコントロールしているのがスクリプトなのかユーザなのか分かりにくいという問題もあります。  
Posted by 田中明夫 at 20:41Comments(0)TrackBack(0)カメラについて

2008年04月02日

カメラについて3 世界地図とカメラ

 これは描画距離が最小値64mでカメラがリセット状態の世界地図です。
アバタの位置は、下のSIMの南東の端に黄色い円で表示されています。
カメラの写す範囲が薄い白の三角形で表示されています。

 次に描画距離を最大の512mにしたのが下の世界地図です。
自分のいるSIMを超えて隣のSIMまで範囲に入っているのがわかります。


 最後に、自分のアバタからはるかに離れた位置にカメラを設置した場合の世界地図です。
描画距離は160メートルで、「Disable Camera Constraints」をチェックしています。
SIMも何もないところから、自分のアバタの方向に向けています。




  
Posted by 田中明夫 at 18:54Comments(0)TrackBack(0)カメラについて