仕様

セカンドライフのプリムの当たり判定の検証

投稿日: 更新日:


こんにちは!

昨日から引き続き、「セカンドライフ技術系 Advent Calendar 2016」です!

すみません。
昨日の記事は、役に立つ情報もあったかもしれませんが、
今回は、テクニック系と違い、前々から気になっていたことを検証する……といった内容となります。
なんかすごいの来る!と期待していた方はスミマセン。(いないと思われますが)

というわけで、

あんまり面白いものではないかもしれませんが、
調査結果の報告というわけで、話していきます……。


はじめに

昨年に、当たり判定の記事を書きました。
セカンドライフでメッシュに物理形状を設定しよう1

今回は、その記事のさらに「実像の種類」について気になったことを確認していきたいと思います。
最初に少し解説しますが、より理解を深めたい方は前回の記事から読むことをお勧めします。

「実像の種類」というのはオブジェクトの設定から選べるものです。
実像というのは、当たり判定用に用いるオブジェクトです。

gui_jituzo_1 → gui_jituzo_2

ここで実像を「なし」「プリム」「凸状の外殻構造」の3種類選べます。
「なし」にした場合は、当たり判定用のオブジェクトを用意しないということになります。

ここで「プリム」「凸状の外殻構造」の違いについて説明するために、
3次元だと書きにくいので、2次元で考えたいと思います。

atari_hazimeni_1
2枚の壁が90度の垂直であることとします。

atari_hazimeni_2
実像の種類を「凸状の外殻構造」にすると、
黄色の囲んだ部分のように当たり判定が生まれます。
※中身すべてにすべて当たり判定を持つことになります。

atari_hazimeni_3
実像の種類を「プリム」にすると、
そのプリムそのものが1枚の壁のように当たり判定を持ちます。
※中身というものは存在しません。


実像の種類「プリム」の疑問

ここで、私の中では素朴な疑問が生まれました。
当たり判定の計算方法により、アバターが透けることがないのかということです。

たまーに、なぜかよくわからないですが、壁の中に入って閉じ込められることありませんか。
それが、このこの設定によるものなのかなーと、疑問に思ったわけです。

セカンドライフの実際の当たり判定のアルゴリズムについては知らないので少し、推測した話となります。
まず、当たり判定といえば、レイと3角ポリゴンとの衝突の検出※が有名です。
そこで、これをまず使用していると仮定します。
(※アルゴリズム、計算方法については、「はじめての3Dゲーム開発」)

そして、もしこのようなアルゴリズムを使って単純に実装している場合、
つまり、1本のレイを飛ばすような当たり判定を使っているのであれば、
次のような現象が起きるのでは……と思いつきます。

atari_nazo_1
壁1と壁2が90度で交わっているとします。

atari_nazo_2
ここで Ray1 を飛ばします。
つまりアバターが壁1に向かって斜めに突進した感じです。

atari_nazo_3
Ray1は、壁1と壁2の2種類に当たり判定チェックを行います。
その結果、壁1との衝突を検知することができます。
そして、めり込まないように、斜めの成分だけを抜き出します。

atari_nazo_4
次に、壁1との衝突点からRay2を飛ばします。
ここで、問題なのですが、Ray2が壁2との当たり判定を正しく行えるかという謎です。

普通は壁1と壁2は接続されているはずなので、
Ray2は壁2と衝突するはずですが、
実際は壁1と壁2は、別のポリゴンとして管理しており、
これらのポリゴンの位置は、実数による誤差の関係上、微妙に隙間が空いているはずなのです。

1本のレイを使用した単純な当たり判定ならば、上記のような問題は起きるのですが、
もちろん、レイを複数とばす。あるいは、そもそも球とポリゴンとの当たり判定を使用するなど
いろいろな工夫を行っていれば、このようなことになりません。
なので、有名なセカンドライフであれば、すり抜けることはおそらくないはずですが。

というわけで、前置きがすごく長くはありましたが、
当たり判定用のプリム=壁のプリムを作成して、
衝突した場合どうなるか検証するのが、この記事の目的となります!


すり抜けの検証

次のような壁(1辺が10m)を作成して、
atari_test_1

下記のように10分間壁に向かって当たり続けて、すりぬけるか確認します。
atari_test2

ビューアは2種類で確認しました。
公式ビューア(v4.1.2.321518)
Catznipビューア(R10.0)の両方で確認しました。

元となるメッシュデータについては、頂点を共有しないメッシュと、
共有するメッシュの2種類について確認。

また、当たり判定のデータは、dae情報で直接設定する方法と、
表示用メッシュから自動生成する方法の2種類を試しました。

それで早速、結果なのですが、

