水ノ茉の宣伝
準備中...
ゲームを作る予定なの水ノ茉
始まり
ハードエッジです。
ハードなエッチではなく、ハードなエッジです。
えちえちではないのです。
アホな導入はさておき、約11ヶ月ほど前のことです。
実装方法は気が向いたら公開します。
https://kafues511.jp/2024/12/28/2010/
気が向いたのでツールを公開します。
実装方法はナイショなのです。
計算部分はUnityの先行事例があるはずなのでググれば見つかるとは思います。
リリース
基本的には最新バージョンの使用を推奨します。
バージョンが上がるということは筆者が使っていて不満を感じたということなので。
導入方法
UnrealEngineのバージョンに応じた配布物を取得します。
プロジェクトのPluginsフォルダに配置します。

GenerateProjectFiles.batを叩きます。
uprojectをコードエディタ等で開きます。

初回起動時はプラグインを明示的に無効化します。
原因は調べていませんが、未指定だと勝手にプラグインビルドが進行します。然しながら実装を隠蔽している都合、ビルドに必要なデータが一切存在しません。そのため、当然の如くビルドに失敗して永遠と起動できないというオチです。
{
"Name": "HardEdgeMaker",
"Enabled": false
}

ソリューションを起動してUE・エディタを立ち上げます。
編集 > プラグインをクリックします。

カテゴリのRenderingを開くとHardEdgeMarkerがあるはずなので、チェックを入れて有効化します。

警告は読んで同意出来るならはいをクリックしてください。同意できない場合は本プラグインの使用は諦めましょう。どんまい。

UE・エディタを閉じて再度起動します。
再起動後になにかしら警告ウィンドウが表示された場合は、無視して進行する系の選択を選んでください。Google翻訳を通せば読める程度の日本語が出てくるはずです。
起動後にHardEdgeMakerが表示されていれば導入完了です。

使い方
HardEdgeMakerをクリックします。

Skeletal Mesh Assetにハードエッジな法線を作成したい対象を突っ込んでください。
Hash Scaleは初期値から変更しないでください。
頂点座標にHashScaleを乗算して、それを元にハッシュ値を作成して、ハッシュ値から同じであろう頂点を割り出してハードエッジを計算しているので、とりあえずデカい値であればいいのです。数値が小さいと同じの判定がガバになるので、必要以上に頂点が密集してしまうのです。

Skeletal Mesh Assetをセットした状態でBake Hard Edgeをクリックすると処理が進行します。注意点としてRestore処理は存在しないため、ベイク完了後に保存をすると、元の頂点カラーの復元が出来ません。再インポート必須です。

ベイクが完了するとハードエッジな法線が頂点カラーのRGBにベイクされます。Alphaは書き換えていないので、ユーザーが任意の値を保持したい場合は、Alphaを使ってください。
ベイク結果に不満がなければSkeletalMeshAssetを上書き保存してください。保存せずにUE・エディタを閉じるとベイク結果が消えます。間違えてベイクしたり、結果が不満だったら保存せずに閉じましょう。
必要性はないと思いますが、頂点カラーを見たい場合はSkeletalMeshAssetから確認できます。他にもメッシュペイントから見る方法もあります。
ノードはこんな感じで組みます。
頂点カラーに格納する都合UNORMにしてあるので、-1.0 ~ 1.0に変換して再度正規化。
アニメーションに対応するためにタンジェント空間で格納してあるのでそれをビューに変換。
以下のカスタムノードを使わない場合は、ワールドに変換してそのまま突っ込むでも良いです。

