Unity 遍历子物体的颜色和通过mesh三角网格计算不规则plane面积

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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值