.
..

なんと

.
..

なんとッ!

.
..

すり抜けませんでした!

まあ、そうですよねー。
期待していた方?はスミマセンでした。

ちなみにさらに検証していったのですが、
隙間がわずかにあってもすり抜けませんでした。

どの程度の隙間からすり抜けるようになるのか気になる点ではありますが、
まずは、接続された面であれば、当たり判定を「プリム」にしていても
問題ないということは確実ということが分かり、安心しました。

たまーにすり抜けるのは、
たぶん、幽霊の仕業か本当に実像的にスキマがあるのでしょう。きっと……


一応、これで2日間にわたる記事は終わりです。
ですが!まだまだ12月が始まったばかりです!

ではみなさま!
セカンドライフ技術系 Advent Calendar 2016」を楽しんでいきましょう!

.
..

.
..

.
..

オマケ

私は、Advent Calendar以外にも普段気が向いたときに、セカンドライフ系の記事をかいております。
その中で、私としてヨイデキな記事をいくつか紹介します。(宣伝デス)

2016年4月21日 セカンドライフのスカイボックスに太陽の光を!
シンプルながらも、知っておくと良いテクニック!

2014年12月29日 セカンドライフの関数逆引きメモ
セカンドライフにはどういった機能があるのか、逆引きをみて一通り覚えておこう!

2014年12月12日 セカンドライフでアニメーション
セカンドライフでアニメーションを作る方法!

OculusRift CV1 が届いた(予約~FedEx配送~セットアップ)

投稿日: 更新日:


こんにてゃ!

以前から欲しかった OculusRift CV1 が本日 2016/5/14 に届きました。
欲しかった経緯を知りたい物好きな方は、2013年の「プロジェクタが欲しい」を参照してください。
oculus_1
横 45.5cm、奥行き 22.5cm、高さ 38.0cm の段ボールの中に、
上記の横 39.5cm、奥行き 17.0cm、高さ 31.0cm の箱が入ってました。
自宅に宅配ボックスがある方は、入るかどうか参考にしてください。


予約してから届くまで

さて、少し購入時からの経緯について話します。
OculusRift は予約開始が 2016/1/7 1:00 からなのですが、2016/1/7 1:08 に注文できました。
注文時は、住所を英語で設定できたのですが、あとで日本語に自動で変わりました。
そのとき、住所が誤った住所になっていたので修正しようとしたのですが、エラーで修正できず。
その後、サポートに修正できないことを伝えたらシステム直したよ!って連絡が来たので無事変更できました。

注文番号は 613000027XXXXX で、当初は3月末に届く予定でした。
しかし、何か問題があったようで、2016/4/2 に注文は延期と公式発表がありました。
この時点で不手際の送料1万円は無料となったので、まあよかったのかなと思います。
お届け日は、 2016/4/12 に発表され、出荷予定日が 5/2 – 5/12 と判明しました。
oc_1

2ちゃんねるの OculusRift スレッド を覗いていたのですが、
早く届いているという噂がありました。
真相はたしかではありませんが、5/2 – 5/12 の人は、5月初頭に届いたという話です。
私の場合は、4/28 に Order Status が Processing for Shipping にステータスが変わったきり、
予定日を過ぎた 5/7 になってもクレジットカードの引き落としがありませんでした。
HTC Vive でクレジットカードの引き落とし失敗の問題があったため、
すこし、心配となりサポートに連絡をしました。
連絡としては、問題ないよ!発送するよ!ということでした。

5/9 についに発送と引き落としが行われました。
oc_2
注文は、FedEx が配送するため、上の番号を入力することで配送状況がわかります。
FedExの注文サイトでは、お届け予定日が「2016/5/13 ~ 18:00」とあり、
この場合は2016/5/13(金)の日の中で、18:00までに届くという意味です。
18:00に届くというわけではないので注意です。
従って、もし受け取るのであれば、5/13は届くまで家にいる必要があります。

FedEx Tracking を確認すると、特別取扱セクション 平日配達 と書いてありまして
不在の金曜日をのがすと月曜日になるのかなと(月曜日も不在ですが)思ったのですが、
カスタマーサービスに連絡したところ、土曜日の午前中にすることができました。
土曜日などの営業時間外の配達の場合は、配送業者に委託することになります。
今回は日通航空に委託されましたが、西濃運輸もあるらしいです。

カスタマーサービスは、
平日なら 8:00 – 20:00 までフリーダイヤルを利用することができます。
電話がつながると、プッシュホン・サービスとなり、最初はボタンを押す必要があります。
私は 19:00 過ぎに電話をかけたのですが、混み合っており繋がるまで10分間ぐらいかかりました。
繋がらないからといって、電話を切ると、順番がリセットされるので気を付けてください。

