通过一个模型的MeshFilter和MeshRenderer组件来获取模型的顶点与网格信息
按指定轴向、指定距离克隆一个出来
【生成镜像顶点】
将顶点位置按轴方向取反方向,返回各个顶点信息
private Vector3[] GenerateVertices(Vector3[] backVertices)
{
Vector3[] newVertices = backVertices;
switch(m_mirrorDir)
{
case MirrorDir.X:
for (int i = 0; i <= newVertices.Length - 1;i++ )
{
newVertices[i].x = newVertices[i].x * -1 + m_mirrorDis;
}
break;
case MirrorDir.Y:
for (int i = 0; i <= newVertices.Length - 1; i++)
{
newVertices[i].y = newVertices[i].y * -1 + m_mirrorDis;
}
break;
case MirrorDir.Z:
for (int i = 0; i <= newVertices.Length - 1; i++)
{
newVertices[i].z = newVertices[i].z * -1 + m_mirrorDis;
}
break;
default:
break;
}
return newVertices;
}
【生成镜像三角面】
int[] GenerateTriangles(int[] backTriangles)
{
int[] newTriangles = new int[backTriangles.Length];
//将所有面的顶点渲染顺序颠倒
for (int i = 0; i < newTriangles.Length; i++)
{
newTriangles[newTriangles.Length - i - 1] = backTriangles[i];
}
return newTriangles;
}
【生成镜像材质】
private Material GenerateMaterial(Material backMeterial)
{
Material newMaterial = new Material(backMeterial);
//不透明
if (m_mirrorMaterialAlpha >= 1.0f)
{
SetMaterialRenderingMode(newMaterial, RendererMode.Opaque);
if (newMaterial.HasProperty("_Color"))
{
newMaterial.SetColor("_Color", m_mirrorMaterialColor);
}
}
//透明
else
{
SetMaterialRenderingMode(newMaterial, RendererMode.Fade);
if (newMaterial.HasProperty("_Color"))
{
m_mirrorMaterialColor.a = m_mirrorMaterialAlpha;
newMaterial.SetColor("_Color", m_mirrorMaterialColor);
}
}
return newMaterial;
}
【生成mesh】
GameObject mirror = new GameObject("Mirror");
mirror.transform.position = this.transform.position;
mirror.transform.rotation = this.transform.rotation;
mirror.transform.localScale = this.transform.localScale;
mirror.transform.SetParent(this.transform);
mirror.AddComponent<MeshFilter>();
mirror.AddComponent<MeshRenderer>();
//镜像的网格
Mesh mesh = new Mesh();
mesh.Clear();
mesh.vertices = GenerateVertices(GetComponent<MeshFilter>().mesh.vertices);
mesh.triangles = GenerateTriangles(GetComponent<MeshFilter>().mesh.triangles);
mesh.uv=GetComponent<MeshFilter>().mesh.uv;
mesh.name = "mirror";
//重新计算发现(刷新显示)
mesh.RecalculateNormals();
mirror.GetComponent<MeshFilter>().mesh = mesh;
mirror.GetComponent<MeshRenderer>().material = GenerateMaterial(GetComponent<MeshRenderer>().material);
效果图:
感觉也没有什么好说的,只是理下代码
可以在这里下载参考该源码点击打开链接