Unity 通过三角网格计算不规则plane面积
注意点预制体需要勾选,这里我需要的是单面的面积,所以进行了/2,如果需要的是表面积,则不需要/2
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
public class MandalaCollector : MonoBehaviour
{
public GameObject parentObject; // 父物体
void Start()
{
// 这里可以初始化一些内容
}
void OnTriggerEnter(Collider other)
{
// 当其他物体触碰到这个物体时触发
if (other.gameObject.CompareTag("TriggerObject"))
{
CollectMandalaData();
}
}
void CollectMandalaData()
{
UnityEngine.Debug.Log("开始收集Mandala数据");
List<MandalaData> mandalaDataList = new List<MandalaData>();
// 递归遍历父物体的所有子物体
CollectMandalaDataRecursive(parentObject.transform, mandalaDataList);
// 输出记录的数据
foreach (MandalaData data in mandalaDataList)
{
UnityEngine.Debug.Log("Color: " + data.color + ", Area: " + data.area + ", name: " + data.name);
}
}
void CollectMandalaDataRecursive(Transform parent, List<MandalaData> mandalaDataList)
{
// 遍历当前层级的所有子物体
foreach (Transform child in parent)
{
// 检查子物体的Tag是否为"mandala"
if (child.CompareTag("mandala"))
{
UnityEngine.Debug.Log("找到mandala物体: " + child.name);
// 获取子物体的材质和面积
Renderer renderer = child.GetComponent<Renderer>();
MeshFilter meshFilter = child.GetComponent<MeshFilter>();
if (renderer != null && meshFilter != null)
{
Material material = renderer.material; Color color = material.color; // 计算Mesh的面积
float area = CalculateMeshArea(meshFilter.mesh, child.lossyScale); // 创建MandalaData对象并添加到列表
MandalaData data = new MandalaData(color, area, child.name);
mandalaDataList.Add(data);
}
}
// 递归遍历子物体的子物体
CollectMandalaDataRecursive(child, mandalaDataList);
}
}
// 结构体来存储颜色和面积
struct MandalaData
{
public Color color;
public float area;
public string name;
public MandalaData(Color color, float area, string name)
{
this.color = color;
this.area = area;
this.name = name;
}
}
float CalculateMeshArea(Mesh mesh, Vector3 lossyScale)
{
float area = 0;
Vector3[] vertices = mesh.vertices;
int[] triangles = mesh.triangles;
// 遍历所有三角形
for (int i = 0; i < triangles.Length; i += 3)
{
Vector3 point1 = vertices[triangles[i]];
Vector3 point2 = vertices[triangles[i + 1]];
Vector3 point3 = vertices[triangles[i + 2]];
point1 = new Vector3(point1.x * lossyScale.x, point1.y * lossyScale.y, point1.z * lossyScale.z);
point2 = new Vector3(point2.x * lossyScale.x, point2.y * lossyScale.y, point2.z * lossyScale.z);
point3 = new Vector3(point3.x * lossyScale.x, point3.y * lossyScale.y, point3.z * lossyScale.z);
//计算边长
float l1 = (point2 - point1).magnitude;
float l2 = (point3 - point2).magnitude;
float l3 = (point1 - point3).magnitude;
float p = (l1 + l2 + l3) * 0.5f;
area += Mathf.Sqrt(p * (p - l1) * (p - l2) * (p - l3))/2;
}
return area;
}
}