Unity 上でメッシュを作るメリット
エフェクト用のメッシュを用意する時、通常はHoudiniやBlenderといった外部のDCCツールを使ってエフェクト用の3Dモデルを作成することになります。
しかし、DCCツールとUnityを行ったり来たりするのはコストがかかります。
Unity上でメッシュを作れる場合、Unity上で結果を見ながら形状を調整できるため、低コストでエフェクト用のメッシュを作ることが可能となります。
竜巻エフェクトメッシュをUnity C# でプロシージャルに作成するやつ、とりあえずできた。
— 🍡🍮かもそば 🍩🍘 (@rn49rn49) 2021年1月6日
Creating a spiral mesh for real-time tornado vfx, using Unity C#.
It's fun.#Unity pic.twitter.com/1Tr3MgRLuJ
作り方解説
STEP1 : らせんのカーブを作る
らせんを作る考え方
らせん上の点の方位角を と置いたとき、らせん上の点の座標Pは のような形で表されます。
/// <summary> /// カーブに沿ったポイントを作成 /// </summary> private static void ComputeCurvePoints(SpiralMeshGenerator generator, out Vector3[] points) { float curveTimeMin = generator.radiusCurve[0].time; float curveTimeMax = generator.radiusCurve[generator.radiusCurve.length - 1].time; points = new Vector3[generator.curveDivsV]; // らせん上のポイントの座標を保存するための配列 for (int i = 0; i < generator.curveDivsV; i++) { float t = (float) i / (generator.curveDivsV - 1); float radian = t * 2f * Mathf.PI * generator.loops; float radius = generator.radiusCurve.Evaluate(Remap(t, 0f, 1f, curveTimeMin, curveTimeMax)); // らせんの半径はAnimationCurveで管理している float x = Mathf.Cos(radian) * radius; float y = generator.height * t; float z = Mathf.Sin(radian) * radius; points[i] = new Vector3(x, y, z); } }
半径rのコントロール
高さでの らせんの半径 は AnimationCurve でコントロールできるようにしています。
float radius = generator.radiusCurve.Evaluate(Remap(t, 0f, 1f, curveTimeMin, curveTimeMax)); // らせんの半径はAnimationCurveで管理している
これにより、AnimationCurveを変えることでらせん形状のバリエーションを出せるようになります。
STEP2 : らせんに沿ってメッシュを作成する
らせんメッシュの作り方
STEP1 でらせんを計算しました。
らせんの各ポイントから外側へ向かうベクトル を計算します。
ベクトル にそってメッシュを広げることで、らせんメッシュを作ることができます。
このベクトル は外積を利用して計算することができます。
STEP3 : らせんメッシュをねじる
を軸とみなす
STEP2で、二つのベクトル と を計算しました。
ここで、これらのベクトルを座標軸と考えて、以下のような点Pを取ることを考えます。
を利用して、メッシュ頂点を計算する
この点Pをメッシュの頂点として利用すると、らせんメッシュをらせんに沿ってひねったような軌跡を描きます。
このは、線形代数学では直交基底ベクトルと呼ばれたりもします。