2007年04月26日
スクリプトで重さを測る
物理属性で、コマもひと段落したが、その中で疑問点が出てきた。
セカンドライフ内の質量はどうなってるのだろうか?
そこで、体重計というか重量計を作ってみたくなった。
まずは、セカンドライフ内での重さの図り方。
llGetObjectMassを使用する。llGetObjectMassの引数はkeyidであるが、これは、touchとかcollition時にllDetectedKeyをcallすれば得る事が出来る。
試しに立方体で図ってみると、
1m四方の立方体:10.000006リンデングラム
素材によっては、重さは変わらない
素材による密度の違いが無い世界なので、リンデングラムは、何Kgなの?というのは意味のない事になってしまう。
水の密度を1g/cm3とすると、1m四方だと1000Kgなので、すべてが水の密度と仮定すると、
1リンデングラム = 100Kg (あくまでも水の密度を基準の場合)
やはり体重計としては、Kgに換算して考えられた方が面白そうだなあ
。
#Touchするとその人の重さが表示。何かを載せたりぶつけると、そのオブジェクトの重さを表示するスクリプト
------------------------
integer index;
key kid;
default
{
state_entry()
{
}
touch_start(integer total_number)
{
for ( index = 0; index < 10; index++ ) {
kid = llDetectedKey(index);
if ( kid != NULL_KEY )
llSay(0, (string)llKey2Name(kid)+" = "+(string)llGetObjectMass(kid));
}
}
touch_start(integer total_number)
{
for ( index = 0; index < total_number; index++ ) {
kid = llDetectedKey(index);
if ( kid != NULL_KEY )
llSay(0, (string)llKey2Name(kid)+" = "+(string)llGetObjectMass(kid));
}
}
collision_start(integer total_number)
{
for ( index = 0; index < total_number; index++ ) {
kid = llDetectedKey(index);
if ( kid != NULL_KEY )
llSay(0, (string)llKey2Name(kid)+" = "+(string)llGetObjectMass(kid));
}
}
}
セカンドライフ内の質量はどうなってるのだろうか?
そこで、体重計というか重量計を作ってみたくなった。
まずは、セカンドライフ内での重さの図り方。
llGetObjectMassを使用する。llGetObjectMassの引数はkeyidであるが、これは、touchとかcollition時にllDetectedKeyをcallすれば得る事が出来る。
試しに立方体で図ってみると、
1m四方の立方体:10.000006リンデングラム
素材によっては、重さは変わらない
素材による密度の違いが無い世界なので、リンデングラムは、何Kgなの?というのは意味のない事になってしまう。
水の密度を1g/cm3とすると、1m四方だと1000Kgなので、すべてが水の密度と仮定すると、
1リンデングラム = 100Kg (あくまでも水の密度を基準の場合)
やはり体重計としては、Kgに換算して考えられた方が面白そうだなあ
#Touchするとその人の重さが表示。何かを載せたりぶつけると、そのオブジェクトの重さを表示するスクリプト
------------------------
integer index;
key kid;
default
{
state_entry()
{
}
touch_start(integer total_number)
{
for ( index = 0; index < 10; index++ ) {
kid = llDetectedKey(index);
if ( kid != NULL_KEY )
llSay(0, (string)llKey2Name(kid)+" = "+(string)llGetObjectMass(kid));
}
}
touch_start(integer total_number)
{
for ( index = 0; index < total_number; index++ ) {
kid = llDetectedKey(index);
if ( kid != NULL_KEY )
llSay(0, (string)llKey2Name(kid)+" = "+(string)llGetObjectMass(kid));
}
}
collision_start(integer total_number)
{
for ( index = 0; index < total_number; index++ ) {
kid = llDetectedKey(index);
if ( kid != NULL_KEY )
llSay(0, (string)llKey2Name(kid)+" = "+(string)llGetObjectMass(kid));
}
}
}
2007年04月14日
物理属性でこま回し
オブジェクトの属性で「物理」というのがある。
今までは、これをOFFにして、強制的にまわして、最後にパタンと倒れるだけというものだった。
この物理をONにしてびっくり。
セカンドライフ内の物理法則にしたがって、動くではないか。
ほんとにセカンドライフを作った人達は、すごい!
以前のコマだと重心が高くて、きちんと立たなかったので、重心を低くした。
新しいコマで、llTargetOmegaでまわして見ると、回ったぞー!
複数のコマをまわすと、ぶつかって跳ね返る所まで再現される…すごい!
難点は、倒れたまま回転すると、ころころ転がって、どこかへ行ってしまう。
しばらく探しても、見つからない事も…
あとは、どのように回転の強さを減らしてゆくかが問題。
摩擦係数や衝突時の衝撃により、回転を減らして行くとかすると、楽しそう。
どうやるのかは、まだ判らないが…
とりあえずは、衝突時に乱数で回転力を減らしてゆく程度しかできないだろうなあ。
今までは、これをOFFにして、強制的にまわして、最後にパタンと倒れるだけというものだった。
この物理をONにしてびっくり。
セカンドライフ内の物理法則にしたがって、動くではないか。
ほんとにセカンドライフを作った人達は、すごい!
以前のコマだと重心が高くて、きちんと立たなかったので、重心を低くした。
新しいコマで、llTargetOmegaでまわして見ると、回ったぞー!
複数のコマをまわすと、ぶつかって跳ね返る所まで再現される…すごい!
難点は、倒れたまま回転すると、ころころ転がって、どこかへ行ってしまう。
しばらく探しても、見つからない事も…
あとは、どのように回転の強さを減らしてゆくかが問題。
摩擦係数や衝突時の衝撃により、回転を減らして行くとかすると、楽しそう。
どうやるのかは、まだ判らないが…
とりあえずは、衝突時に乱数で回転力を減らしてゆく程度しかできないだろうなあ。
2007年04月05日
rotationってなに?
rotationの各要素はいったい何を表すのだろうか?
さっぱり判らないので、調べてみる。
オイラー座標系から変換しているて、回転する軸を変える事で
便利にあらわせるものなのかな?
http://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/robotics/coordtrans.html
このページが勉強になったが、後は、パラメータを変えながらスクリプトで
動かしながらという感じだろうか。
さっぱり判らないので、調べてみる。
オイラー座標系から変換しているて、回転する軸を変える事で
便利にあらわせるものなのかな?
http://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/robotics/coordtrans.html
このページが勉強になったが、後は、パラメータを変えながらスクリプトで
動かしながらという感じだろうか。
2007年04月03日
スクリプトでこまを倒す
こまを倒してみる。
llSetRot(rotation rot);
これで倒れるようだが、今ひとつ納得できない。
rotationは、x,y,z,sとの事だが、sの意味がよくわからない。うーん。


