ソラマメブログ
HUDCampTimerMessageBoard WittyRadar

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)カメラについて