【第004问 Unity中如何快捷查看Mesh的Normal?】

一、如何在Unity中快捷查看Cube、Circle等模型的法线?

刚开始学习模型的法线的时候总是想看看法线在哪里,是怎么表现的。当然你可以直接使用Blender或者3D max等工具查看。如果在Unity中我怎么样能够快速的查看一个模型的法线,下面就先看看几个效果;然后附上源码:

1. 查看Cube的Normal
【第004问 Unity中如何快捷查看Mesh的Normal?】

从上面的Cube中可以看到每个顶点都有3个法线,因为一个每个顶点都被3个面所共用

2.查看Sphere的法线:
【第004问 Unity中如何快捷查看Mesh的Normal?】

可以看到Sphere的法线是不是想刺猬一样,每个顶点的法线都可以清晰看见

3.查看Plane的法线
【第004问 Unity中如何快捷查看Mesh的Normal?】

平面的法线可以清晰看到每个三角形顶点的法线

二、代码和操作步骤

  1. 模型必须要有MeshFilter
  2. MeshFilter必须要有Mesh
  3. MeshRender可以有也可以没有,如果没有你看到的只是Mesh,不能看到图片

源码如下:

using UnityEngine;
using UnityEditor;


[CustomEditor(typeof(MeshFilter))]
public class ShowNormals : Editor
{
    private MeshFilter meshFilter;

    private Mesh mesh;

    //顶点个数
    private int vertextCount;

    //顶点数组
    private Vector3[] vertices;

    //顶点法线
    private Vector3[] normals;

    private void OnEnable()
    {
        meshFilter = target as MeshFilter;
        if (meshFilter != null)
            mesh = meshFilter.sharedMesh;
    }


    /// <summary>
    /// 场景绘制
    /// </summary>
    private void OnSceneGUI()
    {
        if (mesh != null)
        {
            //当前对象的操做从局部空间转换到世界空间 这样在下面的操作位置即可同步 否则位置是不会同步的
            Handles.matrix = meshFilter.transform.localToWorldMatrix;
            Handles.color = Color.green;

            vertices = mesh.vertices;
            normals = mesh.normals;
            vertextCount = mesh.vertices.Length;
            //采用从顶点的位置[法线的起点】到法线的终点位置,既可以显示出当前顶点的法线
            for (int index = 0; index < vertextCount; index++)
            {
                Handles.DrawLine(vertices[index], vertices[index] + normals[index]);
            }
        }
    }
}

结语: 法线的可视化对于法线的学习,很有帮助-【valaki】

上一篇:《向量》Unity 中自己实现Vector3.Angle函数


下一篇:【愚公系列】2022年02月 U3D全栈班 001-Unity基本认识