LoginSignup
0
0

PivotPainter2 for Unity

Last updated at Posted at 2024-05-19

#目次
1.はじめに
2.テクスチャインポート時の処理
3.VertexShaderでの処理
4.親子関係について
5.まとめ

1. はじめに

この記事は、Unreal Engine機能のPivotPainterをUnityに移植したため、手順をまとめたものになっています。
この記事にはHoudiniは出てきません
UE                 Unity
UE.gifUnity.gif

2. テクスチャインポート時の処理

UnityにPivotPainter2のテクスチャを読み込む際には、圧縮設定をOffにして、サンプリングのフィルター設定をPointにする必要があります。

CustomTextureImport.cs
using UnityEngine;
using UnityEditor;
using System.Collections;

public class CustomTextureImport : AssetPostprocessor
{
    void OnPreprocessTexture ()
    {
        TextureImporter importer = assetImporter as TextureImporter;
            //制限を掛けなければすべてのテクスチャに適用してしまうため、exrと大文字のPNG拡張子のみ適用する
        if (System.IO.Path.GetExtension(assetPath) == ".exr" || System.IO.Path.GetExtension(assetPath) == ".EXR" || System.IO.Path.GetExtension(assetPath) == ".PNG")
        {
            Debug.Log(assetPath);

            importer.textureCompression = TextureImporterCompression.Uncompressed;
            importer.sRGBTexture = false;
            importer.npotScale = TextureImporterNPOTScale.None;
            importer.mipmapEnabled = false;
            importer.filterMode = FilterMode.Point;
            importer.maxTextureSize = 4096;
        }
    }
}

3. VertexShaderでの処理

PivotPainter2をUnityで使う場合、UEからの変換を行う必要があります。Z-upの左手系からY-upの左手系に変換し、その後座標情報を1/100に縮小します。UEではVertexOffsetにpivot座標を渡す処理になっていますが、私はpivot座標を使用して原点に戻す方法を採用しています。

CustomTextureImport.shader
Texture2D _PivotPosATex;
Texture2D _XVecterATex;
SamplerState SamplerState_Point_Repeat;

float LineearSine(float value, float preiod)
{
    float frac_value = frac((value + (preiod * 0.25)) % preiod);
    float Lerp_value = lerp(frac_value * 2, (1 - frac_value) * 2, floor(frac_value * 2));
    return ((3 - (Lerp_value * 2)) * Lerp_value) * Lerp_value;
}
InFrag vert (InVertex v)
{
    InFrag o;

    float4 PivotPos = _PivotPosATex.SampleLevel(SamplerState_Point_Repeat, v.uv2.xy,0);
    //UE空間からUnity空間への変換
    PivotPos.xyz *= 0.01;
    PivotPos.xyz = float3(-PivotPos.x, -PivotPos.y, PivotPos.z);

    float4 XVecter = _XVecterATex.SampleLevel(SamplerState_Point_Repeat, v.uv2.xy,0);
    //UE空間からUnity空間への変換
    XVecter.xyz = float3(-XVecter.x, -XVecter.y, XVecter.z);

    //親子構造から拡縮順番を作成するコード
    float hierarchy_value = 1-(clamp((( XVecter.a * 6.0) + 1) - ((6.0 + 1) * LineearSine(_Time.y / 5, 5.0f)), 0, 1));
    //一度ピボットポイントを使用しグループを原点に戻し、回転や拡縮を加えて戻す。
    v.vertex.xyz -= PivotPos.xyz ;
    v.vertex.xyz *= hierarchy_value;
    v.vertex.xyz += PivotPos.xyz ;

    o.vertex = TransformObjectToHClip(v.vertex.xyz);
    
    return o;
}

4. 親子関係について

PivotPainterの親子関係に関する具体的な記事は見つかりませんでしたが、ここでは簡単にそのコードについて説明します。

PivotPainter2では、テクスチャのアルファチャンネルに情報を設定できます。今回は「Hierarchy Depth(階層の深さ)」を使用しています。このパラメータは、Blenderでメッシュの親子関係を数値として保存したものです。

Hierarchy Depthを使って、親子関係を深度情報として取得します。また、Parent indexなどの親子関係を浮動小数点として保存する方法もあります。

5. まとめ

PivotPainterは、状況や目的に応じてテクスチャに必要最低限の情報を格納し、それを最大限にシェーダーで活用することで、軽量かつダイナミックな頂点アニメーションを実現する仕組みです。

情報が少なく、活用事例も主にUnreal Engine(UE)に限られるため、今回の記事ではUnityでの活用方法を提示することを目的としました。ご指摘やご意見がありましたら、コメントにてお寄せください。

また下記の記事およびツールを引用、使用しています。
https://qiita.com/Muteriku/items/857e02ac746b091a73f3
https://github.com/Gvgeo/Pivot-Painter-for-Blender

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0