
2008年04月11日
カメラについて11 AutoPilotのアバタをAltズーム
止まっているときは自分のアバタをAltズームで見れますが、
移動の操作をすると解除されてしまいます。
AutoPilot中で移動の操作をしてないので、
移動中の自分のアバタをAltズームでいろんな角度から撮影できました。
もっと綺麗な画像で見たいから、新しいPCが欲しくなってきました。




YouTube
移動の操作をすると解除されてしまいます。
AutoPilot中で移動の操作をしてないので、
移動中の自分のアバタをAltズームでいろんな角度から撮影できました。
もっと綺麗な画像で見たいから、新しいPCが欲しくなってきました。
YouTube
2008年04月07日
カメラについて10 レーダーが検知したオブジェクトをブラウズ
レーダーが検知したオブジェクトを順に見ていってます。
センサーで座標がわかるんですから、カメラを移動してみました。
レーダーが一度に検知するのは16件までなので、
とてもお店の商品を全部みれませんが、
意外な視野で見れるので、面白かったりします。
気になると所があれば、途中でAltズームすればそこをじっくり見れます。

YouTube版
センサーで座標がわかるんですから、カメラを移動してみました。
レーダーが一度に検知するのは16件までなので、
とてもお店の商品を全部みれませんが、
意外な視野で見れるので、面白かったりします。
気になると所があれば、途中でAltズームすればそこをじっくり見れます。

YouTube版
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
しかし、この場合のパーミッションって誰に得てるんでしょうかね?
座ったり装着したらダイアログも出なくてユーザの承諾なしに勝手にパーミッションをスクリプトが得てしまいますから、意味がなくスクリプトがややこしくなるだけと思うんですが。
今回は、色付けツールでうまく変換できました。
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();
}
}
}
2008年04月06日
カメラについて8 カメラのスクリプトモード中にAltズーム
オートパイロット中は、スクリプトでオーバーヘッドカム(上から見下ろすカメラ)にしています。
なので、カメラはスクリプトモードです。
途中で、広場の真ん中が気になったので、そこを[Alt+左クリック]でズームしました。
カメラはそこで止まりますが、アバタはオートパイロット中なので画面から消えてしまいます。
その後、[ESC]キーを押してスクリプトモードに戻ったので、またアバタが表示されました。
なので、カメラはスクリプトモードです。
途中で、広場の真ん中が気になったので、そこを[Alt+左クリック]でズームしました。
カメラはそこで止まりますが、アバタはオートパイロット中なので画面から消えてしまいます。
その後、[ESC]キーを押してスクリプトモードに戻ったので、またアバタが表示されました。
2008年04月06日
カメラについて7 カメラモード
カメラモードの大雑把な図です。

ノーマルモード:リセットされた通常の状態。
スクリプトモード:スクリプトがコントロールしている状態。
Altズーム:オブジェクト、アバタ、地面または空間に固定している状態。
マウスルックは、画面左上に文字も表示されすぐわかりますので省いています。
1)スクリプトはAltズームを奪えない
ノーマルモードなのかAltズームなのかは、画面に表示されないので分かりにくいです。
問題なのは、スクリプトがカメラコントロールしようとしてもAltズーム中は画面が変わらないということです。
[ESC]を押してAltズームを終了させないとスクリプトはカメラをコントロールできません。
ときには、[ESC]を数回押さないと駄目なときもあります。
オブジェクトを編集した後も同様です。
2)スクリプトモードからでもAltズームにできる
スクリプトがカメラをコントロールしていても、[Alt+左クリック]でAltズームにできます。
この場合、[ESC]を押してもスクリプトモードに戻り、ノーマルモードには戻りません。
3)スクリプトに異常があるとノーマルモードに戻らない
スクリプトモードで
・スクリプト禁止エリアに入る
・スクリプトにバグがある
・simに異常がある
の場合にはスクリプトはカメラをノーマルモードに戻すことができません。
4)カメラが変な状態のまま戻らなくなったら、オブジェクトをはずせば元に戻る
カメラがおかしくなって元に戻らない場合は、そのオブジェクトをはずせば元に戻ります。