#スクリプトの表示がうまく出来ません。改行が入ってしまう~。タブ&スペースがそのままで改行も入らないようにするには、どうすればよいのでしょうかー?
llSetRot(rotation rot);
これで倒れるようだが、今ひとつ納得できない。
rotationは、x,y,z,sとの事だが、sの意味がよくわからない。うーん。
--------------------------------
default
{
state_entry()
{
}
touch_start(integer total_number){
state roll_speed_2;
}
}
state reset_pos{
state_entry(){
llSetTimerEvent(2.0);
}
timer(){
llSetRot(<PI,0,0,0>); //modoru
llOwnerSay("Rot3="+(string)llGetRot());
}
touch_start(integer total_number){
state roll_speed_2;
}
}
state roll_speed_0{
state_entry(){
llOwnerSay("Rot="+(string)llGetRot());
llTargetOmega(<0,0,0>, PI, 1);
llSetTimerEvent(2.0);
}
timer(){
llSetRot(<PI_BY_TWO,0,0,1>); //taoreru
llOwnerSay("Rot2="+(string)llGetRot());
state reset_pos;
}
}
state roll_speed_1{
state_entry(){
llTargetOmega(<0,0,2>, PI, 1);
llSetTimerEvent(2.0);
}
timer(){
state roll_speed_0;
}
}
state roll_speed_2{
state_entry(){
llTargetOmega(<0,0,4>, PI, 1);
llSetTimerEvent(2.0);
}
timer(){
state roll_speed_1;
}
}
------------------------------------
#スクリプトの表示がうまく出来ません。改行が入ってしまう~。タブ&スペースがそのままで改行も入らないようにするには、どうすればよいのでしょうかー?
2007年04月01日
スクリプトで時間がたってからの処理
こまをまわして、時間がたつと、だんだん遅くなって、止まるというスクリプトを試す。
タイマーを使う場合には、
llSetTimerEvent(float sec);
を使う。
secで指定した時間経過後に、timer()が呼ばれる。
うーん。簡単で便利~。
次は、止まりそうになると、軸を変えてふらふら回り、最後に倒れる所までやりたいなあー。

