ぐーるらいふ

底辺。

【Unity】メッシュカッターについて その4

は?(威圧)

なんだよ、前回で終わりじゃねーのかよ。
と悪態をつきたい所だが、まだ終わりじゃない。

前回までは流れを理解するためのkindar_codeに過ぎない。
しっかり実践寄りに調整し直してみよう。
ゴールはcubeを切るところまでだ。

f:id:ghoul_life:20170523131439g:plain


いきなりだけど、まるっとproject化してgithubに公開しておいた。
ゲームにも応用が出来そうなRigidbody入りだ。
github.com

あんまり変わらない?

概ねの流れはここまでで把握できている。
後は複数のものに対応出来るように変えた。

meshのポリゴン数が増えるので、ちゃんと三角形ずつ計算
するようにしたり

for (var i = 0; i < meshTriangles.Length; i += 3)
{

var idx0 = meshTriangles[i];
var idx1 = meshTriangles[i + 1];
var idx2 = meshTriangles[i + 2];

渡されたmeshからちゃんと頂点位置を計算するようにしたり

// 頂点位置をscaleやpositionに合わせてしっかり計算しないとおかしくなる
// あれ、もうmatrixで計算したほうがいい?
var v1 = Vector3.Scale(meshVertices[idx0], meshScale) + meshPos;
var v2 = Vector3.Scale(meshVertices[idx1], meshScale) + meshPos;
var v3 = Vector3.Scale(meshVertices[idx2], meshScale) + meshPos;

verts.Add(v1);
verts.Add(v2);
verts.Add(v3);

// そのポリゴンの法線を計算しておく
var normal = Vector3.Cross(meshVertices[idx2] - meshVertices[idx0], meshVertices[idx1] - meshVertices[idx0]);

後はゲームっぽさを出して複数のinputに対応出来るようにしたり
rigidbodyつけたり
と調整しただけ。

この後

ここまでの流れが把握できていれば、もうなんでも出来る。
SkinedMeshに対応してあげればunityちゃんだって切れるし、
切り口が気になるなら、そこを塞ぐmeshを作るプログラムを組むのもいい。
(交点を全部保持しておいて、そこを繋ぐようなmesh作るだけでいい?)
submeshがあるオブジェクトも同じように計算していくだけだ。
また、uvやMaterialsが入っていないのでそれを追加してもいい。

やってみて

MeshCutterなんて検索すればいくらでもあるし、
それを使えば機能は満たす事が出来るだろう。
だけど、理解しているか否かでは雲泥の差がある。
「ライブラリが対応していないので出来ません。」
が通用する世界では無いのだろうと思っている。

Unityはやっぱり楽しい。
仕事で使ってみたいですね。