メッシュの操作方法: 物理演算を追加する
この入門ガイドでは、以下の内容について説明します。
- デフォルトのマネージャーでシーンに動的メッシングを追加する
- メッシング用プレハブを作成する
- メッシュの物理演算と連動する
- メッシュを不可視にする
前提条件
ARDKがインストールされたUnityプロジェクトと、セットアップされた基本的なARシーンが必要です。 詳細については、ARDK 3のインストールと 基本的なARシーンの設定を参照してください。
メッシュを作成する
メッシュのプレハブを作成するには、次のように行います。
-
XROriginにAR Mesh Managerを追加します。
-
Hierarchyで、
XROrigin
を右クリックし、 Create Empty を選択して、空のGameObject
を追加します。 新しいオブジェクトに MeshManager という名前を付けます。 -
Hierarchyで、 MeshManagerを選択し、 Inspector ウィンドウで、 Add Component をクリックし、 ARMeshManager Component を追加します。 :::caution カメラを親に持つ
ARMeshManager
コンポーネントを追加する際はご注意ください。ARMeshManager
を追加すると、アタッチされているGameObjectのスケールが自動的に大きくなります。 これにより、現実世界と仮想世界のスケールにずれが生じ、オクルージョンやオブジェクトの距離感が崩れる可能性があります。 ::: -
このプロセスを繰り返しますが、代わりに Lightship Meshing Extension Component を追加します。
-
-
ARオクルージョンマネージャーを追加する:
-
Hierarchyで、
XROrigin
と Camera Offsetを展開し、 Main Camera オブジェクトを選択します。 次に、 Inspectorで、 Add Component をクリックし、AROcclusionManager
を追加します。 -
Occlusion Preference Mode を No Occlusionに設定する。
-
-
プレハブに変換するためのメッシュを用意します。
-
Hierarchyで右クリックし、メインシーンに Empty
GameObject
を作成します。 MeshChunk という名前を付けます。 -
Inspector ウィンドウで、3つのコンポーネントを MeshChunkに追加します。 Mesh Filter は地理情報を保持し、 Mesh Renderer はメッシュを表示し、 Mesh Collider は物理を提供します。
-
Mesh Renderer Componentで、 Materials ドロップダウンを展開し、○ボタンをクリックして Select Material ウィンドウを開き、 Default Material を選択して追加します。
-
-
次のように、メッシュをプレハブに変換して割り当てます。
-
MeshChunk を Hierarchy から Assets ウィンドウにドラッグし、プレハブに変換します。
-
MeshChunk
GameObject
をシーンから削除します。 -
** Hierarchy から MeshManager を選択し、 MeshChunk プレハブを Mesh Prefab スロットにドラッグします。** **** ****
-
-
試してみましょう。
- デバイスにビルドするか、エディターのプレイボタンを押します。 メッシュのオーバーレイが画面に表示されます。
メッシュの物理演算をテストする
メッシュには Mesh Collider が追加されているため、オブジェクトがある場合は、Unityの標準的な物理衝突が適用されます。 たとえば、メッシュの表面を歩くキャラクターに衝突したり、壁にぶつかったことをゲームエンティティに知らせることができます。 この演習では、プレイヤーが球体をシーンに発射し、それがメッシュに跳ね返る様子を示すデモを行います。
メッシュに物理演算を追加するには、次のように行います。
- 次のように、物理プレハブを作成し、剛体衝突を追加します。
- Hierarchyで右クリックし、 3D Object にマウスオーバーし、 Sphereを選択する。 LauncherSphere という名前を付けます。
- LauncherSphere を Hierarchyで選択し、 RigidBody Component を Inspectorで追加します。
- Inspector の Transform コンポーネントでスケールを(0.2, 0.2, 0.2)に設定して、 LauncherSphere を小さくします。
- LauncherSphere を Assets ウィンドウにドラッグしてプレハブにし、シーンから削除します。
- 球体を発射するスクリプトを作成するには、次のように行います。
- Assets ウィンドウで右クリックし、 Create にマウスオーバーして、 C# Scriptを選択します。 新しいスクリプトに Launcher という名前をつけます。
- Launcher のコードをスクリプトに追加します:
クリックしてランチャーコードを展開
using UnityEngine;
public class Launcher : MonoBehaviour
{
public Rigidbody _prefabWithRigidbody;
void Update()
{
#if UNITY_EDITOR
if(Input.GetMouseButtonDown(0))
#else
if (Input.touchCount > 0)
#endif
{
// カメラの前にスポーン
var pos = Camera.main.transform.position;
var forw = Camera.main.transform.forward;
var thing = Instantiate(_prefabWithRigidbody, pos+(forw*0.4f), Quaternion.identity);
thing.AddForce(forw * 200.0f);
}
}
}
- スクリプトを実行するために、
GameObject
を作成:- Hierarchyで、シーン内を右クリックし、 Create Emptyを選択します。 LauncherScriptと名付け、 Launcher スクリプトを Assets ディレクトリからその上にドラッグ&ドロップします。
- Hierarchyから LauncherScript を選択し、 Inspectorで LauncherSphere を Prefab 変数として割り当てます。
- デバイスにビルドし、テストしてみましょう。 画面上のどこかをタップし、球体を発射して、表面で跳ね返るようにします。
メッシュを不可視にする
メッシュを不可視にするには、メッシュをレンダリングしないようにUnityに指示する方法が最も簡単です。 プレハブから Mesh Renderer を削除すると、Unityで描画できなくなるだけでなく、メッシュでシーンにオクルージョンやシャドーを適用することもできなくなります。 この機能を維持するために、Lightship は InvisibleMeshWithShadows
というシェーダーを提供しています。このシェーダーは、メッシュを直接レンダリングすることなく、光を受けて影を描きます。
メッシュに不可視シェーダーを追加するには、次のように行います。
- プロジェクトに
InvisibleMeshWithShadows
シェーダーのコピーがない場合は、 Githubリポジトリ からダウンロードしてプロジェクトに追加してください。 - Assets ウィンドウで右クリックし、 Create にマウスオーバーして、 Materialを選択します。 InvisibleShader という名前を付けます。
InvisibleMeshWithShadows
シェーダーを InvisibleShaderに追加する:- Assets ウィンドウで、マテリアルを選択します。
- Inspector ウィンドウで、 Shader ドロップダウンをクリックし、
InvisibleMeshWithShadows
を検索して選択します。
- InvisibleShader をプレハブの Mesh Renderer に追加します:
- Hierarchyで MeshChunk オブジェクトを選択してください。
- Inspector ウィンドウで、 Mesh Renderer コンポーネントを見つけ、 Materials メニューをクリックして展開します。
- サークルをクリックし、 InvisibleShader を検索するか、 Invisible Shader を要素ボックスにドラッグ&ドロップして、 InvisibleShader をマテリアルとして追加します。
ここでは、シーン内の Directional Light
を現実世界に合わせています。 プロジェクトでリアルな照明を設定する方法については、AR Foundationの ARLightEstimation
をご覧ください。
Custom Mesh Texturing
この入門ガイドでは取り上げませんが、AR開発においてメッシュテクスチャを活用する方法は他にもあります。 2つの使用例をご紹介します。
- (メッシュ生成のサンプルシーンで使用されているように)カスタムメッシュレンダラーを使用することで、デバッグ時に法線を表示して、三角形の向きを確認することができます。
- デフォルトでは、メッシュレンダラーでUV表面のマップを作成することはできませんが、メッシュ生 成時にTriPlanar(トライプラナー)投影を使用することで、ワールド空間のUVマップを作成することができます。 メッシュのテクスチャ用のサンプルシェーダーは、 こちら をご覧ください。
詳細情報
- この仕組みの詳細については、 メッシングを参照してください。