• Unity3d mesh合并,网格合并具体用法教程 Unity开发Mesh合并网格 Chinar-本文提供全流程,中文翻译。 助力快速理解 Unity 中合并网格的概念与流程 Unity 开发中,如果我们需要做性能优化 或者是一些项目需求,需要将...

    Unity开发Mesh合并网格


    本文提供全流程,中文翻译。

    Chinar 坚持将简单的生活方式,带给世人!

    (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



    Chinar —— 心分享、心创新!

    助力快速理解 Unity 中合并网格的概念与流程

    为新手节省宝贵的时间,避免采坑!


    Chinar 教程效果:
    这里写图片描述
    这里写图片描述



    全文高清图片,点击即可放大观看 (很多人竟然不知道)


    1

    Merge Mesh —— 合并网格


    Unity 开发中,如果我们需要做性能优化

    或者是一些项目需求,需要将零散的几个物体进行合并,成为一个整体的模型

    而由于模型的样貌是由 MeshFilter 决定,上色由 MeshRender 决定

    所以我们只需将几个零散模型的 MeshFilter 进行合并,就能得到一个整体的模型
    举个栗子黑白88
    这里写图片描述
    合并后的网格效果:
    这里写图片描述


    2

    Create GameObject —— 在场景中创建一个空物体


    Hierarchy 层次面板中,创建一个空物体,并将脚本文件挂载它上边

    将你需要的零散的模型,设置为其子物体

    运行脚本,即可完成合并!

    注意:

    脚本中我注销掉的脚本之前的代码,足够生成新模型的网格,且运行后就已经生成了!
    举个栗子黑白88
    这里写图片描述

    using UnityEngine;
    
    
    /// <summary>
    /// 合并网格
    /// </summary>
    public class ChinarMergeMesh : MonoBehaviour
    {
        void Start()
        {
            MergeMesh();
        }
    
    
        /// <summary>
        /// 合并网格
        /// </summary>
        private void MergeMesh()
        {
            MeshFilter[]      meshFilters      = GetComponentsInChildren<MeshFilter>();   //获取 所有子物体的网格
            CombineInstance[] combineInstances = new CombineInstance[meshFilters.Length]; //新建一个合并组,长度与 meshfilters一致
            for (int i = 0; i < meshFilters.Length; i++)                                  //遍历
            {
                combineInstances[i].mesh      = meshFilters[i].sharedMesh;                   //将共享mesh,赋值
                combineInstances[i].transform = meshFilters[i].transform.localToWorldMatrix; //本地坐标转矩阵,赋值
            }
            Mesh newMesh = new Mesh();                                  //声明一个新网格对象
            newMesh.CombineMeshes(combineInstances);                    //将combineInstances数组传入函数
            gameObject.AddComponent<MeshFilter>().sharedMesh = newMesh; //给当前空物体,添加网格组件;将合并后的网格,给到自身网格
            //到这里,新模型的网格就已经生成了。运行模式下,可以点击物体的 MeshFilter 进行查看网格
    
            #region 以下是对新模型做的一些处理:添加材质,关闭所有子物体,添加自转脚本和控制相机的脚本
    
            //gameObject.AddComponent<MeshRenderer>().material = Resources.Load<Material>("Materials/Koala"); //给当前空物体添加渲染组件,给新模型网格上色;
            //foreach (Transform t in transform)                                                              //禁用掉所有子物体
            //{
            //    t.gameObject.SetActive(false);
            //}
            //gameObject.AddComponent<BallRotate>();
            //Camera.main.gameObject.AddComponent<ChinarCamera>().pivot = transform;
    
            #endregion
        }
    }

    3

    Error Effect —— 错误效果


    运行后,你会发现场景中没有什么变化!还是那个模型在那里!

    其实这时候网格都已经生成了

    原因-1:我们没有禁用子物体,所以显示的还是子物体的组合效果;
    原因-2:我们只给空物体加了 MeshFilter 组件,并添加了合并后的网格,但并没有进行渲染!
    举个栗子黑白88
    这里写图片描述


    4

    improvement —— 完善


    Resources 中新建一个材质球命名:“ Koala ”,用来给空物体(新模型)渲染使用

    并动态将子物体进行关闭,将对模型进行材质球的添加

    动态添加2个脚本,一个用来旋转,一个控制相机旋转(这是为了好看的测试效果,并非必要)
    举个栗子黑白88
    这里写图片描述


    5

    Project —— 项目文件


    项目文件为 unitypackage 文件包:

    下载导入 Unity 即可使用
    举个栗子黑白88
    点击下载 —— 项目资源 (积分支持)

    点击下载 —— 项目资源 (Chinar免费)


    支持

    May Be —— 搞开发,总有一天要做的事!


    拥有自己的服务器,无需再找攻略!

    Chinar 提供一站式教程,闭眼式创建!

    为新手节省宝贵时间,避免采坑!


    先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


    1 —— 云服务器超全购买流程 (新手必备!)

    2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

    3—— Windows 服务器配置、运行、建站一条龙 !

    4 —— Linux 服务器配置、运行、建站一条龙 !





    技术交流群:806091680 ! Chinar 欢迎你的加入


    END

    本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

    对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

    对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

    展开全文
  • unity3d 改变mesh网格

    2020-06-15 20:28:44
    提供一个可以个工大家学习unity3d 过程中,可能需要改变mesh网格的一个小工程供大家学习参考
  • 关于unity3d 网格编程: 建一个空物体,添加脚本MeshScript: void Start () { gameObject.AddComponent();//网格过滤器 gameObject.AddComponent();//网格渲染器 Mesh mesh = GetComponent().mesh;//获取网格 ...

    关于unity3d 网格编程:

    建一个空物体,添加脚本MeshScript:

    void Start () {
            gameObject.AddComponent<MeshFilter>();//网格过滤器
            gameObject.AddComponent<MeshRenderer>();//网格渲染器
            Mesh mesh = GetComponent<MeshFilter>().mesh;//获取网格
          //网格定点数组,三个点构成一个面,数组元素个数是三的倍数;给定的数组元素是三维坐标
            mesh.vertices = new Vector3[] { //顺时针
                new Vector3(0, 0, 0), 
                new Vector3(0, 10, 0),
                new Vector3(10, 10, 0),
                 new Vector3(0,0,0),
                 new Vector3(10,10,0),
                new Vector3(10,0,0)
            };
            //UV,数组长度和定点数量相同:对应比例
            mesh.uv = new Vector2[] {
                new Vector2(0, 0),
                new Vector2(0,4), 
                new Vector2(4, 2),
                new Vector2(0, 0),
                new Vector2(4, 4), 
               new Vector2(4, 0)
            };
            //怎么构成三角面
            mesh.triangles = new int[] { 0, 1, 2,3,4,5 };//0是定点数组的下标
    	}

    就可以画出图形了。。。
    展开全文
  • 任何一个模型都是由若干个网格面组成,而网格面由若干个三角面组成。下面我们就创建一个三角面。 创建一个空物体GameObject.添加MeshFilter组件和MeshRenderer组件。 示例代码如下:  //三角形的三个顶点  ...

    任何一个模型都是由若干个网格面组成,而网格面由若干个三角面组成。下面我们就创建一个三角面。

    创建一个空物体GameObject.添加MeshFilter组件和MeshRenderer组件。

    示例代码如下:

    1.     //三角形的三个顶点
    2.     Vector3 v0 = new Vector3 (5, 0, 0);
    3.     Vector3 v1 = new Vector3 (0, 5, 0);
    4.     Vector3 v2 = new Vector3 (0, 0, 5);
    5.   //三角形的三个顶点
    6.     Vector3 v3 = new Vector3 (-5, 0, 0);
    7.     Vector3 v4 = new Vector3 (0, -5, 0);
    8.     Vector3 v5 = new Vector3 (0, 0, -5);
    9.     //三角形的贴图比例
    10.     Vector2 u0 = new Vector2 (0, 0);
    11.     Vector2 u1 = new Vector2 (0, 5);
    12.     Vector2 u2 = new Vector2 (5, 5);
    13.  //三角形的贴图比例
    14.     Vector2 u3 = new Vector2 (0, 0);
    15.     Vector2 u4 = new Vector2 (0, 1);
    16.     Vector2 u5 = new Vector2 (1, 1);
    17. //三角形的材质
    18.     public Material mat;
    19.     void Start ()
    20.     {
    21.         //获取MeshFilter组件
    22.         MeshFilter mf = gameObject.GetComponent<MeshFilter> ()as MeshFilter;
    23.         //网格对象
    24.         Mesh mesh = mf.mesh;
    25.        //网格的顶点
    26.         mesh.vertices = new Vector3[]{ v0, v1, v2, v3, v4, v5 };
    27.        //网格的贴图比例
    28.         mesh.uv = new Vector2[]{ u0, u1, u2, u3, u4, u5 };
    29.        //绘制三角形
    30.         mesh.triangles = new int[]{ 0, 1, 2, 3, 4, 5 };
    31.        //材质
    32.         MeshRenderer mr = gameObject.GetComponent<MeshRenderer> ()as MeshRenderer;
    33.         mr.material = mat;
    34.     }

     

     

    展开全文
  • Unity3D从入门到进阶】文章目录及设置这个专栏的初衷 二、Mesh网格与Material材质 Mesh 网格,控制物体外观 Material 材质,控制物体皮肤 举例: 这是一个默认的Cube 我们来更换一下材质Material: 我们来更换...

    一、目录

    【Unity3D从入门到进阶】文章目录及设置这个专栏的初衷

    二、Mesh网格与Material材质

    Mesh 网格,控制物体外观
    Material 材质,控制物体皮肤

    举例:
    在这里插入图片描述
    在这里插入图片描述
    这是一个默认的Cube
    我们来更换一下材质Material:
    在这里插入图片描述
    在这里插入图片描述
    我们来更换一下网格Mesh:

    在这里插入图片描述
    在这里插入图片描述
    通过MeshFilter的Mesh修改物体外观,可以修改为立方体,球体,胶囊体等
    通过MeshRenderer的Material修改物体材质

    GetComponent<MeshFilter>().mesh = mesh;
    GetComponent<MeshRenderer>().material = material;
    
    展开全文
  • 在使用Unity3D进行开发时,我们通常需要生成自己的网格来进行控制,比如进行图像变形等等。本文将介绍如何在Unity3D中生成一个网格。  首先,需要在空间中生成顶点,然后在定义三角面片顶点序号。生成网格的代码...

            在使用Unity3D进行开发时,我们通常需要生成自己的网格来进行控制,比如进行图像变形等等。本文将介绍如何在Unity3D中生成一个网格。

            首先,需要在空间中生成顶点,然后在定义三角面片顶点序号。生成网格的代码如下:

    using UnityEngine;
    using System.Collections;
    
    
    public class MeshGeneration : MonoBehaviour
    {
    
    
        Mesh mesh;
        Vector3[] vertices;
        Vector2[] uv;
        int[] triangles;
        Vector3[] normals;
        void Start()
        {
            gameObject.AddComponent<MeshFilter>();
            gameObject.AddComponent<MeshRenderer>();
            Texture img = (Texture)Resources.Load("tu");
            gameObject.GetComponent<Renderer>().material.mainTexture = img;
            mesh = new Mesh();
            int m = 5; //row  
            int n = 10;  //col  
            float width = 8;
            float height = 6;
            vertices = new Vector3[(m + 1) * (n + 1)];//the positions of vertices 
            normals = new Vector3[(m + 1) * (n + 1)];
    
    
            uv = new Vector2[(m + 1) * (n + 1)];
            triangles = new int[6 * m * n];
            for (int i = 0; i < vertices.Length; i++)
            {
                float x = i % (n + 1);
                float y = i / (n + 1);
                float x_pos = x / n * width;
                float y_pos = y / m * height;
                vertices[i] = new Vector3(x_pos, y_pos, 0);
                normals[i] = new Vector3(0,0,-1);
                float u = x / n;
                float v = y / m;
                uv[i] = new Vector2(u, v);
    
    
    
    
            }
            for (int i = 0; i < 2 * m * n; i++)
            {
                int[] triIndex = new int[3];
                if (i % 2 == 0)
                {
                    triIndex[0] = i / 2 + i / (2 * n);
                    triIndex[1] = triIndex[0] + 1;
                    triIndex[2] = triIndex[0] + (n + 1);
                }
                else
                {
                    triIndex[0] = (i + 1) / 2 + i / (2 * n);
                    triIndex[1] = triIndex[0] + (n + 1);
                    triIndex[2] = triIndex[1] - 1;
    
    
                }
                //三角形顶点顺序会影响显示方向
                triangles[i * 3] = triIndex[0];
                triangles[i * 3 + 1] = triIndex[2];
                triangles[i * 3 + 2] = triIndex[1];
    
    
            }
            mesh.vertices = vertices;
            mesh.uv = uv;
            mesh.triangles = triangles;
            mesh.normals = normals;
            this.GetComponent<MeshFilter>().mesh = mesh;
        }
       
    }
    

            下图中的风景图片就是将贴图直接贴在网格上的结果。看上去效果和直接将贴图扔到一个plane上是一样的。但是我们可以控制网格顶点的数量,自由度大大增加。




    展开全文
  • Procedural Grid Programming Form代码实现网格本文目标 创建网格坐标 使用协程计算他们的位置 利用三角形确定一个面 自动生成法线 添加纹理坐标和切线 在这篇教程中我们将利用顶点和三角面创建一个网格。 这篇博客...
  • Unity3d网格合并

    2017-11-17 14:19:38
    几个不同的物体,在Unity3D中可以将网格合并在一起,用于优化。 在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上。 CombineMeshes.cs内容如下: using UnityEngine; using System....
  • 前面已经讲过怎样使用mesh生成一个自己的网格,那么本文将会讲述怎样将这个网格变换成自己想要的形状,比如一个球体。 核心代码如下: v.x = r * Mathf.Cos(vertices[i].x / width * 2 * Mathf.
  • 参考文章: https://blog.csdn.net/Hachi_Lin/article/details/90349216 MatLab实现Loop Subdivision ... 程序源代码链接:提取码: 编译环境:Unity3D 2017.4.35f1 ...
  • Unity 网格合并脚本,可以将多个网格模型合并成一个以节约内存开销。
  • Unity3D动态创建地形网格(一) 这次简单的写一个动态创建地形网格的脚本给大家分享一下。 这次是第一部分,仅仅实现了通过高度图动态生成地形的部分。假如以后有心情和时间,再来慢慢的补充多通道刷地形材质、...
  • Unity3d网格合并2

    2019-06-29 01:52:28
    几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。 在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上。 CombineMeshes.cs内容如下: using UnityEngine; using System....
  • There are some limitations when using the Mesh Collider. Usually, two Mesh Colliders cannot collide with each other. All Mesh Colliders can collide with any primitive Collider. If your mesh is marked ...
  • Unity Mesh - 网格编程

    2019-10-31 01:06:57
    一、网格类属性及函数 首先提供官方参考文档:API-Reference-MeshUnity区分了Simple和Advanced Mesh Api,Simple API主要是指SetColors等,它会在修改时做一些检测来保证数据的准确性;而Advanced Api则指...
  • Unity3DMesh基础

    2018-05-28 20:57:38
    教程一Unity3DMesh绘制多边形一些知识点的说明记录与补充:1、总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思路就在于三角形的拆分。如果说一个平面有7个顶点...
  • ... 一、网格过滤器组件 网格过滤器(Mesh Filter):该组件只有一个"Mesh"属性,用于设置当前游戏物体使用哪个模型进行展示 ...网格渲染器(Mesh Renderer):该组件用于“渲染”显示模型,如果没有该...
  • unity 自定义网格模型

    2020-06-29 11:06:22
    unity 自定义网格模型
  • MeshUnity内的一个组件,称为网格组件。 ◦ Mesh 网格 ◦ MeshFilter 网格过滤器 ◦ Mesh Renderer 网格渲染器 Mesh:是指模型的网格,建模就是建网格。细看Mesh,可以知道Mesh的主要属性内容包括顶点坐标,法线,...
1 2 3 4 5 ... 20
收藏数 3,819
精华内容 1,527