ぐーるらいふ

しがないリーマンの記録。遊びのunityのメモ帳にしたい。

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

MeshとPlaneは作った

ghoul-life.hatenablog.com
ghoul-life.hatenablog.com
前回、前々回で必要なものは用意出来た。
ではこの2つを使ってMeshを実際に切ってみよう。

planeの交点の計算

とはいえ、いきなり切るわけにはいかない。
まずはPlaneと三角形の交点を計算しなければならない。
計算してみよう。




Cross Point Check source file
(このソースファイルは後述のCutter.csの一部分を切り出したもの。
プロジェクトには入れなくてもOK)


一点の頂点から別の二つの頂点に対してRayを作る。

f:id:ghoul_life:20170519000955p:plain

そのRayがPlaneに当たるまでを計算してその距離を測れば
交点を計算出来る。

f:id:ghoul_life:20170519001103p:plain

実行した結果はこんな感じだ。
わかりやすく頂点にSphereを表示するようにしている。
引いた線と三角形の辺の交点が求められているのがわかる。

f:id:ghoul_life:20170518170725g:plain

後は切るだけ

ここまで来たらもう切るだけだ。
カットするということは2つのオブジェクトに分ける
という意味に捉えることが出来る。

片側のグループの頂点数は3、
もう片方のグループの頂点数は4になるように当てはめて、
個別にMeshを作ってあげれば完成だ。




Mesh Cutter source file


気になるのは

cross = Vector3.Cross(pos[triIdx2] - pos[triIdx0], pos[triIdx1] - pos[triIdx0]);
inner = Vector3.Dot(cross, Camera.main.transform.forward);

ここだろうか。
これは、頂点インデックスを計算したときに裏側を向いているかどうかをチェックしていて、
裏側を向いてしまっていたら反転させてあげているだけだ。

http://www.sousakuba.com/Programming/gs_polygon_inside_outside.html

頂点インデックスを元にしたベクトルABとBCの外積が0より大きければ表、小さければ裏になる。
ここではカメラの方を向いているかで調べてしまっているが、本来ならnormalの方向でチェックするのがいい。

実行した結果はこんな感じだ。カットできた。

f:id:ghoul_life:20170518174330g:plain

切って生成したオブジェクトにRigidbodyを付ける、などすれば
ゲームに実用出来るだろう。

ここまでで基本的な流れは抑えられる。簡単でしょう?
が、そう思ったやつから死んでいく…。