FedExの注文サイトのお届け予定日で受け取れないことが分かれば、
お届け予定日の前日までにカスタマーサービスで配達の相談をしたほうがいいかと思います。
なぜなら、相談しなければ結局、お届け予定日で不在となってしまい、FedExも配達損となってしまうからです。
不在となれば、結局再配達で電話をする必要があるため、届日がさらに遅くなってしまいます。

今回、Oculus とは2回サポートで連絡しましたが、両方の対応とも特に問題はありませんでした。
FedEx も今回初体験でした。国内の配送業者と違って電話で基本やり取りというのが斬新でしたが、
無事、配達日を指定できて、土曜日に配達できたので良かったと思います。

長くなりましたが前置きは終わりにしたいと思います。


箱の開封からセットアップ

すでにガジェットニュース的なサイトでも写真が公開されています。

中を開けるとこんな感じです。
oculus_2
かなり丁寧な箱に、綺麗におさまっています。

oculus_3
噂の有線xboxコントローラはこちらに入ってました。
ただ今回は、PS3ワイヤレスコントローラ
ScpServer+ PLANEX Bluetooth USBアダプター で接続しているため、このコントローラーは使いません。

中のものを取り出してからセットアップに入ります。
セットアップ自体は、「Oculus Rift Setup」から
OculusSetup.exeをダウンロードすることから始まります。

セットアップの順序自体は、ITmedia PC USER
「Oculus Rift」をセットアップしてVR世界へ旅立ってみた 』を参考にすればいいですが、
違う個所や注意点があったので書いておきます。

USBケーブルやHDMIケーブルを接続せずにセットアップ実行

注意として、全て未接続の状態でセットアップを進めてください。
セットアップウィザードの途中で、接続してくれとアナウンスがあります。

2本のUSBケーブルについて

今回、センサーカメラと、HMDの本体とで、USB3.0 の接続が2本必要となります。
場合によっては、PCに USB3.0 が 1 つしかない場合もあると思いますが、
USB3.0 ハブを使っても問題ありません。

途中でユーザーアカウントの作成を行う必要がある

進めていくとアカウントでログインしてくれという画面がでます。
ない場合は作りますが、このアカウントを今後 Oculus Home 使用していくことになります。
Oculus Home は、Steamのような感じで、OculusRift 向けのゲームが公開される場です。
また、アカウント同士でフレンド登録することもできるようです。
インストール後に、アカウントで本名をどこまで公開するかなどの設定ができるので、
本名ばれしたくない方は、設定で自分オンリーにしておきましょう。

Oculus Remote が接続できない……?

これは完全に私の不注意なのですが、
ウィザードを進めていくと、Oculus Remote の認識画面になります。
Oculus Remote は電池※のストッパーを抜いて、通電が始まりますが、これだけでは、ペアリングはできません。
ホイールの真ん中の大きなボタンをペアリングできるまで押し続けなければいけません。
なお、ペアリングがもしできなかったとしても、後で設定が可能です。
※電池は CR2032 ですが、最初から入っています。

身長の入力画面について

ここで入力するのは、OculusRiftをつけている最中での身長なので、立って設定する必要があります。
ここで設定することで、「OculusRiftと地面との距離」が分かり、
「OculusRiftとセンサーと距離」、「センサーと地面との距離」も内部で計算されます。

デモが始まらない……?

「Oculus Rift」をセットアップしてVR世界へ旅立ってみた 』では、
> セットアップが終わると白い仮想空間の部屋に誘われ、最後の儀式が始まります。
> といってもこれは純粋なVRデモで、「Oculus DREAMDECK」と呼ばれる
> VR体験チュートリアル用アプリケーションです。
とあり、「Oculus DREAMDECK」が始まるとあるのですが、始まりませんでした。
もしかしたら、わたしが決定ボタンで飛ばしてしまったのかもしれませんが。
というわけで、私の場合なのですが Oculus Home から
「Oculus DREAMDECK」をダウンロードしてインストールしました。
ダウンロードはHMDを被ったままできるのですが、インストールはPC画面で行う必要があるので注意です。


いったんここまでで、第1弾のOculusRift記事は終わりです。

最後に感想をすこしだけ書きます。
Oculus DREAMDECK を体験したのですが本当に世界に入れたみたいでした。
デモ中は、ずっと立って体験していました。
本当に世界に入れたようで、キョロキョロしてたので疲れました。
センサーは机の上に置いていますが、後ろ向いても、
床に座ってもトラッキングされており、疲れた時は座って体験したりもしてました。

