美文网首页
Unity法线翻转(flip normal)

Unity法线翻转(flip normal)

作者: 函水 | 来源:发表于2016-08-01 12:53 被阅读0次

    直接上干货

            Vector3[] normals = line.GetComponent<MeshFilter>().mesh.normals;
            for (int i = 0; i < normals.Length; i++) {
                normals[i] = -normals[i];
            }
            line.GetComponent<MeshFilter>().mesh.normals = normals;
    
            int[] triangles = line.GetComponent<MeshFilter>().mesh.triangles;
            for (int i = 0; i < triangles.Length; i += 3) {
                int t = triangles[i];
                triangles[i] = triangles[i + 2];
                triangles[i + 2] = t;
            }
            line.GetComponent<MeshFilter>().mesh.triangles = triangles;
    

    刚开始想到做法线翻转,只想到了直接把法线取负值,就是第一段代码

            Vector3[] normals = line.GetComponent<MeshFilter>().mesh.normals;
            for (int i = 0; i < normals.Length; i++) {
                normals[i] = -normals[i];
            }
            line.GetComponent<MeshFilter>().mesh.normals = normals;
    

    结果是这样子:

    就是一个没有任何光线信息的样子(纯黑

    然后呢,我就一直百度,以求找到解决办法,百度了一个晚上,都是说,“为什么不到3dmax/MAYA中翻转法线呢”,你大爷的!

    然后转战Google,5分钟后解决问题= =

            int[] triangles = line.GetComponent<MeshFilter>().mesh.triangles;
            for (int i = 0; i < triangles.Length; i += 3) {
                int t = triangles[i];
                triangles[i] = triangles[i + 2];
                triangles[i + 2] = t;
            }
            line.GetComponent<MeshFilter>().mesh.triangles = triangles;
    

    加上了第二段代码之后,是这样子的:

    (是的,我做的是卡通渲染的描边,没使用shader)

    Mesh.vertices中,保存的是图形的顶点信息。
    Mesh.triangles中,保存的是对应于Mesh.vertices的顶点的索引。就是一个三角形在渲染中的三个顶点的顺序,所以Mesh.triangles的长度应该是3的倍数(Mesh.triangles的类型为int[])
    那为什么要交换第一点跟第三点的位置呢?


    假如现在一个三角形是由P0、P1、P2,三个点组成的一个三角形。
    那么,他的绘制的顺序应该是这样子的:

    呈现一个逆时针的样子。图形学中(前几天看蓝宝书看到的,忘了是OpenGL中的还是说图形学中都是这样,请指正。Ps. 应该是逆时针吧)将拥有逆时针环绕的多边形为正面。
    即上面这个三角形为正面
    若我们从屏幕后面那个方向看这个三角形的话,那你看到的是他的背面。
    当我们交换三角形的第一点跟第三点后,他的渲染顺序将变成这样子:

    变成了从P2到P1再到P0的这么一个顺序。即这个三角形现在是一个顺时针环绕,我们看到的这个面,是他的背面。
    在Unity中,默认的渲染是不会渲染背面的。
    这样子就会出现刚才的这个效果


    这是本人写的第一个文章,有什么不足之处,请指正。
    写本文的目的在于,苦苦寻找解决解决方法的您不会像我一样,找了一晚上的百度,啥都没找到。(Ps.这样应该能百度得到吧

    相关文章

      网友评论

          本文标题:Unity法线翻转(flip normal)

          本文链接:https://www.haomeiwen.com/subject/rsbxsttx.html