Unity实现物体镜像

通过一个模型的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);

 

 

 

效果图:

 


感觉也没有什么好说的,只是理下代码

可以在这里下载参考该源码点击打开链接

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值