ちなみに座って、そのまま後ろにゆっくり倒れて仰向けに寝転がっても大丈夫でした。
あとから分かったのですが、センサーカメラが優秀で、
考慮した位置に配置すればかなり広範囲でも認識するそうです。
CV1のポジショナルトラッキングはルームスケールVRに匹敵。地上約2mにカメラを設置しての追跡テスト

HMDが軽いのもよかったです。
線が一本にまとまっており、ヘッドホンもついているので、取り回しがいいと思います。
何も考えずにインストールができて、OculusRiftを机においてあるときは、
パソコン(これまで使っていたスピーカー)から音が出て
OculusRift をつけているときは、HMD内臓のヘッドホンから音が出るようです。

ゲーム酔いについては、プレイ中は酔っていなくてもあとからくることがあります。
Virtual Desktop」など常時、VR空間の中にいるのは
目の負担となってしまいますので、人によってはかなりキツイのではないかと思います。
1日30分などと、時間を決めて遊んだほうがいいかもしれません。

とりあえず、本当に世界入り込める体験は、文句なしで素晴らしいので、
あとは値段さえ5万円以下に下がってくれば、いいかなと思います。
とはいっても、現段階で3D対応HDプロジェクタさえ、10万前後するのでまだまだ厳しそうです。
さらに、VR空間へのコントローラ(Oculus Touch)がまだ未発売なので、
年内中に発売でき、次は配送時のトラブルなどなければいいなと思います。

セカンドライフのパーティクルシステムの特殊設定

投稿日:


今回は、パーティクルシステムについてのお話です。
というか、自分用のメモです。

パーティクルは、llParticleSystem / llLinkParticleSystem で、
パーティクルシステムの設定を行うとできるのですが、
パラメータがたくさんあり、使うのが面倒です。

今回、日本語wikiにはなく、この英語wikiに書いてあるのについてまとめてみます。
なお、英語用のwikiは、「llParticleSystem翻訳)」です。

・System Behavior(パーティクルのふるまい)
Value
– PSYS_PART_RIBBON_MASK

・Particle Appearance(パーティクルの外観)
PSYS_PART_START_GLOW
PSYS_PART_END_GLOW

・Particle Blending(パーティクルブレンド)
PSYS_PART_BLEND_FUNC_SOURCE
PSYS_PART_BLEND_FUNC_DEST
Values
– PSYS_PART_BF_ONE
– PSYS_PART_BF_ZERO
– PSYS_PART_BF_DEST_COLOR
– PSYS_PART_BF_SOURCE_COLOR
– PSYS_PART_BF_ONE_MINUS_DEST_COLOR
– PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR
– PSYS_PART_BF_SOURCE_ALPHA
– PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA

上から順番に説明していきましょう。

