2022/06/16

看板の縦横調節

イベントの看板はたいてい正方形の画面です。
でも正方形でなくてももちろんOKで 今度のイベント(16日木曜日)では縦が長い看板です。

そこでどんな縦横比の看板でも対応できるようにしました。

看板飛行船の準備は箱を編集して画像を貼ることで(Edit > Texture > Texture)できますが もし看板画面が正方形でない場合には箱の横幅も変えます。(Edit > Object > Size:X)

こうすると飛行船が飛ぶときにさげる看板の縦横比を箱と同じにします。

画面縦横の比率だけが問題なので横幅(X)さえ変えれば箱の高さ(Z)は変えなくてOK!
(…高さを変えると箱の一部が地面に埋まったり逆に浮いたりするので あれ?調整が必要?と悩むはめに…(^^;)…実際にはもちろんこの心配も不要!)

看板の縦横比を調節するスクリプト:

listen(integer ch,string na,key id,string msg)
{
  list info = llParseString2List(msg,[":"],[]);
  string command = llList2String(info,0);
  string data = llList2String(info,1);
  if (command=="XzRatio") { // 縦横比
    float xzratio = (float)data;
    vector size = getSignParams(PRIM_SIZE); // 看板のサイズ
    vector pos = getSignParams(PRIM_POS_LOCAL); // ローカル位置
    pos.z += size.z*0.5; // 看板の上端
    size.x = llSqrt(size.x*size.z*xzratio); // 画面の横幅, 面積は同じ
    size.z = size.x/xzratio; // 画面の高さ
    pos.z -= size.z*0.5; // 看板の中心
    llSetLinkPrimitiveParams(LinkSign,[PRIM_POS_LOCAL,pos,PRIM_SIZE,size]);
  }
}

箱も看板も Xが横で Zが縦です。
スクリプトはイベントが始まる飛行船を出すタイミングで箱の縦横比を調べて Rez した飛行船に伝えます。
飛行船の側ではもとからつけてる看板と面積は同じになるように縦横の長さを変えます。

さげる位置も看板のてっぺんが同じになるように Z 方向の位置を調節しています。

ページ: Airship Go Round Signboard Box: How to Use

2022/06/09

自動で飛ばす飛行船

ベネチアSIM のイベントのとき いつも宣伝看板をさげた飛行船を飛ばしていますが 何度かその時間に来れないことがあったので 事前に用意しておけばその時間に自動で飛ばせるようにしました。
やりかたは:

  1. 専用の箱をイベント会場の近くに置いて
  2. 箱に宣伝用画像を貼れば(Edit > Texture > Texture)準備完了!
    (…準備ができると写真のようにミニ飛行船が出ます)
  3. イベント開始時刻になれば飛行船が自動で飛び始め
  4. 終了時刻で飛行船も箱も消えます

開始と終了時刻はほとんど 22:00-24:00(JST) なのであらかじめ箱の説明のところに書いてあります。
もしも違う時間に開催されるならこれを書き直す(Edit > General > Description)だけでOK!

準備は超簡単なので誰でもできそうです。
イベントスタッフの人に渡しておけば当日 lovemax がいなくても飛行船が飛ばせるのでこれはサボれる!

飛行船を出したり消したりするきっかけを決めるスクリプトはこちら:

integer isNowArrive(integer time)
{ // TRUE: 指定時刻 time <= now < time+Margin に今到達した?
  integer now = getNowMin();
  if (time <= now && now < time+Margin) return TRUE;
  else return FALSE;
}
integer getNowMin()
{ // time: "2022-06-09T00:01:43..." UTC → return 541 JST(+9:00)
  string time = llGetTimestamp(); // UTC 協定世界時
  list info = llParseString2List(time,["T"],[]); // 日付と時刻を分ける
  time = llList2String(info,1); // UTC
  integer now = time2Min(time) + OffsetMin; // 分 JST 日本標準時
  if (28*60 <= now) return now - 24*60; // 28時以降は早朝 4時〜
  else return now;
}
integer time2Min(string time)
{ // time: "01:15:58" → return 75 分; 秒は無視
  list info = llParseString2List(time,[":"],[]);
  integer hour = (integer)llList2String(info,0);
  integer min = (integer)llList2String(info,1);
  if (hour<0) min *= -1; // 時間がマイナスのときは分もマイナス
  return 60 * hour + min;
}

時刻は全部分に換算して比較してます。
現在時刻は llGetTimestamp() で UTC (wikipedia 協定世界時) を調べて x 60 + に JST (wikipedia 日本標準時) オフセットの +9 x 60 を足します。
指定する時刻が真夜中以降の場合は 例えば正規の書き方 "00:30" ではなく "24:30" のように前日から続く深夜の書き方で前後を比べやすくしてます。
(…でも 28時以降はさすがに次の日の早朝 4時〜扱いに…)

ページ: Airship Go Round Signboard Box: How to Use