【Unity】流体シミュレーションをVR(Quest2)で動かす
やりたいこと
Blenderで作った流体シミュレーションをUnityに持っていきVR(Quest2)で動かす。
手順
いくつか方法はあると思いますが、今回は以下の方法で行いました。
- Blenderの流体シミュレーションをAlembic形式でUnityにインポート
- UnityでAlembicをVATに変換
- VATを自動再生させる
- ビルド
検証環境
- Unity 2019.2.13f
- Oculus Quest2 OS 49.0
1. Blenderの流体シミュレーションをAlembic形式でUnityにインポート
BlenderからUnityに流体シミュレーションを持っていくために、今回はAlembic形式でエクスポートしてUnityに持っていきました。
▼このステップに関してはこちらの記事で書きました。
ただUnityのAlembicパッケージはAndroidビルドに対応していないようなのでこのままではQuestで動かすことができません…。
Limitation: Alembic for Unity only supports the following build targets: Windows 64-bit, MacOS X, Linux 64-bit, and Stadia.
https://docs.unity3d.com/Packages/com.unity.formats.alembic@2.3/manual/known-issues.html
2. UnityでAlembicをVATに変換
Androidビルドできる方法を探してVAT(Vertex Animation Texture)にたどり着きました。
AlembicからVATへの変換にはこちらのツールを使用しました。
Unity-AlembicToVAT-master/Assets/AlembicToVAT のデータをUnityにインポートするとUnityのメニューWindow
よりAlembic to VAT
が選択肢として追加されますので選択して専用エディターを表示します。
※もしAlembicToVATをインポートしたときにEditor Coroutines
関連のエラーが出るときは、Package ManagerよりEditor Coroutines
のパッケージをインポートします。
ATV_Editorの使用方法はツールのgithubに掲載されているGIFを参考に、以下のような感じで入力してBake Meshしました。
- Hierarchy to bake: 流体のドメインオブジェクトを選択
- Export path: 任意のパスを入力(指定するパスのフォルダは先に作成しておく)
- Sample rate: 24
ベイク成功すると、指定したパスにPrefabを含むいくつかのデータが出力されます。
Prefabをシーンに配置して、MaterialのTime positionのつまみを動かしてアニメーションが問題なく動けばOK。
3. VATを自動再生させる
VATのTime positionを自動再生&ループさせるスクリプトを用意し、Prefabに付けます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class VATAnimationController : MonoBehaviour
{
private Material material;
public float animationSpeed = 1.0f;
private float timePosition = 0.0f;
void Start()
{
material = GetComponent<Renderer>().material;
}
void Update () {
timePosition += Time.deltaTime * animationSpeed;
if (timePosition > 1.0f)
{
timePosition = 0.0f;
}
material.SetFloat("_Timeposition", timePosition);
}
}
4. ビルド
こちらでAndroidビルドすると、Quest2でも問題なく動きました。
(グラス部分は別途3Dモデルを配置しています)
Discussion