ノーマルモード:リセットされた通常の状態。
スクリプトモード:スクリプトがコントロールしている状態。
Altズーム:オブジェクト、アバタ、地面または空間に固定している状態。
マウスルックは、画面左上に文字も表示されすぐわかりますので省いています。
1)スクリプトはAltズームを奪えない
ノーマルモードなのかAltズームなのかは、画面に表示されないので分かりにくいです。
問題なのは、スクリプトがカメラコントロールしようとしてもAltズーム中は画面が変わらないということです。
[ESC]を押してAltズームを終了させないとスクリプトはカメラをコントロールできません。
ときには、[ESC]を数回押さないと駄目なときもあります。
オブジェクトを編集した後も同様です。
2)スクリプトモードからでもAltズームにできる
スクリプトがカメラをコントロールしていても、[Alt+左クリック]でAltズームにできます。
この場合、[ESC]を押してもスクリプトモードに戻り、ノーマルモードには戻りません。
3)スクリプトに異常があるとノーマルモードに戻らない
スクリプトモードで
・スクリプト禁止エリアに入る
・スクリプトにバグがある
・simに異常がある
の場合にはスクリプトはカメラをノーマルモードに戻すことができません。
4)カメラが変な状態のまま戻らなくなったら、オブジェクトをはずせば元に戻る
カメラがおかしくなって元に戻らない場合は、そのオブジェクトをはずせば元に戻ります。
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()にも装着しているときはパーミッションを獲得しに行くようにしてます。
色付けツールで載せたかったのですが、ツールではうまく変換できませんでした。
再装着しようとしたらアタッチできず。どうやら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();
}
}
}
2008年04月05日
カメラについて5 固定カメラで自分のアバタを見る
ボックスの少し上にカメラを置いて、焦点をボックスの中心にしています。
カメラは通常アバタの動きに合わせて移動しますが、ここでは固定してます。
向きが逆なのでアバタの操作が少し難しいです。
Youtubeで始めに表示される静止画ができるまでけっこう時間がかかりますね。
投稿時点で静止画はまだですが、クリックするとみれます。
カメラは通常アバタの動きに合わせて移動しますが、ここでは固定してます。
向きが逆なのでアバタの操作が少し難しいです。
Youtubeで始めに表示される静止画ができるまでけっこう時間がかかりますね。
投稿時点で静止画はまだですが、クリックするとみれます。
2008年04月02日
カメラについて4 Simをカメラでスキャンする
スクリプトでカメラを操作してSim全体をスキャンしてみました。
ノートカードにカメラの位置と焦点の座標・表示時間をいくつか記述し、
それを読み込ませて、順にカメラを移動させて表示させてます。
ちょっと問題なのはSimの土地の高さはだいたい20~30mなんですが、
ときおりもっと高いSimもあって、そこでスキャンすると地面や地下をスキャンしてしまいます。
スクリプトがカメラをコントロールしているときでも、
[Alt+クリック]でカメラのコントロールをユーザが奪うことができます。
つまり、Simをスクリプトにスキャンさせていて気になるところがあったら、
そこを[Alt+クリック]します。
そうすればユーザがカメラを自由にコントロールしてズームなどができるので、
そこまで移動しなくてもじっくりみたり買い物をすることもできます。
これはSLの仕様なのですが、今カメラをコントロールしているのがスクリプトなのかユーザなのか分かりにくいという問題もあります。
ノートカードにカメラの位置と焦点の座標・表示時間をいくつか記述し、
それを読み込ませて、順にカメラを移動させて表示させてます。
ちょっと問題なのはSimの土地の高さはだいたい20~30mなんですが、
ときおりもっと高いSimもあって、そこでスキャンすると地面や地下をスキャンしてしまいます。
スクリプトがカメラをコントロールしているときでも、
[Alt+クリック]でカメラのコントロールをユーザが奪うことができます。
つまり、Simをスクリプトにスキャンさせていて気になるところがあったら、
そこを[Alt+クリック]します。
そうすればユーザがカメラを自由にコントロールしてズームなどができるので、
そこまで移動しなくてもじっくりみたり買い物をすることもできます。
これはSLの仕様なのですが、今カメラをコントロールしているのがスクリプトなのかユーザなのか分かりにくいという問題もあります。
2008年04月02日
カメラについて3 世界地図とカメラ
これは描画距離が最小値64mでカメラがリセット状態の世界地図です。
アバタの位置は、下のSIMの南東の端に黄色い円で表示されています。
カメラの写す範囲が薄い白の三角形で表示されています。
次に描画距離を最大の512mにしたのが下の世界地図です。
自分のいるSIMを超えて隣のSIMまで範囲に入っているのがわかります。

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