タイマーを使う場合には、
llSetTimerEvent(float sec);
を使う。
secで指定した時間経過後に、timer()が呼ばれる。
うーん。簡単で便利~。
次は、止まりそうになると、軸を変えてふらふら回り、最後に倒れる所までやりたいなあー。
--------------------------
default
{
state_entry()
{
}
touch_start(integer total_number){
state roll_speed_2;
}
}
state roll_speed_0{
state_entry(){
llTargetOmega(<0,0,0>, PI, 1);
}
touch_start(integer total_number){
state roll_speed_2;
}
}
state roll_speed_1{
state_entry(){
llTargetOmega(<0,0,2>, PI, 1);
llSetTimerEvent(2.0);
}
touch_start(integer total_number){
state roll_speed_0;
}
timer(){
state roll_speed_0;
}
}
state roll_speed_2{
state_entry(){
llTargetOmega(<0,0,4>, PI, 1);
llSetTimerEvent(2.0);
}
touch_start(integer total_number){
state roll_speed_1;
}
timer(){
state roll_speed_1;
}
}
--------------------------
2007年03月29日
スクリプトでこまを回してみる
こまを作って、そのこまをまわして見ようと思った。
エディターでこまを作ってみるが、なんだか歪んでいて、不恰好なものしか作れない。
適当にテクスチャーを貼り付けて、こんな感じになった。

