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


