🌊

【Unity】流体シミュレーションをVR(Quest2)で動かす

2023/02/11に公開

やりたいこと

Blenderで作った流体シミュレーションをUnityに持っていきVR(Quest2)で動かす。

手順

いくつか方法はあると思いますが、今回は以下の方法で行いました。

  1. Blenderの流体シミュレーションをAlembic形式でUnityにインポート
  2. UnityでAlembicをVATに変換
  3. VATを自動再生させる
  4. ビルド

検証環境

  • Unity 2019.2.13f
  • Oculus Quest2 OS 49.0

1. Blenderの流体シミュレーションをAlembic形式でUnityにインポート

BlenderからUnityに流体シミュレーションを持っていくために、今回はAlembic形式でエクスポートしてUnityに持っていきました。

▼このステップに関してはこちらの記事で書きました。
https://zenn.dev/dami/articles/92b6177d1ff4be

ただ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への変換にはこちらのツールを使用しました。
https://github.com/Gaxil/Unity-AlembicToVAT

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