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/21
スクリプトでコマまわし:物理属性の衝撃!
なんという事だろう。今までの苦労が無駄に見える美しい解を見つけてしまった。
コマの回転をどのように減速させるかを、時間による減速、衝突による減速など、苦労しながら試行錯誤していたのが、すべて無駄だったのである。
まず、物理属性を持たせたコマを他のオブジェクトで回す事を考えた。
他のオブジェクトをコマに接続して、そのオブジェクトを回して、時間がたったら、ファントムにして影響を消す。→うまく行かない。ファントムになるたびに、外れる。リンクするとコマまでファントムに…
もしやと思い、回転させた後、llResetScript()を使用してみると、なんとちゃんと動作するではないか…
これまでの長いスクリプトとは打って変わって、シンプルなスクリプトで、ちゃんと動いた…
かなり衝撃!→もっと早く気づけよーという感じか。

--------------------------
default
{
state_entry()
{
}
touch_start(integer total_number){
llTargetOmega(<0,0,1>, 100*PI, 1); //適当に回転スピード
llSetTimerEvent(2.0);
}
timer() {
llResetScript();
}
}
コマの回転をどのように減速させるかを、時間による減速、衝突による減速など、苦労しながら試行錯誤していたのが、すべて無駄だったのである。
まず、物理属性を持たせたコマを他のオブジェクトで回す事を考えた。
他のオブジェクトをコマに接続して、そのオブジェクトを回して、時間がたったら、ファントムにして影響を消す。→うまく行かない。ファントムになるたびに、外れる。リンクするとコマまでファントムに…
もしやと思い、回転させた後、llResetScript()を使用してみると、なんとちゃんと動作するではないか…
これまでの長いスクリプトとは打って変わって、シンプルなスクリプトで、ちゃんと動いた…
かなり衝撃!→もっと早く気づけよーという感じか。

--------------------------
default
{
state_entry()
{
}
touch_start(integer total_number){
llTargetOmega(<0,0,1>, 100*PI, 1); //適当に回転スピード
llSetTimerEvent(2.0);
}
timer() {
llResetScript();
}
}
2007/04/14
物理属性でこま回し
オブジェクトの属性で「物理」というのがある。
今までは、これをOFFにして、強制的にまわして、最後にパタンと倒れるだけというものだった。
この物理をONにしてびっくり。
セカンドライフ内の物理法則にしたがって、動くではないか。
ほんとにセカンドライフを作った人達は、すごい!
以前のコマだと重心が高くて、きちんと立たなかったので、重心を低くした。
新しいコマで、llTargetOmegaでまわして見ると、回ったぞー!
複数のコマをまわすと、ぶつかって跳ね返る所まで再現される…すごい!
難点は、倒れたまま回転すると、ころころ転がって、どこかへ行ってしまう。
しばらく探しても、見つからない事も…
あとは、どのように回転の強さを減らしてゆくかが問題。
摩擦係数や衝突時の衝撃により、回転を減らして行くとかすると、楽しそう。
どうやるのかは、まだ判らないが…
とりあえずは、衝突時に乱数で回転力を減らしてゆく程度しかできないだろうなあ。
今までは、これをOFFにして、強制的にまわして、最後にパタンと倒れるだけというものだった。
この物理をONにしてびっくり。
セカンドライフ内の物理法則にしたがって、動くではないか。
ほんとにセカンドライフを作った人達は、すごい!
以前のコマだと重心が高くて、きちんと立たなかったので、重心を低くした。
新しいコマで、llTargetOmegaでまわして見ると、回ったぞー!
複数のコマをまわすと、ぶつかって跳ね返る所まで再現される…すごい!
難点は、倒れたまま回転すると、ころころ転がって、どこかへ行ってしまう。
しばらく探しても、見つからない事も…
あとは、どのように回転の強さを減らしてゆくかが問題。
摩擦係数や衝突時の衝撃により、回転を減らして行くとかすると、楽しそう。
どうやるのかは、まだ判らないが…
とりあえずは、衝突時に乱数で回転力を減らしてゆく程度しかできないだろうなあ。
2007/04/11
土地の購入をしてしまった
2007/04/11
ひぐまJAPAN
SapporoのひぐまJAPANという所に行った。
2~3日前まで、看板しかなかったけど、見る間にきれいな建物がたった。
楽しい事ができるようになると良いなあ。期待。

