縁日ワールド進捗 (1)

現在作っているワールドの途中報告。

はじめに

現在鋭意作業中ですが、近い内にPublicに申請すると思います。

けん玉

前の記事で紹介したけん玉を実戦投入(?)しました。

ホフマンパズル

ホフマンパズル(Hoffman’s packing puzzle)は\(a<b<c\)、\(4a \leq a+b+c\)を満たす\(a \times b \times c\)の27個の直方体を一辺が\(a+b+c\)のケースに充填する問題です。
このワールドでは\(a=40\ \mathrm{mm}, b=50\ \mathrm{mm}, c=60\ \mathrm{mm}\)とし、当たり判定は見た目の外周を1mm削った図形を使用しています。
解法を調べて実際に全部入れ込めるかは一応テストしましたが、ガバガバ物理演算で直方体が吹っ飛んでいくことが多々あるためかなり慎重な操作を要求されます。
このパズルを含めて以降のパズルのほとんどは、遠く(0.5m程度以上)に飛んでいってクリア不能になることがないように初期位置とConfigurable jointで接続しています。

ネットで見つけた解 [1]の1つを苦労の末全部詰めた結果はこんな感じ。
© Unity Technologies Japan/UCL
[1] A. Spiridonov, Hoffman’s Packing Puzzle in 3 and 4 Dimensions, May, 2003.

金魚すくい

ポイと器がpickupできるので一見するとすくえるかのように見えますが、金魚(パーティクル)は当たり判定の瞬間に破壊されるようになっているので拾えません。観賞用です。

(本当はポイを水の中に入れたときだけ敗れるようにステンシル芸をしようと思ったのですが、VRChatではシステム側でステンシルバッファが使用されているらしく正常動作しませんでした……)

花火

特にひねったものではないですが、雰囲気作りに。

VRChatでけん玉を作る

手元にけん玉があったので(?)VRChatで実際に遊べるけん玉を作ってみました。

TL;DR

  • このリンクから遊べます(VRChatのインストールが必要です)。
  • このリンクからUnityパッケージを配布しています。README.txtをご確認の上ご自由にご利用ください。

以下は作り方のメモです。

 

モデリング+Unityインポート


現物の「けん」の直径と長さを測って(曲線部分は目分量で)モデリングしました。ちなみに、左右の玉をのせる部分である「皿」は「大皿」「小皿」といってサイズが異なります(下部の「中皿」と合わせて大皿→中皿→小皿の順に難しくなる)。

Unityに突っ込みます。

けんと玉は両方とも非凸(けんは全体的に、玉は穴部分が凹んでいる形状)のため、通常のMesh colliderをそのまま適用してもうまく当たり判定をとってくれません。そこで、モデリング時に筋肉で凸分解した形状(図の緑線のローポリ部分)を重ねてコライダを適用しています。見て分かる通り、見た目よりも当たり判定がだいぶ大きい接待コライダとなっています。

大きい矩形部分は正しく「持つ」判定を行うためにVRC_Pickupと同じ階層に追加したダミーです(トリガーにしているので実際には当たり判定にはならない)。

VRChat用のカスタマイズ

  • けんと玉の両方にRigid bodyをつけています。けんはIs Kinematicを有効にして自然落下しないようにしたほうが手を離したときに床に落ちないので便利ですが、けん玉ではけんの速度を玉に伝える動作がほぼ必須のため(皿にのせた状態から更に投げ上げて次の技を行うなど)、泣く泣く無効にしています。
  • けんと玉部にはVRC_Pickupをつけて手に持てるようにします。一度持った後はトリガーを引きっぱなしにしなくてもいいようにAuto HoldをYesにしています。けん玉では玉を持って行う技もあるため(「飛行機」等)、玉にも同じ設定をしています。また、VRC_Object Syncで他プレイヤーと同期させます。
  • けんと玉はConfigurable Jointで接続しています。Springがお好みでいれたほうが遊びやすいかも……
  • コライダ部分はVRC_Special LayerをPickupに設定してけんや玉が身体に当たってぶっ飛んでいかないようにしています。
  • ひも部分は適当な立方体モデルにボーンをつけてSkinned mesh rendererを使うことでけんと玉の間にメッシュを張っています。

動画

こんな感じに遊べます。

作者は現実世界では世界一周がギリギリできるかできないかくらいの腕前ですが、大皿〜小皿、ろうそく、野球けん、もしかめくらいはバーチャル空間でも動作を確認しています。ただしけん先を使った技はまだできていません(玉の穴が下に来やすいように重心を調整したほうがいいかも……)。

ちなみに、けん玉はひざを使って衝撃を抑えるのが基本のため、HMDという重しをかぶった状態で遊ぶと最悪ひざを痛めます。こっちの意味でも利用に際して作者は一切の責任を負いません。