• Unity插件


    将静态模型(带MeshFilter)按指定轴向、指定距离克隆一个镜像物体出来,思路很简单,将模型的顶点坐标按指定轴取反,并累加上设定的距离值,然后就完毕了!不过,因为镜像体的顶点镜像于之前模型的顶点,所以三角面的渲染顺序要变,面的渲染,在unity中,因为一个三角面是以这个三角面的三个组成顶点的顺时针顺序渲染的,镜像颠倒以后,面的渲染顺序正好相反,模型的面正好全部渲染到相反方向(不过感觉像是一个做双面材质的笨办法),这里将所有三角面保存的顶点信息整体倒置一遍就正好倒置了所有面的渲染方向了。

    感觉有点绕,例如,一个面有三个顶点组成,分别是1,2,3,他们是这样分布的:


    渲染顺序为1,2,3的话,就是渲染的面向屏幕之外的这个面,渲染顺序为1,3,2的话,就是渲染的面向屏幕之内的这个面。


    基本情况就是这样了。


    接下来是代码:



    第一步:


    重新生成镜像物的顶点:

        /// <summary>
        /// 生成镜像顶点
        /// </summary>
        Vector3[] GenerateVertices(Vector3[] oldVertices)
        {
            Vector3[] newVertices = oldVertices;
            //镜像所有顶点
            switch (_MirrorDirection)
            {
                case MirrorDirection.x:
                    for (int i = 0; i < newVertices.Length; i++) newVertices[i].x = newVertices[i].x * -1 + _MirrorDistance;
                    break;
                case MirrorDirection.y:
                    for (int i = 0; i < newVertices.Length; i++) newVertices[i].y = newVertices[i].y * -1 + _MirrorDistance;
                    break;
                case MirrorDirection.z:
                    for (int i = 0; i < newVertices.Length; i++) newVertices[i].z = newVertices[i].z * -1 + _MirrorDistance;
                    break;
            }
    
            return newVertices;
        }



    第二步:


    重新生成镜像物的三角面

        /// <summary>
        /// 生成镜像三角面
        /// </summary>
        int[] GenerateTriangles(int[] oldTriangles)
        {
            int[] newTriangles = new int[oldTriangles.Length];
            //将所有面的顶点渲染顺序颠倒
            for (int i = 0; i < newTriangles.Length; i++)
                newTriangles[newTriangles.Length - i - 1] = oldTriangles[i];
    
            return newTriangles;
        }



    第三步:


    重新生成镜像物的材质

        /// <summary>
        /// 生成镜像材质
        /// </summary>
        Material GenerateMaterial(Material oldMaterial)
        {
            Material newMaterial = new Material(oldMaterial);
            //不透明
            if (_MirrorMaterialAlpha >= 1.0f)
            {
                SetMaterialRenderingMode(newMaterial, RenderingMode.Opaque);
                if (newMaterial.HasProperty("_Color"))
                {
                    newMaterial.SetColor("_Color", _MirrorMaterialColor);
                }
            }
            //透明
            else
            {
                SetMaterialRenderingMode(newMaterial, RenderingMode.Fade);
                if (newMaterial.HasProperty("_Color"))
                {
                    _MirrorMaterialColor.a = _MirrorMaterialAlpha;
                    newMaterial.SetColor("_Color", _MirrorMaterialColor);
                }
            }
    
            return newMaterial;
        }


    属性面板如下:



    Mirror direction:镜像轴

    Mirror Distance:镜像距离

    Mirror Material Alpha:镜像透明度

    Mirror Material Color:镜像颜色



    效果图如下:


    Z轴正反镜像:

     


    Y轴正反镜像:

     


    X轴镜像:



    全方位镜像:



    在角色脚底镜像之后加一层水面用做倒影其实效果还不错的,当然只能是静态物体。


    -----by MeshEditor

  • 相关阅读:
    Caused by: org.xml.sax.SAXParseException; lineNumber: 29; columnNumber: 107; 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mucp.QRTZ_TRIGGERS' doesn't exist
    ava.lang.IllegalArgumentException: 在方法名称中发现无效的字符串, HTTP 方法名必须是有效的符号
    activitemq启动时出现 ERROR: java.lang.RuntimeException: Failed to execute start task. Reason: java.lang.IllegalStateException: BeanFactory
    sql 替换
    tomcat 点击startup.bat会闪退
    java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
    运行rviz出现以下问题
    rosplan ---AI planning
    ros 地图.pgm文件编辑
  • 原文地址:https://www.cnblogs.com/liang123/p/6325842.html
Copyright © 2020-2023  润新知