2022/02/12

ベネチア SIM カーニバル

ベネチアSIMでカーニバルが始まりました。
期間は2022年2月12日(土)〜3月1日(火)でリアルのベネチアカーニバルと同じです。

カーニバル期間中は会場のサンマルコ広場でダンスや音楽イベントが何回もあり 広場には特設セールスワゴンがずらっと並びます。(lovemax も出店しています)

初日オープニングにはダンスイベントが開催されました。
広告看板を下げた飛行船も出動しました。(最近ではイベント恒例になってきました)

カーニバルという言葉(日本語では謝肉祭)はラテン語 carnem (肉を) levare (除く)がもとだそうで 断食をする四旬節が始まる灰の水曜日の前夜(なので最終日は火曜)に開かれた肉に別れを告げる祝宴だということです。(wikipedia 謝肉祭)

リアルのベネチアでは1162年から始まって 有名な仮面は 階級制度の厳しい時代でもカーニバルの間は仮面をかぶって違う階級や違う性別の服を着て 匿名のベネチア市民として自由な行動を満喫するのが流行したからだそうです。(wikipedia ヴェネツィア・カーニバル)

2022/02/05

2プリムでリンクの蓋を開閉

今までマーケットプレイスだけで売ってた宝箱を ベネチアのお店にも置くことにしたので この機会に今まで放置してた 2プリム蓋問題 を解決することにしました。

問題というのは 2プリムでできている宝箱の蓋をいっぺんに開閉するのに 今までは箱と蓋を別々のオブジェクトに(参照: リンクなしでも親子関係)してたのを 一つのオブジェクトでもできるようにする問題です。

千両箱と3億円ケース の蓋は よくあるドアと同じで 1プリムの箱の中心をヒンジにして削れば角度を変えるだけなのでわりと楽です。
でも宝箱の蓋は変形して削った箱(中心をヒンジに→角度だけでOK)と半分の円筒(中心をヒンジにはできない→角度も位置も変更)の組み合わせなのでちょっとめんどう。
なだけでなく角度を変えたり移動するスクリプト: llSetRot(), llSetPos() は 0.2秒停止するという謎なことが起こって そのままだと部品がバラバラに動くことになります。

解決策はスクリプトでも llSetLinkPrimitiveParamsFast() を使うことでした。
Fast と書いてあるだけに止まったりはしないんです!

こんな感じ:

list PrimPosLooks = [ // プリム名, 閉じたローカルの位置,向き, 開いた位置,向き
  "top", <-0.2, 0, 0.15>,<0,0,0>, <-0.2, 0, 0.15>,<0,-60,0>,
  "cap", <0, 0, 0.15>,<90,0,0>, <-0.1, 0, 0.32321>,<90,0,60>
]; // 位置:<x,y,z> メートル, 向き:<x,y,z> 度で表した回転

integer setPosRot(integer open)
{ // open:FALSE/0 →閉じる, TRUE/1 →開く
  string name = llGetObjectName(); // プリムの名前
  integer i = llListFindList(PrimPosLooks,[name]); //
  if (i<0 || LinkNumber<2) return -1; // もし何か間違ってたら脱出
  i = i+1 + open*2; // データの場所を計算
  vector pos = llList2Vector(PrimPosLooks,i); // 位置
  vector look = llList2Vector(PrimPosLooks,i+1); // 向き
  rotation rot = llEuler2Rot(look*DEG_TO_RAD); // 回転
  llSetLinkPrimitiveParamsFast(LinkNumber, // リンク番号
    [PRIM_POS_LOCAL,pos, PRIM_ROT_LOCAL,rot]); // 位置と回転
  return open;
}

宝箱はベネチア店の階段を上がった最上階 鉄格子の中にあります(といっても誰でも開けられる鉄格子なので雰囲気だけ)。

2022/01/30

簡単テレポの設定も簡単に

何年か前に作った簡単テレポ/ジャンプ(参照:階段を昇らずにジャンプ)ですが タッチだけでジャンプ先を設定するには 体の向きなどちょっとしたコツがいります。
それに離れた場所を設定するにはタッチは向いてません。(300メートル先まで設定はできるのですが…)

そこでプリムの説明のところに行先データを書いておけば それを読んで設定できるというスクリプトを書きました。

スクリプトの中に直接データを書くのは もし間違えたとき何が起こるかわからないので ちょっとどきどきですが それよりはずっと気楽に書けます。
説明に書き込むにはプリムの編集権限も必要なので 知らない間に誰かが間違って変えてしまう心配もないでしょう。

読む部分のスクリプトはこちら:

list getDestination(string data)
{ // data: " head : <pos.x, pos.y, pos.z>, look"
  // return [(string)head,(vector)pos,(float)look]
  integer i = llSubStringIndex(data,":"); // ":" がデータを書いてある印
  if (i<0) return [];
  string head = ""; // ":" が先頭(i==0)のとき頭は空
  if (0<i) head = llGetSubString(data,0,i-1); // ":" より前(頭)はデータ以外の説明に
  head = llStringTrim(head,STRING_TRIM); // 前後の空白は取っておく
  string body = llDeleteSubString(data,0,i); // ":" の後ろがデータ
  list info = llParseString2List(body,["<",">",","," "],[]); // 数字の書き方は気楽に
  vector pos = ZERO_VECTOR; // 行先の位置情報
  pos.x = (float)llList2String(info,0); // X座標(東西 メートル)
  pos.y = (float)llList2String(info,1); // Y(南北)
  pos.z = (float)llList2String(info,2); // Z(高さ)
  if (llVecMag(pos)<0.1) return []; // ほとんどゼロ座標だったら行先データではないはず
  float look = (float)llList2String(info,3); // 向き(角度 0度:東, 90度:北)
  return [head,pos,look];
}

