ソラマメブログ

2007年05月08日

衝突判定(スクリプト初級第二十三回)

初級スクリプトとして触れておきたい事項も最後となりました。
最後に扱うのはオブジェクトの衝突についてです。

物理オブジェクトを扱いだすと、いろいろな場面で衝突判定をしたりするのですが、通常のオブジェクトにおける衝突判定も実は結構有用です。
例えば以前、センサーを利用した自動ドアを作りました。
あのスクリプトは衝突を用いて書き直すことが可能です。

衝突・・・なんていうと猛スピードで激突するイメージかもしれませんが、lslで言う衝突はもっと軽いものも含みます。
例えばアバターが歩いてきてオブジェクトを踏んだとき、それだけで衝突のイベントが起きるのです。
自動ドアの前にマットを用意しておいて、それを踏んだらドアが開く、という古典的な仕掛けが実現できます。

実際に衝突を使った自動ドアを作ってみましょう。
衝突イベント

衝突イベントには3種類あります。
いや、正確には6種類ですが、まずは基本の3つからで良いでしょう。

  collision_start(integer num_detected){
    // 衝突が始まったときの処理
  }

  collision(integer num_detected){
    // 衝突し続けているときの処理
  }

  collision_end(integer num_detected){
    // 衝突が終わったときの処理
  }

タッチイベントと似ていますね。
実際、それぞれのイベントの意味は3つのタッチイベントと同じです。
通常使うのはcollision_startイベントです。
ぶつかった瞬間に発生するイベントですので、単発的に「ぶつかったとき」の処理をするにはこれを使います。

引数num_detectedは「衝突している数」を意味します。
このあたりもタッチイベントと同様です。
具体的に「誰/何が衝突したのか」「衝突した位置はどこか」「衝突したもののUUIDは何か」などは、先日センサーのときに出てきたDetected系の関数を使って取得します。
例えば衝突したものの名前を得るにはllDetectedName()関数、UUIDを得るにはllDetectedKey()です。

それほど難しくないと思いますので少々余談をします。

これらの衝突イベントは、ファントム・オブジェクトでは通常発生しません。
ファントム・オブジェクトとは、buildツールの「オブジェクト」タグで「ファントム」にチェックが入っているオブジェクトのことです。
そこにあるように見えますが、ぶつかろうとするとスルリと通り抜けてしまうオブジェクトですね。

要するに「幻」であるため、衝突イベントも起こらないようになっているのですが、時にはファントム・オブジェクトでも衝突判定を行いたい場合があります。
例えば目に見えないファントム・オブジェクトを特定位置に配置しておいて、そこを誰かが通ったときに何か仕掛けを動かしたい、なんて時ですね。
その場合は、以下の関数を使います。

  llVolumeDetect(integer detect);

引数にはTRUEかFALSEを指定します。
TRUEを指定すると、ファントム・オブジェクトで衝突イベントが起こるようになります。
FALSEにすると衝突イベントが起こらなくなります。
この関数はルートプリム内のスクリプトで実行しなければなりません。

ただし、この方法で発生するのはcollision_startイベントとcollision_endイベントのみです。
ファントムオブジェクトでcollisionイベントを発生させることはできませんので注意して下さい。

