2009年7月26日日曜日

35cmの謎 - 2つの椅子のスクリプト

2つの椅子をスクリプトを作ってみました。

特に変わった椅子ではありません。ただ、New Script で時々お会いするペンギンさん(ってたくさんいらっしゃるので)のこのエントリが気になったので、2つの椅子のスクリプトを作ってみました。

ひとつは

   1: vector  GSitPos = <0.3, 0.0, 0.56>;
2: vector GSitRot = <0.0, 0.0, 0.0>;
3:
4: default
5: {
6: state_entry() {
7: llSitTarget(GSitPos, llEuler2Rot(DEG_TO_RAD*GSitRot));
8: llSetLinkPrimitiveParams(2, [PRIM_POSITION, GSitPos]); //***
9: }
10: }

LSLのテキストの定番、llSetTargetを使って書いた例です。//***というコメントがついた行(8行目)は、llSetTargetで設定した位置を示すための球状のプリムの位置を示すためのコードです。
そして、もう一つが、

   1: vector  GSitPos = <0.3, 0.0, 0.91>;
2: vector GSitRot = <0.0, 0.0, 0.0>;
3: integer GMyPrimCount;
4:
5: default
6: {
7: state_entry() {
8: GMyPrimCount = llGetNumberOfPrims();
9: llSetLinkPrimitiveParams(GMyPrimCount, [PRIM_POSITION, GSitPos]); //***
10: }
11: changed(integer change){
12: if (change & CHANGED_LINK) {
13: integer nLinkCount = llGetNumberOfPrims();
14: if (GMyPrimCount + 1 == nLinkCount) {
15: llSetLinkPrimitiveParams(nLinkCount, [
16: PRIM_POSITION, GSitPos,
17: PRIM_ROTATION, llEuler2Rot(DEG_TO_RAD*GSitRot)/llGetRot()
18: ]);
19: } else if (GMyPrimCount + 1 < nLinkCount) {
20: llUnSit(llGetLinkKey(nLinkCount));
21: }
22: }
23: }
24: }

こちらになります。このスクリプト中の//***というコメントがついた行(9行目)は、やはりllSetLinkPrimitiveParamsで、座る位置を指定する場所を示すために、球状のプリムをそこに移動させるものなので、動作自体には関係ありません。


この写真が、前者のllSetTargetで座る位置を指定した椅子に座ったときの物で、


こちらが、後者のllSetLinkPrimitiveParamsで、座る位置を指定した時の写真になります。
すぐに分かるのですが、前者と後者で、座る位置の指定のZ座標が、およそ 0.35m異なっているのです。

座るアバターの大きさが、この差に関係しているのかと思ったので、自分のアバターを最大身長と、最小身長にして(うむ、元に戻すのが大変でしたw)確かめてみました。
その結果、大きくなったときと、小さくなったときで、座る位置に非調整が必要(大きくなったときは設定位置を上へ、小さくなったときは設定位置を下へ)という事が分かりましたが、2つのスクリプトの間にずれの差は認められませんでした。

もしかすると、座るアニメーションに関係するのかなと思って、上のスクリプトを以下のように改造して試してみましたが

   1: vector  GSitPos = <0.3, 0.0, 0.56>;
2: vector GSitRot = <0.0, 0.0, 0.0>;
3: key GSitted;
4: string GAnimationName = "stand";
5:
6: stopAllAnimation(key id)
7: {
8: list anms = llGetAnimationList(id);
9: integer i;
10: for (i = 0; i < llGetListLength(anms); i++){
11: llStopAnimation(llList2Key(anms, i));
12: }
13: }
14:
15: default
16: {
17: state_entry() {
18: GSitted = NULL_KEY;
19: llSitTarget(GSitPos, llEuler2Rot(DEG_TO_RAD*GSitRot));
20: llSetLinkPrimitiveParams(2, [PRIM_POSITION, GSitPos]);
21: }
22: changed(integer change){
23: if (change & CHANGED_LINK) {
24: key nowSitted = llAvatarOnSitTarget();
25: if (GSitted != NULL_KEY) {
26: if (nowSitted == NULL_KEY) {
27: llStopAnimation(GAnimationName);
28: GSitted = NULL_KEY;
29: }
30: } else {
31: if (nowSitted != NULL_KEY) {
32: GSitted = nowSitted;
33: llRequestPermissions(GSitted, PERMISSION_TRIGGER_ANIMATION);
34: }
35: }
36: }
37: }
38: run_time_permissions(integer perm) {
39: if (perm & PERMISSION_TRIGGER_ANIMATION) {
40: stopAllAnimation(GSitted);
41: llStartAnimation(GAnimationName);
42: }
43: }
44: }

(もちろん、後者のスクリプトも、同様に改造して)2つを試してみましたが、差はありません。





この差が、何に起因するのかよく分かりませんが、仕様という奴なんでしょうか。

あと1つ不審点がありました。
1つは、2番目のllSetLinkPrimitiveParamsで座る位置を指定するスクリプトの場合、llSitTargetを入れないと、座れないことがあります。これが怪しいところなのですが、椅子を移動したり回転させると座れなくなるような気がしますが、再現性がない。実装がわからないと、これ以上突っ込みようがないので、こんなもんだと理解するしか方法はないようです。

0 件のコメント:

コメントを投稿