これにスクリプトを使って、タッチすると早く回転するようにしてみた。
うーん、ちょっと芸がないなあ。
本当は、ひもを付けて、投げると回って、時間が来ると止まって倒れて、ぶつかると跳ね返るこまが作りたいが、まだ、そこまで出来ない…くやしい~
------------------------------------------
default
{
state_entry()
{
}
touch_start(integer total_number){
llSay(0, "Move!");
state roll_speed_1;
}
}
state roll_speed_0{
state_entry(){
llSay(0, "speed 0");
llTargetOmega(<0,0,0>, PI, 1);
}
touch_start(integer total_number){
state roll_speed_1;
}
}
state roll_speed_1{
state_entry(){
llSay(0, "speed 1");
llTargetOmega(<0,0,2>, PI, 1);
}
touch_start(integer total_number){
state roll_speed_2;
}
}
state roll_speed_2{
state_entry(){
llSay(0, "speed 2");
llTargetOmega(<0,0,4>, PI, 1);
}
touch_start(integer total_number){
state roll_speed_0;
}
}
エディターでこまを作ってみるが、なんだか歪んでいて、不恰好なものしか作れない。
適当にテクスチャーを貼り付けて、こんな感じになった。
これにスクリプトを使って、タッチすると早く回転するようにしてみた。
うーん、ちょっと芸がないなあ。
本当は、ひもを付けて、投げると回って、時間が来ると止まって倒れて、ぶつかると跳ね返るこまが作りたいが、まだ、そこまで出来ない…くやしい~
------------------------------------------
default
{
state_entry()
{
}
touch_start(integer total_number){
llSay(0, "Move!");
state roll_speed_1;
}
}
state roll_speed_0{
state_entry(){
llSay(0, "speed 0");
llTargetOmega(<0,0,0>, PI, 1);
}
touch_start(integer total_number){
state roll_speed_1;
}
}
state roll_speed_1{
state_entry(){
llSay(0, "speed 1");
llTargetOmega(<0,0,2>, PI, 1);
}
touch_start(integer total_number){
state roll_speed_2;
}
}
state roll_speed_2{
state_entry(){
llSay(0, "speed 2");
llTargetOmega(<0,0,4>, PI, 1);
}
touch_start(integer total_number){
state roll_speed_0;
}
}
2007年03月28日
逆立ちしたい
この間、どこかでObjectに乗った時に、逆立ち状態になってしまった。
ずーっと、どうやってやるのか気になっていた。
ScriptのAPIでは、それらしいものがない。
うーん。と考えているうちに、アバターの動作がジェスチャーで出来るのを思い出す。
新しいジェスチャーを作ろうとすると、Animationというのがある。
そこで気づいた。
アニメーションって、アバターの動作のことなんだあー!
ScriptのAPIを見直すと、やっと見つけたー。
という事で、touchすると、バク転するScriptを作ってみる。
よくわからないが、パーミッションがない場合には、要求する必要があるようなので、
そのコードも入れて、backflipのアニメーションを起動すると、できたぞーっ!
#ほんとは、逆立ちしたかったが、libにはないらしい…
-------------------------------------
default
{
state_entry()
{
}
touch(integer num)
{
integer perm = llGetPermissions();
if (! (perm & PERMISSION_TRIGGER_ANIMATION)) {
llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
}
llStartAnimation("backflip");
}
}-------------------------------------
ずーっと、どうやってやるのか気になっていた。
ScriptのAPIでは、それらしいものがない。
うーん。と考えているうちに、アバターの動作がジェスチャーで出来るのを思い出す。
新しいジェスチャーを作ろうとすると、Animationというのがある。
そこで気づいた。
アニメーションって、アバターの動作のことなんだあー!
ScriptのAPIを見直すと、やっと見つけたー。
という事で、touchすると、バク転するScriptを作ってみる。
よくわからないが、パーミッションがない場合には、要求する必要があるようなので、
そのコードも入れて、backflipのアニメーションを起動すると、できたぞーっ!
#ほんとは、逆立ちしたかったが、libにはないらしい…
-------------------------------------
default
{
state_entry()
{
}
touch(integer num)
{
integer perm = llGetPermissions();
if (! (perm & PERMISSION_TRIGGER_ANIMATION)) {
llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
}
llStartAnimation("backflip");
}
}-------------------------------------
2007年03月27日
スクリプトを作ってみる
スクリプトを作ってみた。
C言語likeな書式で、まずは、stateを試してみる。
最初はdefaultがあり、state_entryは、そのstateに入った時に実行されるらしい。
touch_startがtouchした時に実行される関数。
オブジェクトの色の変更関数のllSetColorのみを使って、シンプルに書いてみた。
これで、オブジェクトをクリックするたびに、赤→緑→青と色がかわったー!!!!
#でも、この手の言語は、なんでもそうだが、こういうシンプルなサンプルは簡単だけど、目的を持ったコードを書く時は、難儀するに違いない…と自戒する。
--------------------------
default
{
state_entry(){
state red;
}
}
state red{
state_entry(){
llSetColor(<1,0,0>, ALL_SIDES);
}
touch_start(integer total_number){
state green;
}
}
state green{
state_entry(){
llSetColor(<0,1,0>, ALL_SIDES);
}
touch_start(integer total_number){
state blue;
}
}
state blue{
state_entry(){
llSetColor(<0,0,1>, ALL_SIDES);
}
touch_start(integer total_number){
state red;
}
}
-----------------------
C言語likeな書式で、まずは、stateを試してみる。
最初はdefaultがあり、state_entryは、そのstateに入った時に実行されるらしい。
touch_startがtouchした時に実行される関数。
オブジェクトの色の変更関数のllSetColorのみを使って、シンプルに書いてみた。
これで、オブジェクトをクリックするたびに、赤→緑→青と色がかわったー!!!!
#でも、この手の言語は、なんでもそうだが、こういうシンプルなサンプルは簡単だけど、目的を持ったコードを書く時は、難儀するに違いない…と自戒する。
--------------------------
default
{
state_entry(){
state red;
}
}
state red{
state_entry(){
llSetColor(<1,0,0>, ALL_SIDES);
}
touch_start(integer total_number){
state green;
}
}
state green{
state_entry(){
llSetColor(<0,1,0>, ALL_SIDES);
}
touch_start(integer total_number){
state blue;
}
}
state blue{
state_entry(){
llSetColor(<0,0,1>, ALL_SIDES);
}
touch_start(integer total_number){
state red;
}
}
-----------------------

