Unity中如何查看三角形的中心法线
在004中可以快速的查看每个顶点的法线,那么如何查看每个三角形的中心法线呢?
一、先看看具体查看三角形中心法线的动画效果
- 查看Plane中每个三角形的中心法线
- 查看Cube中每个三角形的中心法线
- 查看Capsule中每个三角形的法线
以上就是通过对三种Unity自带3D Object的三角形中心法线的查看,相对来说还是比较直观的,个人觉得对于学习还是比较友好。
二、显示三角形中心法线步骤
- 获取三角形顶点
- 每3个顶点分成一个三角形
- 根据三角形3个顶点计算出两个向量,注意顺序【顺时针和逆时针】
- 根据两个向量使用Vector3.Cross计算出垂直于三角形的法线
- 根据3个顶点计算出三角形的中心点
- 根据中心点和法线绘制出每个三角形的中心显示法线
三、具体源码
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(MeshFilter))]
public class ShowTrianglesNormals : Editor
{
private MeshFilter meshFilter;
private Mesh mesh;
//顶点数组
private Vector3[] vertices;
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;
vertices = mesh.vertices;
//计算面的法线
//总的三角形索引
int[] triangles = mesh.triangles;
//总的三角形个数
int triangelCount = triangles.Length / 3;
Handles.color = Color.magenta;
//计算出每个三角形的法线
for (int i = 0; i < triangelCount; i++)
{
int index = i * 3;
//计算每个三角形的法线
Vector3 vertext_start = vertices[triangles[index]];
Vector3 vertext_middle = vertices[triangles[index + 1]];
Vector3 vertext_end = vertices[triangles[index + 2]];
//计算三角形的法线 这里需要区分顺时针和逆时针的问题
Vector3 startToMiddle = vertext_middle - vertext_start;
Vector3 middleToEnd = vertext_end - vertext_middle;
//计算出三角形的中心点
Vector3 triangleCenter = Vector3.zero;
triangleCenter.x = (vertext_start.x + vertext_middle.x + vertext_end.x) / 3.0f;
triangleCenter.z = (vertext_start.z + vertext_middle.z + vertext_end.z) / 3.0f;
triangleCenter.y = (vertext_start.y + vertext_middle.y + vertext_end.y) / 3.0f;
//计算法线 这里注意计算法线采用的是顺时针还是逆时针的问题 如果是逆时针 法线则会相反
Vector3 normal = Vector3.Cross(startToMiddle, middleToEnd).normalized;
Handles.DrawLine(triangleCenter, triangleCenter + normal);
}
}
}
}
结语:…何为自由?【valaki】