2009年3月20日金曜日

スクリプトの話(番外編)〜どのプリムを選ぶか?

昨晩書きました通り、
今 Fanghammer 上空に作っているアヤシイ建物は
ちょっとしたエレベータを設置、
これで上下の階に移動します。
本当は階段の方が趣があるんだろうけれども、
階段は開口部を十分に取らないと
アバターの頭が引っ掛かったりしますし、
その開口部を作ったり、
それだけの空間を確保したりというのが面倒。^^;
つい場所をとらないエレベータにしてしまいます。

エレベータといっても、
ここでは大したことはしてません。
殆どインプレスR&Dから出ている
『セカンドライフで作るリンデンスクリプト入門』からの引き写し。

     *   *   *

vector gopos; // 現在の場所から目標地点までのベクトル
vector aimpos = <54,81,509>; // 目標地点

default {
  state_entry() {
    llSetSitText("Up to 2F"); // パイメニューに表示する内容
    gopos = aimpos - llGetPos();
    llOwnerSay((string)llGetPos()+"-" +
      (string)aimpos+"="+(string)gopos);
    llSitTarget(gopos, ZERO_ROTATION);
  }

  on_rez(integer num) {
    llResetScript();
  }

  changed(integer change) {
    if (change & CHANGED_LINK) {
      key sid = llAvatarOnSitTarget();
      if (sid != NULL_KEY) {
        llUnSit(sid); // 目標地点に着いたら立たせる
      }
    }
  }
}

     *   *   *

エレベータと言っても、
実際には椅子に座らせるのと同じことをやっています。
このスクリプトをエレベータのボタンに仕込めばOKなんですが、
ここで大事なことは、
gopos で示されるローカル座標は、
このボタンになるプリムを
レズした時の向きを元に計算されているということ。
つまり、プリムを回転させたりして向きを変えると、
あらぬ方向に飛んでいってしまいます。><
前に椅子に座らせるのは難しいと書きましたが、
ここでもその問題が出てくるのです。
そこで、このスクリプトを使う時は
絶対にプリムの向きを変えない、という方針でいつもやってます。
そこで、面倒くさがりの僕は、
よくボタンに球体のオブジェクトを使ってました。
球体なら上も下も、右も左もないもんね。^^;

でも、やっぱりエレベータのボタンとしては、
上に行くのか下に行くのか、
方向感のあるボタンの方がいいですね。
というわけで、今回は写真1のように三角形のボタンを設置しました。

090319a.jpg


ここで問題。w
この三角形のプリムはどんなプリムを使ったでしょう?
え? 当然三角柱だろうって?
でも三角柱を普通にレズすると写真2のようになります。
この問題の大前提はプリムの向きを変えないこと。
それではあのボタンの形にもっていくのは無理ですね。
近いのは四角錐ですが、
これは横から見た形が違う。
ボタンは横から見ると長方形をしています。。。

090319b.jpg


というわけで、答えをバラすと
実は今回使ったプリムはブロック、立方体でした。w
四角いのに何故? と疑問に思われる方もあるでしょうが、
実はこれ、「テーパー」というパラメータで変形してあるんです。
「テーパー」は X 方向、または Y 方向に
一方の辺をもう一方の辺より短くするパラメータです。
具体的には写真3を見て頂ければと思いますが、
普通は値が「0」で、ブロックなら一番左の形です。
これを X=0.25 とすると、X 方向の上の辺が25%縮みます。
0.5なら下の辺の半分の長さに、
そして、今回のように1.0とすると
上の辺の長さは「0」となり、三角形となってしまいました。
これに、Y も1.0にすると四角錐になりますね。
更に、マイナスの値を入れると、今度は上の辺はそのままで、
下の辺が短くなっていきます。

090319c.jpg


このように、プリムは変形のパラメータをいじることで、
全く異なった形にすることが可能です。
どう考えても2つ以上組み合わせないとできないような形も、
実はうまく変形すると1つのプリムで実現できたりします。
プリム節約のためにも勿論有用ですが、
今回のように、スクリプトに制限がある場合にも
プリムの変形は効果を発揮します。
みなさんもいろいろ試してみられては?w

P.S. 勿論、ボタンのプリムを回転させたところで、
目標地点までのローカル座標をきちんと計算できれば問題ないんですが、
どうも自分には無理です。
一つの軸に対して回転させると
他の軸の値も連動して変わるようなので、、、><
それで、頭悩ますよりは、向きを変えない、と決めてしまって
プリムの形状をいじった方が簡単なんです。w

No response to “スクリプトの話(番外編)〜どのプリムを選ぶか?”

Leave a Reply