zoukankan      html  css  js  c++  java
  • 一个网格合并(weld)小工具

    在日常开发中会有需求合并多个Mesh网格,并且它们重合处的顶点也要合并,而并非合并成两个subMesh。

    而近期刚好在学习Geomipmap的细分,需要把多个mesh块进行合并,于是写了这个脚本。

    见下图,多对象合并前后对比:

    使用时传入多个MeshFilter,会返回对应Mesh,但是没做UV、顶点色这些,需要自己扩展:

    namespace Hont
    {
        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
    
        public static class MeshCombinerUtil
        {
            public static Mesh Combine(MeshFilter[] meshFilterArary, float weldDistance = 0.01f)
            {
                const int MESH_VERT_GAP = 10_0000;
    
                Dictionary<int, int> newTrianglesDict = new Dictionary<int, int>();
                List<int> newTrianglesList = new List<int>();
                List<Vector3> newVerticesList = new List<Vector3>();
                List<KeyValuePair<Vector3, int>> meshSlotList = new List<KeyValuePair<Vector3, int>>();
    
                int counter = 0;
                for (int i = 0; i < meshFilterArary.Length; i++)
                {
                    MeshFilter meshFilter = meshFilterArary[i];
                    Mesh mesh = meshFilter.sharedMesh;
    
                    Vector3[] verticesArray = mesh.vertices;
                    int[] trianglesArray = mesh.triangles;
    
                    for (int j = 0; j < trianglesArray.Length; j++)
                    {
                        int triangleIndex = trianglesArray[j];
                        int triangleIndexContainOffset = triangleIndex + i * MESH_VERT_GAP;
                        Vector3 vertex = verticesArray[triangleIndex];
                        vertex = meshFilter.transform.localToWorldMatrix.MultiplyPoint3x4(vertex);
    
                        if (!newTrianglesDict.ContainsKey(triangleIndexContainOffset))
                        {
                            KeyValuePair<Vector3, int> slotInfo = new KeyValuePair<Vector3, int>(Vector3.zero, -1);
                            for (int k = 0; k < meshSlotList.Count; k++)
                            {
                                KeyValuePair<Vector3, int> meshSlot = meshSlotList[k];
    
                                if (Vector3.Distance(meshSlot.Key, vertex) <= weldDistance)
                                {
                                    slotInfo = meshSlot;
                                    break;
                                }
                            } //检索网格交错列表
    
                            if (slotInfo.Value > -1) //如果网格交错列表里有
                            {
                                newTrianglesDict.Add(triangleIndexContainOffset, slotInfo.Value);
                            }
                            else //如果网格交错列表里没有
                            {
                                meshSlotList.Add(new KeyValuePair<Vector3, int>(vertex, counter));
                                newTrianglesDict.Add(triangleIndexContainOffset, counter);
    
                                ++counter;
                                newVerticesList.Add(vertex);
                            }
                        } //如果这个原始三角形索引字典里没有则初始化
    
                        newTrianglesList.Add(newTrianglesDict[triangleIndexContainOffset]);
                    }
                }
    
                Mesh newMesh = new Mesh();
                newMesh.SetVertices(newVerticesList);
                newMesh.SetTriangles(newTrianglesList, 0);
    
                return newMesh;
            }
        }
    }
  • 相关阅读:
    .NET应用架构设计—工作单位模式(摆脱程序代码的重要思想,反击DDD)
    ext Window点击右上角的关闭(Xbutton)加入监控事件
    HDU 2008 数字统计
    HTML5 CSS3 精美案例 : 达到VCD盒个性幻灯片
    Oracle表操作 (未完待续)
    oracle 统计语句 与常见函数的归纳(未完待续)
    Oracle 存储过程的创建,及触发器调用存储过程
    Oracle 数据乱码
    按列合并结果集
    Struts2 全局结果集-全局result节点设置,package设置abstract=true的实现
  • 原文地址:https://www.cnblogs.com/hont/p/14587775.html
Copyright © 2011-2022 走看看