アバタの位置は、下のSIMの南東の端に黄色い円で表示されています。
カメラの写す範囲が薄い白の三角形で表示されています。
次に描画距離を最大の512mにしたのが下の世界地図です。
自分のいるSIMを超えて隣のSIMまで範囲に入っているのがわかります。
最後に、自分のアバタからはるかに離れた位置にカメラを設置した場合の世界地図です。
描画距離は160メートルで、「Disable Camera Constraints」をチェックしています。
SIMも何もないところから、自分のアバタの方向に向けています。
2008年04月02日
カメラについて2 クライアント(ビューワ)の設定変更
デフォルトではカメラの移動に制限がかかっていて、アバタから50メートルぐらいまでしか移動できません。
[Ctrl+Alt+D]でデバッグモードにして、Client(新しいクライアントではAdvanced)メニューから、
・「Disable Camera Constraints」のチェックをすると遠くまでカメラを移動できるようになります。
下のTipsでは、さらに
・「Limit Select Distance」のチェックをはずして遠くのオブジェクトも選択できるようにしています。
Tipsでは、これらの設定はログイン毎にしなければならなかったようですが、今では設定が保持されるようになっています。
Tip of the Week: How to move your camera further and better
「Disable Camera Constraints」のチェックをしてカメラを遠くまで移動できるようにしても、
描画距離を超えた場所だとオブジェクトやアバタは表示されず地形だけが表示されます。
描画距離を広げるには(バージョン1.19.1 Release Candidate RC4の場合)、
「編集>環境設定>表示(タブ)>カスタム(チェックする)をしてから、描画距離のスライダーで変更します。

