MRが楽しい

MRやVRについて学習したことを書き残す

clusterの自作ワールドを作成してアップロードする その8(プレイヤーが掴めるアイテムの配置)

本日は cluster の技術調査枠です。
cluster の自作ワールドを作成してアップロードする手順を記事にします。
f:id:bluebirdofoz:20201221043138j:plain

その8はプレイヤーが掴めるアイテムの配置です。

前提条件

前回記事の続きになります。
bluebirdofoz.hatenablog.com

clusterワールドで使えるアイテム

cluster ワールドにはプレイヤーが掴んで操作することができるアイテムを配置することができます。
ClusterCreatorKit にはアイテムを設定するための以下の3つのコンポーネントが提供されています。

コンポーネント 説明
Item ワールド上でのインタラクションを作るコンポーネントです。単体は機能を持ちませんが、他のコンポーネントを使用する際に必要となることがあります。
Movable Item Movable Itemを使うと、ワールド内のプレイヤー間でオブジェクトの位置を同期することができます。
Grabbable Item Grabbable Itemを使うと、プレイヤーがオブジェクトを掴んで移動できるようになります。

clustervr.gitbook.io

コンポーネントの利用方法は ClusterCreatorKitSample に含まれる以下のシーンに様々な事例があります。
こちらを参考にすると、動きも同時に確認できるので分かりやすいです。
・Assets/ClusterVR/Scenes/ItemSample.unity
f:id:bluebirdofoz:20201221043222j:plain

掴んで跳ねるアイテムを配置する

掴むことができて、手放すと物理演算に従って地面に落ちて少しバウンドするアイテムを作成してみます。
ItemSample シーンの以下の「跳ねる」アイテムを参考にします。
f:id:bluebirdofoz:20201221043241j:plain

アイテムの3Dモデルを取り込む

最初にアイテムの3Dモデルを Unity のプロジェクトに取り込みます。
今回は FBX 形式のホロモンモデルを使います。プロジェクトにモデルとテクスチャをドラッグして取り込みます。
f:id:bluebirdofoz:20201221043307j:plain

これで3Dモデルを Unity に取り込むことができました。
f:id:bluebirdofoz:20201221043319j:plain

3Dモデルを[Scene]画面にドラッグしてワールドに配置します。
f:id:bluebirdofoz:20201221043334j:plain

更にトランスフォームを変更して、手で掴むのに最適なサイズに調整しました。
合わせてアタリ判定(Box Collider)も設定しておきます。
f:id:bluebirdofoz:20201221043351j:plain

アイテムコンポーネントの追加

次に、オブジェクトにコンポーネントを追加してアイテムの設定を行います。
[Add Component]から以下の3つのコンポーネントを追加します。
・Item
・Movable Item
・Grabbable Item
f:id:bluebirdofoz:20201221043409j:plain

Item

ワールド上でのインタラクションを作るコンポーネントです。
[Id]はアイテムを識別するために自動で割り振られる値になります。
[ItemName]はアイテムの名前です。掴まれたときなどに表示されます。
f:id:bluebirdofoz:20201221043418j:plain

clustervr.gitbook.io

Movable Item

ワールド内のプレイヤー間でオブジェクトの位置を同期するコンポーネントです。
[Movable Item]設定時に[Rigidbody]がない場合は自動で追加されます。
アイテムの挙動は[Rigidbody]の設定で制御できます。
例えば[Use Grabity]を有効にするとアイテムは重力の影響を受けるようになります。
f:id:bluebirdofoz:20201221043434j:plain

clustervr.gitbook.io
docs.unity3d.com

Grabbable Item

プレイヤーがオブジェクトを掴んで移動できるようになるコンポーネントです。
[Grip]には持ち手となる部分の座標と回転を指定するトランスフォームを設定できます。
[Grip]を設定しない場合はプレイヤーが選択した部分を掴みます。
f:id:bluebirdofoz:20201221043459j:plain

clustervr.gitbook.io

シーンを再生して挙動を確認します。
アイテムを左クリックで掴むことができ、手放すと地面に落ちれば成功です。
f:id:bluebirdofoz:20201221043519j:plain

持ち手の位置の調整

掴んだ時にホロモンの全体が見えるように持ち手の設定をしてみます。
持ち手の座標を指定するための空オブジェクトを子オブジェクトとして追加します。
アイテムオブジェクトを右クリックして[Create Empty]を選択します。
f:id:bluebirdofoz:20201221043534j:plain

追加された空オブジェクトのトランスフォームを変更して、持ち手の位置を決定します。
回転方向は Z 軸の正方向が、プレイヤーの正面方向になります。
f:id:bluebirdofoz:20201221043544j:plain