カスタムノードの中身はこんな感じです。
float4 ClipPos = mul(float4(WorldPosition + LWCHackToFloat(ResolvedView.PreViewTranslation), 1.0), View.TranslatedWorldToClip);
float2 Offset = mul((float2x2)View.ViewToClip, Norm.xy);
ClipPos.xy += Offset * ClipPos.w * Thickness * View.ViewSizeAndInvSize.z / View.ViewToClip._11;
return mul(ClipPos, (View.ClipToTranslatedWorld)).xyz - LWCHackToFloat(ResolvedView.PreViewTranslation) - WorldPosition;
細かい説明は以前書いたのでそちらを参照です。
差分として5.4→5.6では、マテリアルスロットごとにオーバーレイマテリアルをセットできるようになったので、かなり拡張性が向上しています。
注意点
- LOD0のみ対応しています。
- SkeletalMeshのみ対応しています。
- StaticMeshで背面法を使いたいケースが筆者に発生したら対応すると思う。
- クラッシュしたらスマン。
おわり!!!
モック程度なら使えると思います。
それ以降の制作フローに突入したらアーティストを雇って作ってもらうのが理想です。
プロシージャルは便利ですが品質に限界を感じます。
あと未来のわたし、プラグインのアイコン画像をそのうち変えてね。めっちゃ適当なの。
雑談
エロゲの本編ネタが全然溜まらなくて下書きだけが増えていく始末。
エロゲとは違うけどえっちなことを進行中。
えちえち Soft Body Simulation
クロスシミュで物理の悪用に少しだけ目覚めました。
次は揺れモノ(おっぱい、おしり、太もも)です。
任意形状のテストです。縫合をサボっているのでぱっかり割れています。
これに内部構造であるボリュームを付与してあげるとクロスな物理と差別化です。描画分野だとライトプローブをイメージすると分かりやすいですね。
我ながらなんのゲームを作るための機能を作っているのでしょうか。
よく分かりません。
というか現状のプロジェクトでこれを活用できるものはないんですよね。
ないんですよ。
そう。ないの。
………作るか。
シナリオ担当に我儘言ってきます。
描画と物理を扱えると表現の幅が広がりますね。
こういう技術を私利私欲のために使うのマジで趣味って感じで楽しい。
つんつん。
ソフトボディの実装いくらなんでも楽しすぎる。
ここからは時系列が無茶苦茶です。
実装が楽しすぎて書き留める前に作業を始めちゃって時系列がないなったです。
エネルギーの伝播が強すぎて常に微動してたから調整して、えっちな揺れ方になるようにしたり。
SkeletalMeshComponentの異なるセクションに変位を伝播させて着衣を出来るようにしたり。
アニメーション後のコリジョンのための座標変換に割と大苦戦。
ランタイムとシェーダーでColとRowが違うのがウザ過ぎた。
機能開発は達成後に得られるドーパミンがマジでヤバい。癖になる。
これだから内製開発は楽しい。表現が最悪だけどコスパの悪い自慰行為。
複数のセクションに対してソフトボディを付与できるようにして、部位ごとのパラメタ調整を可能にしたり。
えいえい。おこったー?
モーフを使わずに凸凹変形が可能になるのがロマンです。やばいです。
法線変位を導入して変形の視認性を向上させたり。
異なるSkeletalMeshComponentに対して変位を伝播させて着衣の幅を広げたり。
GPUでLineTraceした結果をReadbackして、それを元に接地をしてみたり。
初めてコントロールリグを触ったけど、これ、すごいね。便利。
残りはインターフェースを拡充してプロダクトに耐えられるようにするだけです。
ひどく疲れたけど楽しかったわ。
そして困ったことにソフトボディ熱がマジで冷めません。
発熱し過ぎた結果、流れと勢いに身を任せてえちえちなゲームを作ることになりました。
約1時間程の出来事です。
数か月後に頭を抱えることでしょう。
でもこのソフトボディを最大限活かせるプロダクトがエロしか思いつかんかった。
致し方なし。
ChaosFleshを使ったことないから分らんけど、あれ重そうなんだよね、CPUだから。
ISPCで高速化してるといってもハードウェア設計的にGPUの並列には勝てないでしょ?
つまりうちの子の方が魅力的ってこと。
それを証明するような作品になるといいですね。
最終的な制作可否はモックの出来次第なので、まだ他人事です。作るの私だけど。
予定ではキリのいいところで区切ってフルイド開発に移行でしたが、それはまた今度にしましょう。
むふふ。楽しすぎるです。