/sapporo/118/66/0/
2~3日前まで、看板しかなかったけど、見る間にきれいな建物がたった。
楽しい事ができるようになると良いなあ。期待。

/sapporo/118/66/0/
2007/04/10
Tinyアバター
2007/04/07
2007/04/06
スクリプトでこまを倒す2
こまを倒す時の方法。
結局、llSetRotは、rotationの中身を理解しなくても使えるように、座標系の変換関数が用意されている。
通常のVectorの値をセットして、llEuler2Rotでrotationに変換し、それをllSetRotの引数にすれば良いのであった。
rotation yoko = llEuler2Rot(<-PI_BY_TWO,0,0>); // 目的の角度をrotationに変換
llSetRot(yoko); //倒れる
1行目で、<-PI_BY_TWO, 0, 0>と、X軸を中心に-90度のみ回転とした。
PI_BY_TWOは、π(円周率割る2)で、単位がラジアン。
ラジアンは、その角度の時の円周(半径1の時)をあらわしている。
なので、360度は、円の円周になり、直径x3.14(PI) = 2 x PI という事になり、90度はPI/2という事になる。
DEG_TO_RADというのが用意されていて、Vectorに掛けると、Euler角になる。
<-PI_BY_TWO, 0, 0>
は、
<-90, 0, 0> * DEG_TO_RAD
と同じ事になる。これらは、変数への代入なしでも書けるので、1行で書くと、以下となる。
llSetRot(llEuler2Rot(<-90,0,0>*DEG_TO_RAD); //X軸を中心に-90度倒す
ちなみに、+と-は、右手を親指を伸ばした状態で握り、親指をXの正方向に向けた時、人差し指他が巻いている方向が+との事だった。
結局、llSetRotは、rotationの中身を理解しなくても使えるように、座標系の変換関数が用意されている。
通常のVectorの値をセットして、llEuler2Rotでrotationに変換し、それをllSetRotの引数にすれば良いのであった。
rotation yoko = llEuler2Rot(<-PI_BY_TWO,0,0>); // 目的の角度をrotationに変換
llSetRot(yoko); //倒れる
1行目で、<-PI_BY_TWO, 0, 0>と、X軸を中心に-90度のみ回転とした。
PI_BY_TWOは、π(円周率割る2)で、単位がラジアン。
ラジアンは、その角度の時の円周(半径1の時)をあらわしている。
なので、360度は、円の円周になり、直径x3.14(PI) = 2 x PI という事になり、90度はPI/2という事になる。
DEG_TO_RADというのが用意されていて、Vectorに掛けると、Euler角になる。
<-PI_BY_TWO, 0, 0>
は、
<-90, 0, 0> * DEG_TO_RAD
と同じ事になる。これらは、変数への代入なしでも書けるので、1行で書くと、以下となる。
llSetRot(llEuler2Rot(<-90,0,0>*DEG_TO_RAD); //X軸を中心に-90度倒す
ちなみに、+と-は、右手を親指を伸ばした状態で握り、親指をXの正方向に向けた時、人差し指他が巻いている方向が+との事だった。
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
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/30
フリーのアバター
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
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
アバターを変えたい
アバターを変えたいという欲求はあるが、まだ、わけがわからない…
http://www.slboutique.com/chipmidnight/
こんなページもあるが…
PSDファイルって…
さっぱりわからん。
こういうさっぱりわからないが、できそうな所が、セカンドライフの面白い所かも。
調査し、試行錯誤し、出来るようになるまでの過程は、何でも楽しい。
http://www.slboutique.com/chipmidnight/
こんなページもあるが…
PSDファイルって…
さっぱりわからん。
こういうさっぱりわからないが、できそうな所が、セカンドライフの面白い所かも。
調査し、試行錯誤し、出来るようになるまでの過程は、何でも楽しい。
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;
}
}
-----------------------
2007/03/25
スキーをした
スキー場に行ってスキーをしました。
よくわかりませんが、スキーを着て、右左するとシュプールを描きます。
/epic conditions ski/13/126/0/
滑ってるうちに、ひっくり返って逆さまになったり、海に落ちたり…

よくわかりませんが、スキーを着て、右左するとシュプールを描きます。
/epic conditions ski/13/126/0/
滑ってるうちに、ひっくり返って逆さまになったり、海に落ちたり…