作成したオブジェクトを[Grabbable Item]コンポーネントの[Grip]に設定します。
これで持ち手の座標が指定オブジェクトの位置と回転に固定されます。
f:id:bluebirdofoz:20201221043554j:plain

シーンを再生して挙動を確認します。
ホロモンの全体が見えるように掴むことができれば成功です。
f:id:bluebirdofoz:20201221043604j:plain

バウンド(跳ね)の設定

次に、アイテムを落としたときに跳ねるように物理特性マテリアルの設定を行います。
Assets フォルダ内で右クリックから[Create -> PhysicMaterial]を選択し、物理特性マテリアルを作成します。
f:id:bluebirdofoz:20201221043616j:plain

作成した物理特性マテリアルを選択して Inspector ビューを開きます。
[Dynamic Friction]で動摩擦を、[Static Friction]で静止摩擦を、[Bounciness]で弾力の設定が出来ます。
[Firction Combine]と[Bounce Combine]は物体同士が衝突した際に使用される計算式を指定できます。
f:id:bluebirdofoz:20201221043626j:plain

バウンド(跳ね)の設定は[Bounciness]で変更します。
[Bounciness]の設定を[0.9]、[Bounce Combine]を[Maximum]にして地面にぶつかったときにバウンドするようにします。
f:id:bluebirdofoz:20201221043636j:plain

物理特性マテリアルを[Rigidbody]コンポーネントの[Material]に設定します。
これでアイテムに弾性のある物理特性が設定され、落としたときにバウンドするようになりました。
f:id:bluebirdofoz:20201221043646j:plain

シーンを再生して挙動を確認します。
ホロモンを落としたときにバウンドすれば成功です。
f:id:bluebirdofoz:20201221043656j:plain

アイテムの回転方向の固定

そのままの設定だと、アイテムは慣性に従って自由に回転します。
もし回転方向を固定したい場合は[Rigidbody]コンポーネントの[Freeze Rotation]で固定したい軸を指定しておきます。
f:id:bluebirdofoz:20201221043705j:plain

こうすると軸回転が固定されたまま、アイテムが跳ねるようになります。
f:id:bluebirdofoz:20201221043715j:plain

アイテムの影の対処

アイテムを持って部屋を歩き回ったところ、光源と反対側の面が暗くみえてしまいました。
これは部屋の環境光が[Static]でないオブジェクトには反映されず、アイテムを照らさないためです。
f:id:bluebirdofoz:20201221043727j:plain

部屋の環境光をアイテムにも反映するにはライトプローブを利用します。
Hierarchy 上で右クリックから[Light -> Light Probe Group]で光源を追加します。
f:id:bluebirdofoz:20201221043738j:plain

追加された Light Probe Group オブジェクトをトランスフォームを変更して部屋の中央に移動させます。
更に環境光が部屋全体を覆うように、大きさを調節します。
ただし黄色い球体がその場所の環境光を取得するので、この球体が部屋の内側に収まるように注意します。
f:id:bluebirdofoz:20201221043748j:plain

[Light Probe Group]の[Edit Light Probes]をクリックすると、光源取得の球体を編集することができます。
部屋の位置によって色調の変化がある場合は、球体の数を増やすとより正確なライティングが行われます。
f:id:bluebirdofoz:20201221043759j:plain

ライトプローブに環境光を焼き込みます。
光を焼き込むため、[Light]の設定を[Mixed]に変更します。
f:id:bluebirdofoz:20201221043809j:plain

環境光の元となる部屋のオブジェクトを全て[Static]に変更します。
f:id:bluebirdofoz:20201221043818j:plain

これで環境光の作成準備が整いました。
メニューから[Window -> Rendering -> Lighting Settings]で[Lighting]ダイアログを開き、[Generate Lighting]を実行します。
f:id:bluebirdofoz:20201221043827j:plain

構造が複雑な環境では処理に時間がかかります。
GPU を積んだ PC であれば[Lightmapper]に[Progressive GPU (Preview)]を利用しておくと処理が早くなります。
これでライトプローブの設定が完了しました。
f:id:bluebirdofoz:20201221043839j:plain

再びシーンを再生してみて確認します。
光源と反対側の面にも部屋の環境光が反映され、オブジェクトがより自然に見えるようになります。
f:id:bluebirdofoz:20201221043849j:plain

ワールドの更新と確認

前回と同じ手順で再びワールドを更新して確認しました。
f:id:bluebirdofoz:20201221043859j:plain

次は Booth で販売されていた特殊な機能を持ったアイテムを追加してみます。
bluebirdofoz.hatenablog.com