また、ファントムではないオブジェクトでllVolumeDetect関数を使うと、オブジェクトがファントムになってしまいます(^^;

ま、余談はこのくらいで・・・。

衝突版自動ドア

では自動ドアを作ってみましょう。
前に作ったドアを再利用してもいいですが、衝突判定するためのマット等を追加して下さい。
ルートプリムはマットに設定します。

今回はドアの部分だけをスライドさせますが、複数の子プリムをまとめて動かすことはできません。
それぞれをバラバラに動かしますので、あまりプリムの数が多いと動きが怪しくなります。

こんな感じのドアがベストではないでしょうか。

衝突判定(スクリプト初級第二十三回)

ではスクリプトです。
ルートプリムに仕込むメインのスクリプトと、子プリムに仕込むスクリプトの二種類があります。
メインスクリプトは衝突判定を行い、子プリムのスクリプトは開く/閉じる動作を行います。
スクリプト間の通信は、以前使ったllMessageLinked関数を使います。

まずはメインのスクリプトから。

default {
  collision_start(integer num_detected){
    llMessageLinked(LINK_SET, 1, "", NULL_KEY);
  }
}

いいのかこれだけで・・・って感じですが(^^;

ルートプリム(マット部分)に仕込むメインスクリプトは、あくまでも衝突の判定だけを行い、誰かがぶつかったらリンクメッセージを飛ばすだけです。
これだけですとアバターだけでなく、オブジェクトがぶつかっただけでも反応しますので、アバター限定にするのであれば、

default {
  collision_start(integer num_detected){
    if (llDetectedType(0) & AGENT){
      llMessageLinked(LINK_SET, 1, "", NULL_KEY);
    }
  }
}

このようにします。

llDetectedType()関数は衝突したのが何なのか(アバター?オブジェクト?)を取得するための関数です。
これに「& AGENT」と付けてやることで、アバターかどうかの判定ができます。

続いて子プリム(ドア部分)のスクリプトです。

vector close_pos;
vector open_pos = <0.0, 1.0, 0.0>;
integer opened = FALSE;

default{
  state_entry(){
    close_pos = llGetLocalPos();
  }
  
  link_message(integer sender, integer num, string str, key id) {
    if (!opened){
      llSetPos(close_pos + open_pos);
      opened = TRUE;
    }
    llSetTimerEvent(5.0);
  }

  timer() {
    if (opened){
      llSetPos(close_pos);
      opened = FALSE;
    }
    llSetTimerEvent(0.0);
  }
}

こちらも複雑ではないですね。
前に作ったセンサーのドアからの改造です。

センサーのときは、誰かを検知したらオープン、誰も検知しなかったらクローズにしていましたが、今回はリンクメッセージを受け取ったらオープンし、最後にメッセージを受け取ってから5秒たつと自動的にクローズします。

また、ステートエントリー内で「閉まったときの位置」を取得している部分に注意して下さい。
センサーのときはここでllGetPos()を使っていましたが、今回はllGetLocalPos()を使っています。

llGetLocalPos()関数は、子プリムの相対位置を取得するための関数です。
子プリムでllSetPos()を使うときには、相対位置での指定になりますので、close_posに絶対位置を保持してしまうとおかしなことになります。

衝突判定(スクリプト初級第二十三回)

最終回にして説明する基本的なことですが(^^;
相対座標と絶対座標とは、上記のような関係です。

llSetPos()はルートプリムで使うときには絶対座標を使いますが、子プリムで使うときには相対座標です。
今回は子プリムをllSetPos()で動かしますので、相対座標を使わなければなりません。
ですので、絶対座標50,25,21ではなく、相対座標0,0,1のほうを取得しているのです。

今回のポイント

・衝突イベント:
  collision_start(integer num_detected){
    // 衝突が始まったときの処理
  }

  collision(integer num_detected){
    // 衝突し続けているときの処理
  }

  collision_end(integer num_detected){
    // 衝突が終わったときの処理
  }

・絶対座標と相対座標:
関数ルート子プリム
llSetPos絶対座標相対座標
llGetPos絶対座標絶対座標
llGetLocalPos絶対座標相対座標

これだけでもややこしいかもしれませんが、アタッチメントになるとさらに複雑ですw

アタッチメントの場合:
関数ルート子プリム
llSetPosアバターとの相対座標ルートとの相対座標
llGetPosアバターの絶対座標ルートとの相対座標
llGetLocalPosアバターとの相対座標ルートとの相対座標


最後に

初級スクリプト講座はこれにて一旦幕としたいと思います。
スクリプトを学んでいく上で基本的なことは一通り書いてきたつもりですが、おそらく十分ではないことも承知しています。
今後も単発的に「これは書いておいたほうがいいなぁ」と思うことは記事にしていくつもりでいます。

私がこの一連の記事を書いた動機は、多くの人にlslで遊んでいただきたかったからです。
スクリプトを仕込んだ商品を売っている立場としては、ノウハウを書くことはある意味自分の首を絞めることになるのですが、自分の商品が売れる以上に、多くの面白いものがSL内に出現したほうがSL全体にとってプラスであることは言うまでもないことでしょう。
私のつたない記事を読んでスクリプトに親しんだ皆さんが、楽しいアイテムをいろいろと開発して下さったなら、それ以上に嬉しいことはありません。

なるべく詳細な解説を心がけたのは、スクリプトはオープンであるべきだと思っていたからです。
lslの解説本を発行する企画などもあるようですが(あるいはもう出版されたりしているのかな?w)、スクリプトのスキルをオープンなものにしていくのが目的ならば、必ずしも書籍化の必要は無いと思っています。
むしろコメントやメール等で読者さんと直接にコミュニケーションを取れるWebのほうが目的にはかなっているはずです。
そういう意味ではSLをネタにして商売しようとする方々に対する挑戦でもありましたw

私はあくまでもSLはツールに過ぎないと思っています。
lslも同じです。
勝負すべきところは「ツールを使って何を作るか」であって、ツールそのものを売りにするのはリンデンだけで十分ですw
そのリンデンでさえ、クライアントやサーバーのオープン化を進めているのですから、lslの情報もやはりオープンかつフリーであるべきなのです。

そんな気持ちを隠しつつ連載を続けてきましたが、正直な話、毎日これだけの記事を更新するのは非常に大変でした(^^;
続けてこれたのは読者の皆さんの応援があったからこそです。
特に「書籍になってもおかしくない内容だ」「ガイドブックより詳細だ」などの評価にはニンマリしておりましたw

急いで書き散らしたところもありますので、コード等に不備があったり、十分に説明がなされていなかったりした点については深くお詫びいたします。
気づき次第修正していますので(すぐ直せるのもWebの利点ですよね)、おかしな点などありましたらご指摘下さい。
また、質問等もご遠慮なくコメントしてくださって構いません(^^

では、ほぼ一ヶ月にわたってお付き合い下さった読者の皆様に感謝しつつ、これにて初級スクリプトの終わりと致します。
ありがとうございました。



同じカテゴリー(初級スクリプト)の記事画像
カメラ制御(スクリプト初級第二十二回)
センサーを使おう(スクリプト初級第二十回)
HUDを作ろう(スクリプト初級第十六回)
prim間通信(スクリプト初級第十五回)
アニメさせよう(スクリプト初級第十三回)
お金を扱う(初級スクリプト第十一回)
同じカテゴリー(初級スクリプト)の記事
 カメラ制御(スクリプト初級第二十二回) (2007-05-07 14:36)
 デモ商品を作ろう(スクリプト初級第二十一回) (2007-05-02 12:15)
 センサーを使おう(スクリプト初級第二十回) (2007-05-01 12:15)
 ステートのこと(スクリプト初級第十九回) (2007-04-27 12:15)
 rez!(スクリプト初級第十八回) (2007-04-26 12:15)
 音を鳴らそう(スクリプト初級第十七回) (2007-04-25 13:35)
この記事へのコメント
ずっと拝見してました。
日本語の解説があまり無い中で
実用的で分かりやすい講座でとても助かっています。

初級講座終了とのことちょっと残念ですが
これまでの講座とWikiなどを使ってもっと深めていければ
と思っています。
楽しい体験を作り出せるように作品作りに生かしたいと思います。
ありがとうございました。
Posted by SALA at 2007年05月08日 12:34
毎回読ませていただいてました^^
ほんんとうにお疲れ様でした、そしてありがとうです
この記事のおかげでLSLが楽しくてしょうがないですw
スクリプトも勉強させてもらいましたが、なによりもMizさんような方を
見習ってSLやっていきたいですねー
Posted by Kei Rachmil at 2007年05月08日 17:11
今まで探していた日本語のLSLの情報のなかでは一番わかりやすく具体的でした。・・・このサイトの記事を読んだあと、今までなかなか理解できなかったほかのサイトの記事もの意味も幾らかわかるようになってきました^^ 

何か楽しいものを色々LSLで表現できたらと思います。

まだまだこのサイトの情報はチェックします。応援しています頑張ってください!
Posted by MK at 2007年05月08日 17:41
全部をまだ読みきれてはいないのですが、楽しみながら
読み進めてくることができました。読みやすく、わかりやすい
記事に感謝します。ありがとうございました。
Posted by Tak Nishi at 2007年05月08日 22:04
Mizさん,おつかれさまでした。
今なかなかSL内で自分の製作時間がとれずにいて,LSLから遠ざかってしまってます(泣)後日あらためてじっくり読ませていただきます。
ありがとうございました。
Posted by のてす at 2007年05月09日 11:57
Mizさん、はじめまして。
以前から記事をよく参考にさせていただいています。
LSLについて日本語で書かれている記事はとても助かります。
英語のリファレンスはよくわからないことが多いのです(苦笑)
関数・イベント一覧が日本語で見られるだけで大助かりしています。

それと、僕も楽器が好きです!
Mizさんの事はMizさんの楽器から知りました。
楽器、またいつか使わせていただこうと思ってます。

これからも頑張ってください。応援しています!
Posted by Noki Kamachi at 2007年05月09日 13:56
皆様コメントありがとうございます。

>SALAさん
ひとまず終了としましたが、説明が不足している部分も多いので不定期的にまた記事は書こうと思います。
質問等あったらご遠慮なくコメント下さい(^^

>Kei Rachmilさん
lslが楽しいと思えるようになったとは非常に嬉しい話です(><
つたない記事でしたが、役に立ったようで何よりです。

>MKさん
最初から全てを理解するのはなかなか大変ですので、ちょっとずつでも理解を深めていくのが良いと思います(^^
また記事書きますのでよろしくどうぞ~。

>Tak Nishiさん
急いで書いたところもあったりしますので、記事修正等も入るかと思います(^^;
読んでて「?」なところがあれば指摘していただけるとありがたいです~。

>のてすさん
何かとのてすさんもお忙しいですから(^^;
何かの折にでも記事が参考になれば良いのですが。

>Noki Kamachiさん
一覧は自分でも必要だったので頑張って作ってみましたw
楽器使って下さるのも嬉しいです(^^
ありがとうございます~。
Posted by Miz at 2007年05月09日 16:34
Mizさん、おつかれさま&ありがとうございました。
まさに、Mizさんの仰るとおりです。

>SLをネタにして商売しようとする方々に対する挑戦でもありましたw

ここ、すごくかっこいいです!!
なかなかチャレンジできることではありません。天晴れ!!
今後もここちょくちょく見にきますので更新頑張ってください!!
影ながら応援しております<(_ _)>
Posted by porsche at 2007年05月09日 22:56
初級スクリプト講座全部読みました^^。
大変勉強になりました。

ぼくも何か作ってみます!。
Posted by もに at 2007年05月10日 07:31
>porscheさん

「無料で楽しみたい」という方も多い中、lslだけは書籍を買わないとよくわからないという状況にはしたくなかったのです。
lslのハードルが少しでも下がればよいのですが。

>もにさん

ありがとうございました。
今後も不定期にスクリプトの記事は書くつもりですので、よろしくお願いいたします(^^
Posted by Miz at 2007年05月10日 09:50
ご多忙な中、数々お世話になり大変ありがとうございました! まだわからないことが多いので、初級編何度も繰り返し拝見させていただきます。
Mizさんの姿勢見習いたいと思います!私は本当に感動しました。

 一旦 お疲れ様でした^^。
Posted by p_suke at 2007年05月10日 10:52
>p_sukeさん

なんだかんだ言って、私はSLが好きですから、SLに面白いものがいろいろ登場するのが嬉しいだけです(^^
たまたまlslについては書けるので書きましたが、buildやアニメーションなんかも説明できたらしたいところです。
・・・説明できるほどのスキルがないんですけどね(^^;
Posted by Miz at 2007年05月10日 11:55
こんにちは!
スクリプトでいろいろ作ろうかと思って、こちらの説明をよく読んでいました。
プログラミングの初心者を対象にする説明はわかりやすく、多くのエネルギーが必要だったかと思いました・・。
所々にある問題解決の考え方が特に参考になりました。。
また、宜しくお願い致します!
Posted by Ichioka Jun at 2007年05月12日 17:29
いつか自転車を作りたいと思っています。
まだ全然できませんが、具体的に詳しく書いてあることに驚きと感謝しています。

これから第一回から少しづつ勉強したいと思います。
Posted by ls初心者 at 2007年05月15日 18:34
>Ichioka Junさん

考え方が参考になったのはとても嬉しいです(^^
極論してしまうと、文法や関数の使い方はリファレンスを見ればわかりますので、考え方がわかるかどうかでプログラムが組めるかどうかが分かれると言ってもいいところですから。

>ls初心者さん

自転車作成頑張ってください(^^
「ビークル(乗り物)」として作るのでなければ、今まで紹介したスクリプトを駆使して自転車を作ることは不可能ではありません。
(llGetAnimationという関数の使い方がミソです)
Posted by Miz at 2007年05月15日 18:51
リンデンの人が作ったという乗り物のスクリプトを見つけてきて、乗り物にチャレンジしています。

llStartAnimation("motorcycle_sit")というところのmotorcycle_sitというデフォルトのアニメーションを変えられないかなあと模索しています。

ビークル(乗り物)として作るのは難しいということですが、ちょっとがんばってみます(^^)

llGetAnimationというのも調べてみます。

ありがとうございます。
Posted by at 2007年05月22日 20:14
上の投稿名前書き忘れました。すいません。
ls初心者です。
Posted by ls初心者さん at 2007年05月22日 20:18
Mizさん、ほんとに役に立つ丁寧なご説明ありがとうございます。
さぞかし大変な作業だったことと思います。
今度は自動ドアを作りたくて、こちらの最後の初級編を参考にさせてもらいました。が・・・
私はまだ始めたばかりですので、最初から順をおって読ませていただくべきでした。
スクリプト入れてみましたが、動いてくれないので、スクリプトの理解ということが不足しているなぁ と感じました。
Mizさんは、その点を考えて書いてくださっていますから、理解できるまで順に何度も読み直しながら理解を深めていこうと思っています。
ほんとにすばらしい教科書だと思います。
これから頑張って理解していきたいと思います。
Posted by 初音 at 2007年05月23日 02:20
>ls初心者さん

アニメーションの変更はできるとは思いますが、自転車の場合はちょっと工夫がいるかもしれませんね。
バイクは停止中も走行中もまたがったポーズのままでOKかもしれませんが、自転車となると、停止中は足をついて、走行中はペダルを漕ぐようにしないといけないでしょうし。

乗り物を1から作るのは難しいですが、サンプルを改造する形であれば、比較的簡単に出来るかと思います。

llGetAnimationを使った方法は、自転車をアタッチメントとして作成し、歩行中には漕ぐアニメーション、停止中は足をついたアニメーションを再生するだけの仕組みです。
llGetAnimationを使うと、アバターの現在の基本アニメーション(stand,sit,walk等)を調べることができますので、例えばwalkだったらペダルを漕ぐアニメーションを実行する・・・のようなことができます。

AO(アニメーションオーバーライド)の手法です。

> 初音さん

皆さんからの質問をいただくと、説明が足りなかったと思うところや、別途詳しく書くべきだと思うところがいろいろと出てきます。
そう言う意味ではまだまだ追加しなくてはいけないのでしょうが、ちょっと今時間をとれずにいます(^^;
追々、またスクリプトについては追加して書きますねぇ。
Posted by Miz at 2007年05月23日 10:41
お忙しい中、お返事コメントありがとうございます。
スクリプト編の追加は望むところですが、ご無理のない様よろしくお願いします。
それまでには基礎を理解しなければ!
あ、スクリプト初級編は、第4回目からしか表示されていないのですね。
1回目から読ませていただきたいと思っていましたが、とても残念です。
というか、私がまた探しきれてないのかもしれませんねぇ。
とにかく、椅子を作るところから実演実習にチャレンジしようと思っています。
Posted by 初音 at 2007年05月24日 10:02
> 初音さん

blogの左側のメニュー「カテゴリ」から「初級スクリプト(23)」を選んでいただいて、表示されるページの一番下に、「次のページへ」というのがあるので、それをクリックすると一回~三回の記事も見れます~。
Posted by Miz at 2007年05月24日 10:09
うわ!ほんとだ。ありました。読めました!
いつもすいません。私の未熟さでMizさんにお手間をとらせていますね。
では、1回目からしっかり練習を積んで、スクリプトの理解に努めたいと思います。
本当にありがとうございました!
Posted by 初音 at 2007年05月24日 14:04
いつも頭からつま先まで、なめるように参考にさせていただいております!
大変わかりやすく、どんどん活用させていただいているのですが
今回の衝突判定について、どうしても理由が分からない点があり
コメントをつけさせていただきました。

通常通りの衝撃判定は問題なくスムーズに動作したのですが
ここでいうルートプリムと子プリムを訳あって離れて設置しています。
(リンクはしています)
ルートプリムでの衝撃判定は確かに発生するのですが、なぜか子プリムでも反応してしまうのです。
リンクした時点で、リンクプリム全体に、衝撃判定スクリプトは適用されてしまうのでしょうか?

仕様ならば仕方ないのですが、子プリムには出来れば反応させたくありません。
不躾ではございますが、助言などいただけましたら幸いです。
Posted by 小姫 at 2007年06月16日 19:01
>小姫さん

こんにちは。
確かに、リンクされたオブジェクトでの衝突イベントは、子にぶつかっても親のほうでイベントが発生します。

子primの衝突を無視したい場合は、子primに空っぽの衝突イベントを入れてやれば、親primにイベントが伝達されなくなります。

あるいは、親のスクリプトのほうで、衝突イベント内にて、
llDetectedLinkNumber関数を使うと、「衝突が発生したprimのリンクナンバー」を得ることができます。
リンクオブジェクトの親primのリンクナンバーは1なので、

collision_start(integer num_detected){
 if (llDetectedLinkNumber(0) == 1){
  // 親primにぶつかったときの処理
 }else{
  // 子primにぶつかったときの処理
 }
}

こんなふうにして判定することも可能です。
Posted by Miz at 2007年06月18日 12:23
こんにちわ。コメントありがとうございました!
早速試してみたいと思います。
お忙しいところ、ご丁寧に本当にありがとうございました。
Posted by 小姫 at 2007年06月18日 19:04
いつも拝見させていただいています^^

さて衝突判定のスクリ活用させて頂いているのですが、出来ればこれにグループでのロックをかけれるようにしたいのですが・・・。

回転ドアに衝突判定+開いているときにファントム化する+開閉時に音を出すのを組み合わせるところまでは出来たのですが、タッチしてロックをかけるのが、なかなかうまくいきません。

ロックが掛かるようになると、ドアの開閉が出来なくなったり、開閉が出来るようになると、ロックが掛からなかったりで^^;;

また、ロックシステムのみをモジュール化することも可能でしょうか?

LSL初心者なので少しご教授頂ければ幸いです。
よろしくお願い致しますm(_ _)m
Posted by Wedge Rives at 2008年02月26日 14:19
>Wedge Rivesさん

えーと、では私が敬愛してやまないSeagel長老方式でやってみますか。
複雑なことをいっぺんにやろうとするとなかなか難しいので、段階を追って少しずつ機能を実現していくやり方です。

まずは
回転ドアに衝突判定+開いているときにファントム化する+開閉時に音を出す
というところまで出来ているということなので、ロック状態を管理するための変数を一つ用意しましょう。

integer型で、TRUEのときはアンロック、FALSEのときはロック、のように決めます。
スクリプトの最初のほうで、
integer lock=TRUE; // 初期状態はアンロック
のように一行追加します。

変数が用意できたら、次には変数lockがFALSEのときだけ、ドアが開くようにしてみて下さい。
衝突判定を使っているということなので、
collision_start(integer num_detected){
 if(lock){
   // 省略
 }
}
collision_startイベントの中身をすっぽりif文で囲ってしまえば、lockがTRUEのときだけ実行されるようになりますね。

これが出来たら、今度は変数lockの値を書き換える仕組みを作ります。
グループロックということは、グループメンバーがタッチしたらロック/アンロックということでしょうか。
「鍵をかける」の記事にのってるのとはちょっと違うコードを紹介しておきます。

touch_start(integer total_number){
if (llSameGroup(llDetectedKey(0)) ) {
// オブジェクトと同じグループの人がタッチした場合の処理
  lock = !lock;
}
}

これでタッチするたびにlockの値はTRUE/FALSEと交互に切り替わります。

ロックのモジュール化ですが、上に示した通り、仕組みはあまり複雑ではないため、モジュールには向きません。
むしろモジュールにすると無駄に複雑になるんじゃないかと思います。

以上でヒントになりますでしょうか。
Posted by Miz at 2008年02月27日 10:38
ありがとうございます^^

ちょっと忙しくて中々LSLいじる暇がなくなってしまって^^;

時間を見つけてトライしてみます。

出来たらまた報告しますね^^
ありがとうございました!
Posted by Wedge Rives at 2008年03月12日 03:36
 このスクリプトで、ドアの開閉スピードを変更できる様にできないですか?
Posted by Backard Wylie at 2008年03月14日 15:28
>Backard Wylieさん

オブジェクトの設定には物理と非物理がありますが、通常、ドアに使うのは非物理オブジェクトです。
残念なことに、非物理オブジェクトは移動速度の設定は出来ない仕様になっています(全て一瞬で指定した位置に移動します)。

やるとすると、例えば1cmずつの距離を何度も繰り返しちょっとずつ動かす、というような処理になりますが、どうしてもカクカクした動きになってしまいます。

スムーズに動いているように見せる裏技もあるにはあるんですが・・・自由に速度設定、となると非常に難しいですね(^^;

ということで、あくまでもカクカクした動きであれば実現は可能です。
Posted by Miz at 2008年03月14日 16:00
LSLについて、全く知識がなかったのですが、第一回から第二十三回までプリントして読みました。
LSLの概要が、把握出来ました。
いくつかのスクリプトは、実際に自分で記述し、SL内で使っています。
ありがとう御座いました。
Posted by hyakuji at 2011年01月31日 11:27
 スクリプトの解説いいですね^^
物作りする上で助かります。
今回のスクリプトは、
時々サンドボックスでわざと
ぶつかって来る人とかいる
(過去に知り合いがそういう類ので
私の目の前で海に落とされました;;)ので、
そういった衝突悪用者対策に
使わせて頂こうかと思ってます^^;

例:体当たりしようとすると
  ぶつかる少し手前で軽く弾き返して(1mとか)
  「Don't tackle me(私にタックルするな)」
  と警告します。
  それでも体当たりを繰り返した場合は
  距離と高さが増加します。
…見たいな感じですね^^;
Posted by Luz at 2011年12月13日 17:50
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。