これを大きくすれば、SIMの端から端までさらには隣のSIMまで見ることができます。
しかし、あまり距離を大きくするとPCへ負荷がかかりすぎて重くなります。
逆にSIMが重いときなどは、描画距離を短くすると軽くなるときもあります。
[Ctrl+Alt+D]でデバッグモードにして、Client(新しいクライアントではAdvanced)メニューから、
・「Disable Camera Constraints」のチェックをすると遠くまでカメラを移動できるようになります。
下のTipsでは、さらに
・「Limit Select Distance」のチェックをはずして遠くのオブジェクトも選択できるようにしています。
Tipsでは、これらの設定はログイン毎にしなければならなかったようですが、今では設定が保持されるようになっています。
Tip of the Week: How to move your camera further and better
「Disable Camera Constraints」のチェックをしてカメラを遠くまで移動できるようにしても、
描画距離を超えた場所だとオブジェクトやアバタは表示されず地形だけが表示されます。
描画距離を広げるには(バージョン1.19.1 Release Candidate RC4の場合)、
「編集>環境設定>表示(タブ)>カスタム(チェックする)をしてから、描画距離のスライダーで変更します。
これを大きくすれば、SIMの端から端までさらには隣のSIMまで見ることができます。
しかし、あまり距離を大きくするとPCへ負荷がかかりすぎて重くなります。
逆にSIMが重いときなどは、描画距離を短くすると軽くなるときもあります。
2008年04月02日
カメラについて1 操作
クライアントの操作やSLの仕組みがわかってないと
せっかく商品を購入しても正しく使えなかったり、
スクリプトで何をどう記述すればいいのかよくわからなかったりします。
カメラ・センサー・テレポート・移動などのスクリプトを書いてみましたが、
いろいろ試しているうちに自分がSLの仕組みや操作についてよくわかっていないと実感しました。
それで少しカメラについて書いてみます。
通常、カメラはアバタの後部少し上方にあり、
少し見下ろすような感じでアバタの向いてる方を見るようになっています。
カメラはアバタの位置に関係なくどこでも自由にSIM内を移動できます。
どこでもといっても手動であらゆるところを見るには少し熟練したカメラ操作が必要です。
また、遠くまでちゃんと表示されるようにするにはクライアントの設定を変更する必要があります。
これについては、次回に書きます。
ここにわかりやすい操作の説明があります。
カメラ・視野の操作/セカンドライフ操作マニュアル
アバタが近くに行かなくても、カメラで捕らえることができれば、買い物などのオブジェクトの操作、Sitができます。
カメラで見ることができたなら、かなり離れたところにもSitできるので、テレポートしたような感じになります。Sitするとき地図でアバタの位置を観察しているとものすごい速さで移動してました。
障害物も無視してるようです。
ただし、Sitは遠すぎると失敗することがあり、椅子の方が成功率も高いようです。
音はカメラの焦点から拾われるようになっているようです。
他のアバタの近くにカメラの焦点を持っていくと、
自分のアバタがSayの届く範囲20mより遠く離れたところにいてもキーボードの音が聞こえます。
[ESC]を押すと元のカメラの状態に戻ります(メニューバー:ビュー>表示をリセットと同じ)。
また、マウスルック時以外はカメラを操作した後でも、アバタを移動させると元に戻ります。
といっても、ズームの変更(カメラとアバタの距離)は[ESC]でないと元に戻らないようです。
カメラとSitは、RLの感覚とはかけ離れた仕様のようです。
[M]を押すかホイールを前に移動させ続けると、マウスルックになります。
マウスルックがなんのためにあるのかよくわかっていませんでした。
遠くの物をズームするためにホイールを前方に回転させ続けているとマウスルックになるのが鬱陶しいと思ってたぐらいです。
どうやらマウスルックとはアバタの視線で見ることのようです。
下の動画では、狭いところに入り込んでしまったとき、マウスルックでアバタの視線にして抜け出しています。
マウスルックの状態でも移動できるんですね。
カメラとアバタの間に障害物があると目隠しされたようになることがよくあります。
そういうときに、アバタの視線にすればいいということみたいです。
Navigating inside small spaces - Video Tutorial
あと、空にいるときなど景色がいいところで、マウスルックにすると自分がそこにいるような感じで楽しめますね
せっかく商品を購入しても正しく使えなかったり、
スクリプトで何をどう記述すればいいのかよくわからなかったりします。
カメラ・センサー・テレポート・移動などのスクリプトを書いてみましたが、
いろいろ試しているうちに自分がSLの仕組みや操作についてよくわかっていないと実感しました。
それで少しカメラについて書いてみます。
通常、カメラはアバタの後部少し上方にあり、
少し見下ろすような感じでアバタの向いてる方を見るようになっています。
カメラはアバタの位置に関係なくどこでも自由にSIM内を移動できます。
どこでもといっても手動であらゆるところを見るには少し熟練したカメラ操作が必要です。
また、遠くまでちゃんと表示されるようにするにはクライアントの設定を変更する必要があります。
これについては、次回に書きます。
ここにわかりやすい操作の説明があります。
カメラ・視野の操作/セカンドライフ操作マニュアル
アバタが近くに行かなくても、カメラで捕らえることができれば、買い物などのオブジェクトの操作、Sitができます。
カメラで見ることができたなら、かなり離れたところにもSitできるので、テレポートしたような感じになります。Sitするとき地図でアバタの位置を観察しているとものすごい速さで移動してました。
障害物も無視してるようです。
ただし、Sitは遠すぎると失敗することがあり、椅子の方が成功率も高いようです。
音はカメラの焦点から拾われるようになっているようです。
他のアバタの近くにカメラの焦点を持っていくと、
自分のアバタがSayの届く範囲20mより遠く離れたところにいてもキーボードの音が聞こえます。
[ESC]を押すと元のカメラの状態に戻ります(メニューバー:ビュー>表示をリセットと同じ)。
また、マウスルック時以外はカメラを操作した後でも、アバタを移動させると元に戻ります。
といっても、ズームの変更(カメラとアバタの距離)は[ESC]でないと元に戻らないようです。
カメラとSitは、RLの感覚とはかけ離れた仕様のようです。
[M]を押すかホイールを前に移動させ続けると、マウスルックになります。
マウスルックがなんのためにあるのかよくわかっていませんでした。
遠くの物をズームするためにホイールを前方に回転させ続けているとマウスルックになるのが鬱陶しいと思ってたぐらいです。
どうやらマウスルックとはアバタの視線で見ることのようです。
下の動画では、狭いところに入り込んでしまったとき、マウスルックでアバタの視線にして抜け出しています。
マウスルックの状態でも移動できるんですね。
カメラとアバタの間に障害物があると目隠しされたようになることがよくあります。
そういうときに、アバタの視線にすればいいということみたいです。
Navigating inside small spaces - Video Tutorial
あと、空にいるときなど景色がいいところで、マウスルックにすると自分がそこにいるような感じで楽しめますね