写真の遊覧飛行船ドックでは案内看板と乗船デッキへの斜路に同じ仕組みを使ってます。
実際はもう少し複雑ですがそれは省略…(^^)

2022/01/22

繰り返しで説明文を表示

ベネチアSIMにはやはりというかいろんな国の方が来られます。

案内看板の説明が日本語だけだとなにか不親切な感じがします。
国際語の英語はもちろん ここはベネチアなのでイタリア語もほしいところ。
でもいっぺんに表示するとごちゃごちゃしてすっきりしないし 読みたいのは 3ヶ国語全部じゃなくひとつでいいはず。

というわけで 説明文を分けてそれを繰り返しで表示するスクリプトを作りました。
表示が次々変わるので 見た人の気を引く効果もありそうです。

スクリプトはこちら:

// Cycle Text v1.2
list Msgs = [
  "Tocca/Siediti al Porto del Dirigibile Turistico.",
  "Touch/Sit to Airship Sightseeing Port.",
  "タッチ/座って遊覧飛行船の出発地へ"];
float TimeCycle = 7; // 秒ごとに切り替え
integer Stride = 1; // 1度に表示する行数
integer Index = 0;

default {
  state_entry() {
    llSetText("",<1,1,1>,1);
    llSetTimerEvent(TimeCycle);
  }
  timer() {
    list lines = llList2List(Msgs,Index,Index+Stride-1); // 表示する文
    string text = llDumpList2String(lines,"\n"); // 2行以上なら改行でつなぐ
    llSetText(text,<1,1,1>,1); // テキスト表示
    Index += Stride; // 次の表示
    if (llList2String(Msgs,Index)=="") Index = 0; // 終わりなら先頭に戻る
  }
}

表示を1度に何行かまとめて出せるようにもしてあります。
Stride=1 になってますがこれを 2 にすれば2行づつ 4にすれば4行づつというわけです。

2022/01/15

小さくすると頭がつかえる?

ベネチアSIMで遊覧飛行船の準備をしてるとき 売ってる飛行船がそのままでは大きすぎて建物内で圧迫感があるので少し小さくしました。(もともとリサイズ機能つきです)
なかなかかわいくなりましたが ここで問題発生 !
降りるときにどうかすると頭が風船部分につかえて船から出れなくなったりします(TT);;;
風船部分だけファントムにする方法を試しましたが(昔の記事参照: 通り抜けできるプリム)さらに大きな問題が…いきなりランドインパクトが何百もあがってこれだけで SIM に負担がかかりそうなんです !!! 

…そこでどうしたかというと 人が乗ったら飛行船全体をファントムにすることにしました。
ファントムでも人が乗るぶんには何も問題ありません。
降りるときは船体を素通りするので空中にいたら下に落ちますがまあいいことにしましょう。
あとは飛んでるとき建物にぶつかっても船体部分が素通りしてしまいますが 今までちょっとさわっただけで船がひっくり返って大騒ぎ ! だったのがわりと平気になったのでこれもよしとしましょう。(人はファントムにならないのでもちろん素通りしません)

スクリプトはこんな感じ:

default {
  state_entry() {
    llSetPrimitiveParams([PRIM_PHANTOM,FALSE]); // ファントムじゃない
  }
  changed(integer change) {
    if (change & CHANGED_LINK) { // 人の乗り降りでリンクが変わる
      if (llGetNumberOfPrims() != llGetObjectPrimCount(llGetKey())) // 誰か乗ってる
        llSetPrimitiveParams([PRIM_PHANTOM,TRUE]); // ファントムにする
      else llSetTimerEvent(Wait); // 誰も乗ってない しばらく待つ
    }
  }
  timer() {
    llResetScript(); // リセットしてファントムでなくす
  }
}

ここで llGetNumberOfPrims() は座ってるアバターを含めたリンク数 llGetObjectPrimCount() は含まないプリムだけの数 なので比較すれば誰か座ってるかどうかがわかるしかけです。

2022/01/08

遊覧飛行船のテクスチャー

遊覧飛行船のテクスチャーはベネチアSIMのスタッフさんたちが使っているのを使わせていただきました。
これと同じテクスチャーの製品はベネチアのインワールドの売り場の箱にだけ同梱しています。(「MyShip」と「MyShip Shoulder」)
ベネチアSIMに来ていただいたお客様だけの特典です! ^^/

SLurl はこちら:
https://maps.secondlife.com/secondlife/Yumix%20Prada/189/90/22
ベネチアSIMのランディングポイントはリアルト橋にあって お店へはそこから75mです。
遊覧飛行船の案内看板がすぐ近くにあるので そこからおいでください。

2022/01/01

ベネチアSIMにお店を開きました

2022年あけましておめでとうございます。
最近あんまり活動してませんでしたが このたびベネチアSIMにお店を開くことになりました。
SLurl はこちら:
https://maps.secondlife.com/secondlife/Yumix%20Prada/189/90/22
ベネチアSIMのランディングポイントはリアルト橋にあって お店へはそこから運河沿いを海に向かって75m先 写真右下に写ってる建物の中にあります。
例の赤いビームを頼りに散策しながら来られるか または遊覧飛行船の案内看板がすぐ近くにあるので そこから一気においでください。