Last active
March 11, 2020 09:17
-
-
Save stilllisisi/3eb6de107288c86e839dcbc233d3436c to your computer and use it in GitHub Desktop.
【游戏-网格】Mesh绘制交互网格
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//思路 | |
//1.绘制网格(使用Mesh网格生成圆柱网格https://gist.github.com/stilllisisi/fdd2c9b0035b6180c95573193038806a) | |
//2.使用B曲线平滑连接和排序网格 | |
//3.销毁网格 | |
//4.彩虹滚动使用shader实现 | |
//实现 | |
//1. 连接的网格 | |
//先生成了一系列小网格搭配BOX碰撞,为了让我们后期能对他进行裁剪和逐步消失功能。 | |
//因为我们知道网格每个顶点的序号,所以只需要根据鼠标方向生成下个网格,旧网格的结束顶点的坐标改成新网格起始顶点的坐标,就可以实现网格连接。 | |
public void LinkNext(Vector3[] pos, float lerp = 1f) | |
{ | |
for (int i = 0; i < pos.Length; i++) | |
{ | |
//将坐标转换为本网格的局部坐标 | |
pos[i] = transform.InverseTransformPoint(pos[i]); | |
} | |
for (int i = Verts.Length - 1, j = pos.Length - 1; j >= 0; i--, j--) | |
{ | |
//按顺序赋值给本网格的末尾顶点 | |
Verts[i] = Vector3.Lerp(Verts[i], pos[j], lerp); | |
Normals[i] = new Vector3(Verts[i].x, Verts[i].y, 0); | |
} | |
MeshFile.mesh.vertices = Verts; | |
MeshFile.mesh.normals = Normals; | |
} | |
//2. 平滑网格 | |
//用B曲线来平滑鼠标路径的顶点。 | |
public static Vector3 CatmullRom(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float i) | |
{ | |
return 0.5f * ((2 * p1) + (-p0 + p2) * i + (2 * p0 - 5 * p1 + 4 * p2 - p3) * i * i + (-p0 + 3 * p1 - 3 * p2 + p3) * i * i * i); | |
} | |
//3. 网格的消失和切割 | |
//逐步消失我们可以使用刚体的缩放变换,根据模型的尺寸进行顶点偏移, | |
public void ScaleMesh(float inter, Axis axis, bool reverse = false) | |
{ | |
Vector3[] _verts = new Vector3[Verts.Length]; | |
Vector2[] _uvs = new Vector2[Uvs.Length]; | |
Vector3 _v0; | |
Vector2 _uv; | |
if (reverse) | |
{ | |
_v0 = MeshFile.mesh.bounds.min; | |
_uv = minUV; | |
} | |
else | |
{ | |
_v0 = MeshFile.mesh.bounds.max; | |
_uv = maxUV; | |
} | |
for (int i = 0; i < Verts.Length; i++) | |
{ | |
switch (axis) | |
{ | |
case Axis.X: | |
_verts[i] = new Vector3(Mathf.Lerp(Verts[i].x, _v0.x, inter), Verts[i].y, Verts[i].z); | |
_uvs[i] = Uvs[i]; | |
break; | |
case Axis.Y: | |
_verts[i] = new Vector3(Verts[i].x, Mathf.Lerp(Verts[i].y, _v0.y, inter), Verts[i].z); | |
_uvs[i] = Uvs[i]; | |
break; | |
case Axis.Z: | |
_verts[i] = new Vector3(Verts[i].x, Verts[i].y, Mathf.Lerp(Verts[i].z, _v0.z, inter)); | |
_uvs[i] = new Vector2(Uvs[i].x, Mathf.Lerp(Uvs[i].y, _uv.y, inter)); | |
break; | |
case Axis.ALL: | |
_verts[i] = Vector3.Lerp(Verts[i], _v0, inter); | |
_uvs[i] = Vector2.Lerp(Uvs[i], _uv, inter); | |
break; | |
} | |
MeshFile.mesh.vertices = _verts; | |
MeshFile.mesh.uv = _uvs; | |
} | |
} | |
//上面的代码让我们在模型保持UV不变的情况下在一个轴向上进行缩放。 | |
//因为我们的线是一列网格组成的,当缩放为0时,销毁自身,告诉下个网格继续缩放即可。 | |
//当被切割时,切到哪个box Collider,通知那个模型的前后网格开始缩放销毁操作即可。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://gameinstitute.qq.com/community/detail/128655