【PSYS_PART_RIBBON_MASK】
リボンパーティクル と呼ばれるものを作成します。
途切れ途切れになっていたパーティクルの端を結合します。
リボンの「幅」は、 scale_start.x と scale_end.x に依存します。
リボンのセグメントの長さは、粒子間の距離に依存します。もし距離が 0 ならばレンダリングしません。
リボンパーティクルは、通常のパーティクルと違い常にカメラの方向を向くようにレンダリングしません。
PSYS_PART_FOLLOW_VELOCITY_MASK の設定は無視されます。
次の設定を併用することで効果を確認できます。
・PSYS_SRC_TEXTURE (テクスチャは TEXTURE_BLANK
・PSYS_SRC_PATTERN_DROP
・PSYS_SRC_ACCEL
・PSYS_PART_WIND_MASK

【PSYS_PART_START_GLOW / PSYS_PART_END_GLOW】
パーティクルの発生時と消滅時のグローのかかり具合を調整します。

【Particle Blending】
パーティクルを描写するときの合成方法を設定します。
内部では、OpenGLの「glBlendFunc」を使用して実装しています。
Visual glBlendFunc + glBlendEquation Tool」を使うと分かりやすいと思われます。
組み合わせはたくさんありますが、一般的な合成方法だけをここに書きます。

◆加算合成◆
PSYS_PART_BLEND_FUNC_SOURCE, PSYS_PART_BF_ONE,
PSYS_PART_BLEND_FUNC_DEST, PSYS_PART_BF_ONE

◆アルファブレンド合成◆
PSYS_PART_BLEND_FUNC_SOURCE, PSYS_PART_BF_SOURCE_ALPHA,
PSYS_PART_BLEND_FUNC_DEST, PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA

他に組み合わせでスクリーン合成などはできそうですが、
減算合成はできないようです。

セカンドライフのランドインパクトと標準プリムの話

投稿日: 更新日:


セカンドライフでは、土地でおけるプリム数が決まっています。
(詳しくは、セカンドライフの土地維持費を参照)

今回は、そのプリム数というのが、
どのような基準で決まるか、お話します。

まず単純にプリムとは、何なのかというと、
セカンドライフ上で作成できる「正方体」や「球体」などです。
これらは、1つ1つが、1プリムとなり、例えば512m2の土地では、117プリム=117個置けるとなります。

では、ここで一辺が50cmの正方体(キューブ)を作成して、詳細を見てみましょう。
右クリックで編集メニューを表示して、リンクの右側あたりにある「詳細」ボタンです。

すると次のように表示されると思います。
prims_0_cube
ここで、一番下の「土地の負荷」の「選択済」の 1 がランドインパクト(以下LI)となります。
実際、117プリム置ける土地は、117LI置けるということになります。

ちなみにここで表示されているそれぞれの意味について説明します。

選択済
選んでいるオブジェクトについて表示します
オブジェクト
選択中のオブジェクト(例えば、リンクすると1になります)
プリム
選択中のプリム(リンクしたものであれば、リンク数となります)

選択済みアイテムのウエイト
土地の重さ(LI)に関わる情報
ダウンロード
サーバーから、モデルをダウンロードする際の負荷です。
モデルは、メッシュであれば頂点数、ポリゴン数が多いほど、
ファイルサイズが大きいので、サーバーのダウンロードに負荷がかかるという分けです。
プリムが大きいほど、遠い距離からでもダウンロードが必要になるので、負荷が大きくなります。
ポリゴン数は、グラフィックボードの描写負荷と言っても分かりやすいかもしれません。
ポリゴン数、大きさ、描画詳細度(以下、LoD)などで変わってきます。
LoDについては、描画詳細度についての設定を参照してください。
物理効果
実像(当たり判定に使用するポリゴン)の負荷です。
プリムの大きさによっても変わってきますが、大きいほど大きくなるという分けでもなく、
小さくなると、大きくなるものもあります。
また実像の計算方法は「なし」「プリム」「凸状の外殻構造」があり、
計算方法をそれぞれ異なるため、物理効果の負荷も変わってきます。
メッシュをアップロードする際には、ここも設定することが可能です。
詳しくは、メッシュに物理形状を設定しよう1を参照してください。
あたり判定が必要でないのであれば、適当な立方体を実像にしたほうがいいです。
実像のポリゴン数、大きさなどで変わってきます。
サーバー
一律、1 プリムごとに最低 0.5 かかります。
表示用サーバーに 1 プリムを用意してもらっているための負荷となります。
プリムと同等の重さの計算 によると、物理オブジェクトやスクリプトを入れることで大きくなるようです。

土地の負荷 選択済み
オブジェクトの最終的なLIとなります。
ここの値は、上記の「ダウンロード」「物理効果」「サーバー」で、
最も大きな値の小数点を四捨五入した値です。
※ここについて、メッシュではなくセカンドライフで用意されている
標準のプリム(以下、標準プリム)で、実像が「プリム」の場合は、特例で必ず 1 になります。

下のは、球(スフィア)です。
prims_1_sphere
これを見ると、ダウンロードが球のほうが大きいことが分かります。
恐らく、球のほうがポリゴン数が大きくなるためだと思われます。
実像は、変わりありません。球のほうが、正方体より当たり判定が大変かと思うかもしれませんが、
球であると分かっている以上、球専用の当たり判定の数式を使うため正方体より簡単になるためです。
そのため、メッシュで球を作ろうとすると、物理効果が大きくなってしまいます。

では、立方体と球の両方を選択してみます。
prims_2_link_0
この場合は、オブジェクト数が2、プリム数が2
その他のものについても、2つのプリムの合計値が表示されています。

これらの立方体と球の両方を選択してリンクしてみます。
prims_3_link_1
すると、リンクができたため、オブジェクト数が1になります。
土地の負荷は、選択済みのアイテムのウエイトの最大値から 1 になります。
(今回の場合は、特例により2になっています。これについて後で解説)

ここで、片方のプリムの実像の種類を「なし」にしてみます。
つまり当たり判定をしない設定とするわけです。
prims_4_link_2
物理効果が 0.2 から 0.1 となり、
1プリム分の物理効果が減ることが分かります。

このような感じで、土地の負荷(LI)は、いろいろな要素から計算されます。
これらの知識を知っていれば大体、LIが予想つくようになり
物づくり、メッシュアップロードなどで低LIの物も作れるようになります。


さて、続けてランドインパクトに関係して、
物理効果と、標準プリムの特例の話をしたいと思います。

先ほど、2種類の標準プリムについてみてきました。
キューブは、ダウンロード 0.1、物理効果 0.1
スフィアは、ダウンロード 0.9、物理効果 0.1

ポイント
・ダウンロードは頂点数、ポリゴン数の量
・物理効果は数式による計算量(球の計算は簡単)

ここでスフィアについて物理効果が増やす方法があります。
それは、引き伸ばしです。
スフィアを引き延ばすことで、楕円体という形になります。
この場合、球の簡単な計算式が使えなくなるため物理判定をコストが大きくなります。
(立方体については、大きくしても物理判定の計算方式は変わらないので問題ありません)
prims_5_ellipsoid
物理効果が 1.2 に膨れ上がります!

また、標準プリムの中には、
何も編集しなくても巨大な物理効果があるものがあります。
それがトーラスです。(ドーナッツのようなやつ)
prims_6_torus
なんと、物理効果が 35.0 もあります。
3D空間でのトーラス自体とのあたり判定は数式を使っても大変なようです。
ただ、おそらくセカンドライフ上では、ポリゴンを使用してあたり判定を行っていると思われます。

ここまで、物理効果が大きくなる話をしてきましたが、
LIは、1であることにお気づきでしょうか。
そう、標準プリムなので、どれだけ物理効果が大きくても1なのです。
これは特例を受けているためだと思われます。

しかし、実像の種類を変えた場合に注意が必要です。
標準プリムは最初、実像の種類が、「プリム」となっているいますが、
これを「凸状の外殻構造」としてしまうと、特例から外れしまいます。
prims_7_torus_2
「プリム」から「凸状の外殻構造」にしたため、
物理効果の計算方法が変わり、35.0 から 1.8 に下がりましたが、
LIは、特例処置から外れてしまったため、 2 LIになってしまいました。

さらに、注意する点として、標準プリムをリンクした場合の話です。
例えば2つのトーラスをリンクしてみましょう。
prims_8_torus_link
この場合、物理効果が合わせて大変なことになっていますが。
特例により 2 LI しかありません。ヤッタネ!

ここで、リンクした2つのトーラスのうち、
片方のプリムの実像を「なし」にしてみましょう。
これで、物理効果がなくなるので半減するはず……
prims_9_torus_link_2
実は、物理効果は半減するのですが、
最終的な土地の負荷で、特例から外れてしまい、 35 LI となってしまいます。
標準プリムに関しては、リンクを行った後に実像を「プリム」以外に変更してしまうと、
他の標準プリムについても、特例から外れてしまうわけです。

ただ、逆に言えば、特例をうけてしまうと、
本来であれば 0.5LI の立方体を 2つリンクしても 1LI にならず、 2LI になってしまうのです。
つまり、特例を抜けたほうが、土地の負荷量が下がる場合もあるのです。

例えば立方体の標準プリムを10個リンクしました。
prims_10_A1
ごらんのように、
ダウンロード 0.6、物理効果 1.0、サーバー 5.0
なので、 5 LI となるはずなのですが、
特例のために、プリムの数=LIとなってしまい、 10 LI になってしまいます。

そこで、1 つでも、実像の種類を変更すると、
例えば、どれか 1 つだけ選んで「プリム」から「凸状の外殻構造」としましょう。
prims_10_A2
すると、特例から外れて、負荷が 5 LI となります。

標準プリムを扱うときは、
このような知識を持っておくことで、
低 LI の家などを作ることができると思います。


実像で、「プリム」と「凸状の外殻構造」何が違うのか、
実は、LI 以外にも、大きなメリットとデメリットがそれぞれあります。
それについては、またいつか話したいと思います。

セカンドライフでタッチイベントと状態遷移の落とし穴

投稿日:


突然ですが、次のプログラムを見てみてください。
stateを使った状態遷移と、touch_startを使ったプログラムとなっています。
どのように動くか想像できますでしょうか。

default {
	state_entry() {
		llOwnerSay("state 0");
	}
	touch_start(integer total_number) {
		state state1;
	}
}

state state1 {
	state_entry() {
		llOwnerSay("state 1");
		llSetTimerEvent(5.0);
	}
	timer() {
		llSetTimerEvent(0);
		state state2;
	}
}

state state2 {
	state_entry() {
		llOwnerSay("state 2");
	}
	touch_start(integer total_number) {
		state default;
	}
}

普通は、次のような動きを想像するかと思います。

1. 「state 0」と表示される
2. クリックする
3. 「state 1」と表示される
4. 5秒待つ
5. 「state 2」と表示される
6. クリックする
7. 「state 0」と表示される

実際にやってみてください。
実はうまくいかず、次のような動きをしているようにみえます。

1. 「state 0」と表示される
2. クリックする
3. 「state 1」と表示される
4. 5秒待つ
5. 「state 2」と表示される
6. クリックする
7. 何も発生しない
8. クリックする
9.「state 0」と表示される

なぜ、このような動きになるのでしょうか。

実は、「touch_end」イベントに関連しており、想像なのですが次のようになっています。
1. 「touch_start」が作られた時点で「touch_end」も内部的には作られる。
2. 「touch_start」イベントが発動する条件は、「touch_end」イベントが終わってから。

このために、上のソースコードは内部で次のような動作をしていると予想されます。

1. 「state 0」と表示される
2. マウスボタンを押して default:touch_start イベントを発生
3. 「state 1」と表示される
4. マウスボタンを離すが state1:touch_end が存在しないため無視★重要★
5. 「state 2」と表示される
6. マウスボタンを押すが touch_end が発生しないため、touch_start イベントを発生なし★重要★
7. マウスボタンを離して touch_end が発生(何も行わない)
8. マウスボタンを押して state2:touch_start イベントを発生
9. 「state 0」と表示される

では、回避策です。

【回避策1】全ての状態に、touch系のイベントを入れる

default {
	state_entry() {
		llOwnerSay("state 0");
	}
	touch_start(integer total_number) {
		state state1;
	}
}

state state1 {
	state_entry() {
		llOwnerSay("state 1");
		llSetTimerEvent(5.0);
	}
	timer() {
		llSetTimerEvent(0);
		state state2;
	}
	// ここが重要
	touch_end(integer total_number) {
	}
}

state state2 {
	state_entry() {
		llOwnerSay("state 2");
	}
	touch_start(integer total_number) {
		state default;
	}
}

【回避策2】「state1」の状態へ行くためには、touch_endを契機とさせる

default {
	state_entry() {
		llOwnerSay("state 0");
	}
	touch_end(integer total_number) {	// ここが重要
		state state1;
	}
}

state state1 {
	state_entry() {
		llOwnerSay("state 1");
		llSetTimerEvent(5.0);
	}
	timer() {
		llSetTimerEvent(0);
		state state2;
	}
}

state state2 {
	state_entry() {
		llOwnerSay("state 2");
	}
	touch_start(integer total_number) {
		state default;
	}
}

【回避策3】「state2」のタッチイベントの発生を、touch_endを契機とさせる

default {
	state_entry() {
		llOwnerSay("state 0");
	}
	touch_start(integer total_number) {
		state state1;
	}
}

state state1 {
	state_entry() {
		llOwnerSay("state 1");
		llSetTimerEvent(5.0);
	}
	timer() {
		llSetTimerEvent(0);
		state state2;
	}
}

state state2 {
	state_entry() {
		llOwnerSay("state 2");
	}
	touch_end(integer total_number) {	// ここが重要
		state default;
	}
}

以上
報告でした!


オマケ

ところで話が変わりますが、state1の状態の時に、
カーソルの形状を手のアイコンから普通のアイコンにするために、
今回は、llSetTimerEventを使いました。

実は、llSleepを使うと、アイコンが変わりません。
おそらく、state_entryを抜けたときにカーソルの形状が変わると思われます。

以下ダメな例です。

default {
	state_entry() {
		llOwnerSay("state 0");
	}
	touch_start(integer total_number) {
		state state1;
	}
}

state state1 {
	state_entry() {
		llOwnerSay("state 1");
		llSleep(5.0);
		state state2;
	}
}

state state2 {
	state_entry() {
		llOwnerSay("state 2");
	}
	touch_end(integer total_number) {
		state default;
	}
}

セカンドライフでメッシュに物理形状を設定しよう1

投稿日: 更新日:


メッシュでアップロードするときに、「実際の見た目」と「物理形状」を自由に選ぶことができます。
今回は、それらがどのような動きをするのか、少し調べたのでまとめたいと思います。

obj_1
このような単純な物体を用意します。
赤色は「実際の見た目」として利用して、青色が「物理形状」として利用したいと思います。
画像を見るように、まずは、重なった立方体としています。
obj_2_X
さて、これをアップロードすると、このような感じになります。
「実際の見た目」、「物理形状」が合わさって、同じ物体が1つしか見えないようにみえます。
なお、画像にある物理演算という部分は、アップロード時に表示されたものを書いています。

obj_2
次は、「見た目」と「物理形状」の位置をずらしてみました。
さらに、「物理形状」の大きさも上下左右奥行で違ったものにした場合です。
obj_2_X
アップロードすると、不思議なことがおきます。
これは、先ほどの「見た目」と「物理形状」が同じだった場合と一致しているのです。
どうしてこのようになるのか、次の実験でわかると思います。

obj_3
「物理形状」を回転させた場合です。
obj_3_X
こちらが、アップロードした場合の「見た目」と「物理形状」です。これでわかりましたでしょうか、
「物理形状」というのは、勝手に形が変更されてしまうのです。
具体的には「見た目」のバウンディングボックスに最大限おさまるように、
上下左右奥行の各々で正規化されてしまうというわけです。
これは、物理形状を別で作るうえで注意が必要です。

obj_4
次は別のテストをしてみます。
このように、物理形状のみの法線を逆にした場合です。
obj_4_X
アップロード時には、「物理形状」の面が逆になっているように見えます。
しかし、これを実際にプリムとして設置しても、別に立方体の中へ入れるといったことはございません。
「見た目」の法線は、描写するときに見える方向が決まってしまいますが、
「物理形状」の法線は、あたり判定の方向が決まるというわけではないのです。
そのため、一方通行のような面を作ることはできないのです。

obj_5
ところで、面1枚のような物理判定も作ることができるのでしょうか。
通常のSLに用意されている通常プリムには、面1枚のものはないので気になります。
というわけで、今回はこのようなオブジェクトを用意してみます。
obj_5_X★1

こちらも、問題なく面1枚も物理として設定できます

S_obj_5_X_2
しかし注意が必要でして、アップロード後に実際においてみると、
物理形状が変わっており、上の平面の部分に当たることができなくなります。

type

これを防止するためには、設置後に自分で「実像の種類」を
「凸状の外殻構造」(デフォルト)から「プリム」に変更する必要があります。
「凸状の外殻構造」というのは、凹みがない構造のことをいいます。

S_obj_5_X_3
そして、設定するとアップロード時に表示された形状の物理判定となります。

S_obj_6_X_2
「実像の種類」というのは重要な設定で、例えば3つの立方体があるモデルでも、
「凸状の外殻構造」にしていると、1つの構造となってしまい、接続されてしまいます。

ところで「実像の種類」を「プリム」にしたときに、様々な問題が発生します。

obj_5_X_2_2
★1を「実像の種類」を「プリム」としたときの物理負荷はこのようになるのですが、
これでは、アップロード前確認で表示されたものと一致しません。
これはプリムの大きさをアップロード後に変更したためです。

つまり、大きさによって、物理負荷が変わってくるわけです。
そして、大きければ物理負荷が大きくなるというものでもなくて、
大きさを小さくすると、物理負荷が大きくなる可能性があります。

物理負荷というのが、どのような計算で算出されるのかちょっとわからないですが、
プリムの大きさを小さくすると物理負荷が大きくなることから、
何回、ポリゴンとの衝突判定を行わないといけないかといった計算から
導いているのかもしれませんね。
小さいと、その分どのポリゴンとも衝突する可能性があるわけでして。

これについては、いつかまた調査したいです。

オマケ

obj_6
例えば、3つの立方体が並んだモデルも
obj_6_X
アップロードして……
obj_6_X_2_b_2
「実像の種類」を「プリム」としたときに、1プリムで済んでしまうのです。
やはり、メッシュは強いですね~。

なお、物理演算コストは32を超えるとだめなようです。

無料オンラインストレージの比較

投稿日: 更新日:


今まで無料オンラインストレージはそんなに使ったことがなかったのですが、友達と共有する際にはあると便利なので入れてみました。

その時に、少し調べたのでリストとしてみました。どれも大手がやっているものを集めたので、オンラインストレージにありがちなすぐにサービス終了は、あまり考えにくいと思われます。

サービス名 OneDrive
(旧 SkyDrive)
Dropbox iCloud Drive Google ドライブ
(旧 Google Docs)
提供開始 2007/8 2008/9 2011/10 2006/3 (Docs)
2012/4 (Drive)
提供 Microsoft Dropbox, Inc. Apple Google
無料容量 15GB 2GB 5GB 15GB
必要事項 Microsoft アカウント アカウント Apple ID Gmail アカウント
Web ?
Windows
Mac OS X
iOS
Android ×
共有時匿名性 ? ×
備考 アカウントの作成が楽
無料容量は勧誘などで増やせる
導入には、iOS, Mac OS 必要 ワードやエクセルに代わるツールが利用可能

匿名性というが、結構大事でツイッターとかで知らない人へ渡す場合は、匿名性がある方法を使用したほうがいいです。Googleドライブはおそらく名前がばれてしまうような気がします。

あと最近導入してわかったことが、どれもOS上で専用ソフトをインストールすると、フォルダのように扱えるという点です。昔は、Web上からでのファイルの追加・削除ができるものとは思っていたのですが、その考えは古いんですね。