Unityのメッシュ変形
こんにちは。無謀な挑戦を続けるプログラマーikosamiです。
2019年3月のUnity1週間ゲームジャム 「unity1week」に参加して、
下のgif動画のようなmesh変形を作りました。
本記事では、このメッシュ変形について解説していきます。

https://unityroom.com/games/earth_connected
ゲーム性が微妙ですが、サンプルだと思って遊んでみてくれると嬉しいです。
変形できるオブジェクト
これを間違えてしまうと、後述の説明がすべて動かないので、先に説明しておきます。

メッシュ変形は、メッシュの頂点を移動させることで形を変えるものです。
そのため、CubeやQuadのように、頂点数が少ないものはまともに変形することはできません。
Cylinderも、頂点数が微妙なため、まともに動くか怪しいです。
後述の説明を実際に行う場合は、SphereやPlaneで行うことをお勧めします。
当然ですが、頂点数が多すぎる3Dモデルで行うと、
すさまじい処理時間がかかる可能性もあるのでご注意ください。
メッシュ変形の基礎部分
この記事を読んでいるということは、メッシュ変形はすごく複雑そうな印象があるかもしれません。
ですが、メッシュの変形は それほど難しくありません。
まずは、見た方が早いと思うので、最低限にシンプルなサンプルを作ってみました。
unityで作った新規C#ファイルのStartをこれと入れ替えただけで、もうメッシュは変形されます。
void Start () {
MeshFilter meshFilter = GetComponent<MeshFilter>();
Vector3[] vertices = meshFilter.mesh.vertices;
for (int i = 0; i < vertices.Length; i++)
{
if (vertices[i].y > 0)
{
vertices[i] += new Vector3(0.3f, 0.3f, 0);
}
}
meshFilter.mesh.vertices = vertices;
}
y座標がプラスの頂点だけ、位置をずらす処理です。 ※全頂点を動かすと、ただ移動するだけにしか見えませんです。
これを、Sphereに付けると、こんな感じになります。もう変形できてますね。

各頂点座標そのものは、オブジェクトのローカル座標
頂点座標の数値は空間上の座標ではありません。
頂点の座標(0,0,0)が、そのオブジェクトの中心位置になります。
そのため、オブジェクトの位置がどこにあろうとも、
中心を変形させた場合はオブジェクトの中心が変形します。

void Start()
{
MeshFilter meshFilter = GetComponent<MeshFilter>();
Vector3[] vertices = meshFilter.mesh.vertices;
for (int i = 0; i < vertices.Length; i++)
{
if (Mathf.Abs(vertices[i].x) < 0.2f && Mathf.Abs(vertices[i].z) < 0.2f)
{
vertices[i] += new Vector3(0, 3, 0);
}
}
meshFilter.mesh.vertices = vertices;
}
各頂点座標の移動量(距離のみ)
座標の位置そのものはオブジェクトの中心位置からの座標ですが、
メッシュの頂点情報のVector3の値を動かしたときに移動する距離は、オブジェクトを普通に動かした場合と同じ距離になります。
なので、全頂点をy+=3したものと、オブジェクト位置をy+=3したものは同じ位置になります。

つまり、オブジェクトを思い通りに移動させることができる人なら、
メッシュの頂点を思い通りに移動させることは可能です。
続く・・・
少し長くなりすぎたのと、次が少し長いため、一旦記事を分けます。
続きはこちら。
