Unity 初识Mesh绘制面(一)

Unity中渲染出的3D物体组成内容

首先我们先在Unity3D中创建一个Cube,在Inspector可以看到其中含有MeshFilter、MeshRenderer组件。

由此可见如果你想要展示一个3D游戏物体,它必须拥有两个组件。 

  • MeshFilter 这个组件记录了你想要展示的网格数据,相当于人的骨骼
  • MeshRenderer 使用这个组件告诉网格如何渲染,比如使用哪个材质球,是否接受阴影和其他设置,相当于人的皮肤,可以设置不同的贴图,化妆什么的。

Mesh中包含的内容

  从官方手册中可以知道,在Mesh中存储着三维模型的数据:

        vertices(顶点数据数组Vector3[])、

        triangles(三角形顶点索引数组,int[])、

        normals(法线向量数组,Vector3[])、

         uv(纹理坐标数组,Vector2[])。

因此想要使用代码来创建Mesh需要至少四个步骤:

1.设置顶点数组(想要创建的面一共有多少个顶点)
2.设置三角形信息(每三个顶点确定一个三角形,要顺时针的设置)
3.设置法线信息(可以通过mesh的方法直接计算)主要是跟光照有关的
4.设置UV信息(决定了图像信息如何在此Mesh上显示,其设置顺序和顶点数组的设置顺序相同)

注意:Unity中的模型面数如果不进行特殊设置,默认是只渲染一面

如何判断三角面的正反呢?

比如正方体的俯视图,伸出你的左手,拇指环绕朝向的一面就是正面

如何创建三角面

首先创建空物体,添加必须的两个组件,然后添加代码脚本

如何创建正方形

给创建的正方形赋予贴图

上面贴图有四个顶点,正方形的面也是由四个顶点组成的,把图贴给面,四个顶点一一对应

 

   

 

创建双面的正方形

     

 

     结果:

        

完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DrawMesh : MonoBehaviour
{
    private MeshFilter meshFilter;
    private Mesh mesh;
    private MeshRenderer meshRenderer;
    //定义顶点数组
    private Vector3[] vertices = new Vector3[100];
    //存放三角面的顺序,所以一定是3的倍数
    private int[] triangels = new int[486];

    //给绘制的正方形附材质,材质贴图是一个四边形图片,
    private Vector2[] uvs;
    //正方形的材质球
    public Material mat;
    void Start()
    {
        meshFilter = GetComponent<MeshFilter>();
        mesh = meshFilter.mesh;
        meshRenderer = GetComponent<MeshRenderer>();
        //  DrawTriangle();
        // DrawSquare();
        // DrawSquareWithTex();
        DrawDoubleSquareWithTex();
    }
    /// <summary>
    /// 绘制一个三角面
    /// </summary>
    void DrawTriangle()
    {
        //定义上图的ABC三个顶点
        vertices = new Vector3[] { Vector3.zero, Vector3.forward, new Vector3(1, 0, 1) };
        //定义三个顶点的顺序,使其正面朝上 0表示第一个顶点,1表示第二个顶点
        triangels = new int[] { 0, 1, 2 };
        //在构造Mesh前最好clear下,如果Mesh再后来复用的话,一定要清空否则索引容易出现差错
        mesh.Clear();
        //给mesh赋值
        mesh.vertices = vertices;
        mesh.triangles = triangels;
    }

    /// <summary>
    /// 绘制一个正方形(这是单面的)
    /// </summary>
    void DrawSquare()
    {
        //定义上图的ABCD四个顶点
        vertices = new Vector3[] { Vector3.zero, Vector3.forward, new Vector3(1, 0, 1) ,Vector3.right};
        //0,1,2表示顺序ABC;2,3,0表示顺序CDA 两个三角面
        triangels = new int[] { 0, 1, 2,2,3,0 };
        //在构造Mesh前最好clear下,如果Mesh再后来复用的话,一定要清空否则索引容易出现差错
        mesh.Clear();
        //给mesh赋值
        mesh.vertices = vertices;
        mesh.triangles = triangels;
    }
    /// <summary>
    ///绘制一个正方形并给生成的mesh赋予贴图
    /// </summary>
    void DrawSquareWithTex()
    {
        //定义上图的ABCD四个顶点
        vertices = new Vector3[] { Vector3.zero, Vector3.forward, new Vector3(1, 0, 1), Vector3.right };
        //0,1,2表示顺序ABC;2,3,0表示顺序CDA 两个三角面
        triangels = new int[] { 0, 1, 2, 2, 3, 0 };
        //图片UV的四个点位置       
        uvs = new Vector2[] { Vector2.zero, new Vector2(0, 1), Vector2.one, new Vector2(1, 0) };
        //在构造Mesh前最好clear下,如果Mesh再后来复用的话,一定要清空否则索引容易出现差错
        mesh.Clear();
        //给mesh赋值
        mesh.vertices = vertices;
        mesh.triangles = triangels;
        //给正方形赋予材质球贴图
        mesh.uv = uvs;
        meshRenderer.material = mat;

    }
    /// <summary>
    /// 绘制双面的正方形
    /// </summary>
    void DrawDoubleSquareWithTex()
    {
        //定义正方形正反面的顶点
        vertices = new Vector3[] 
        { Vector3.zero, Vector3.forward, new Vector3(1, 0, 1), Vector3.right,//正面点
          Vector3.zero, Vector3.forward, new Vector3(1, 0, 1), Vector3.right//背面点
        };
        //0,1,2表示顺序ABC;2,3,0表示顺序CDA 两个三角面, 4,7,6   6,5,4 表示反的三角面
        triangels = new int[] { 0, 1, 2,   2, 3, 0 ,    4,7,6,  6,5,4       };
        //  uvs = new Vector2[] { Vector2.zero, new Vector2(0, 1), Vector2.one, new Vector2(1, 0) };
        //重新分配UV值,正面u是0到0.5的
        uvs = new Vector2[]
        { Vector2.zero, new Vector2(0, 1), new Vector2(0.5f, 1), new Vector2(0.5f, 0),//正面
         new Vector2(0.5f, 0), new Vector2(0.5f, 1),Vector2.one, new Vector2(1, 0)//反面
        };
        //在构造Mesh前最好clear下,如果Mesh再后来复用的话,一定要清空否则索引容易出现差错
        mesh.Clear();
        //给mesh赋值
        mesh.vertices = vertices;
        mesh.triangles = triangels;
        //给正方形赋予材质球贴图
        mesh.uv = uvs;
        meshRenderer.material = mat;
    }
}

下面介绍下法线的使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NormalTest : MonoBehaviour
{
    private MeshFilter meshFilter;
    private Mesh mesh;
    private MeshRenderer meshRenderer;
    //定义顶点数组
    private Vector3[] vertices = new Vector3[100];
    //存放三角面的顺序,所以一定是3的倍数
    private int[] triangels = new int[486];

    //给绘制的正方形附材质,材质贴图是一个四边形图片,
    private Vector2[] uvs;
    //正方形的材质球
    public Material mat;

    public bool isChooseNormal;
    private Vector3[] normals = new Vector3[100];
    private Vector3[] normals1 = new Vector3[100];
    void Start()
    {
        meshFilter = GetComponent<MeshFilter>();
        mesh = meshFilter.mesh;
        meshRenderer = GetComponent<MeshRenderer>();
        DrawSquareWithTex();    
    }
    /// <summary>
    ///绘制一个正方形并给生成的mesh赋予贴图
    /// </summary>
    void DrawSquareWithTex()
    {
        //定义上图的ABCD四个顶点
        vertices = new Vector3[] { Vector3.zero, Vector3.forward, new Vector3(1, 0, 1), Vector3.right };
        //0,1,2表示顺序ABC;2,3,0表示顺序CDA 两个三角面
        triangels = new int[] { 0, 1, 2, 2, 3, 0 };
        //图片UV的四个点位置       
        uvs = new Vector2[] { Vector2.zero, new Vector2(0, 1), Vector2.one, new Vector2(1, 0) };

        normals = new Vector3[] { Vector3.up, Vector3.up, Vector3.up, Vector3.up };
        normals1 = new Vector3[] { Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero };
        //在构造Mesh前最好clear下,如果Mesh再后来复用的话,一定要清空否则索引容易出现差错
        mesh.Clear();
        //给mesh赋值
        mesh.vertices = vertices;
        mesh.triangles = triangels;
        //给正方形赋予材质球贴图
        mesh.uv = uvs;
        meshRenderer.material = mat;
    }
    private void Update()
    {
        if (isChooseNormal)
        {
            mesh.normals = normals;
        }
        else
        {
            mesh.normals = normals1;
        }
        
    }
}

         

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity是一款强大的游戏引擎,它允许开发者使用代码创建各种图形和场景。通过使用Mesh,我们可以在Unity绘制。 要使用Mesh绘制,首先需要创建一个Mesh对象。可以使用Unity的网格工具在编辑器中创建一个平,并将其转换为一个Mesh对象,或者可以在代码中通过编写代码来创建一个Mesh对象。然后,需要为Mesh对象分配顶点、UV坐标和三角形索引数据。 顶点数据用于指定平的顶点位置,一般情况下,可以在三维空间中指定四个顶点来表示一个平。UV坐标是一个二维坐标系统,它用于指定纹理在平上的映射关系。通过设置UV坐标,我们可以将纹理贴图应用到平上。三角形索引数据用于指定哪些顶点连接在一起形成三角形。在平上,两个三角形就足够了。 当顶点、UV坐标和三角形索引数据都设置好后,就可以通过调用Mesh对象的函数来更新和渲染平了。这些函数包括设置顶点数据的函数、设置UV数据的函数和设置三角形索引的函数。在更新完数据后,可以使用Graphics.DrawMesh函数来渲染平。 在Unity中使用Mesh绘制是非常简单和高效的。它可以用于创建平、墙壁、天花板等各种场景元素。同时,通过设置不同的顶点、UV坐标和纹理贴图,我们可以制作出各种不同样式和形状的平。无论是2D游戏还是3D游戏,Mesh绘制都是一种非常常用的技术。 ### 回答2: 在Unity中,我们可以通过Mesh绘制MeshUnity中用来表示网格的数据结构,它由一系列的顶点、三角形和其他属性组成。 首先,我们需要创建一个空的GameObject来容纳我们的平。在Unity编辑器的层次结构视图中,右键点击空白区域,选择创建空对象,然后给它起一个名字,比如"Plane"。 接下来,我们需要创建一个MeshFilter组件来管理网格的形状。选择我们刚刚创建的GameObject,在Inspector板中点击"Add Component"按钮,并搜索"Mesh Filter",然后点击添加。 现在,我们需要创建一个MeshRenderer组件来渲染网格。选择GameObject,在Inspector板中点击"Add Component"按钮,并搜索"Mesh Renderer",然后点击添加。 接下来,我们需要编写脚本来生成平的顶点和三角形数据。创建一个新的C#脚本,给它一个有意义的名字,比如"PlaneGenerator"。 在脚本中,首先需要导入Unity的命名空间:using UnityEngine; 然后,在脚本中定义一个方法来生成平的网格数据,命名为GeneratePlaneData()。 在这个方法中,我们首先创建一个空的Mesh对象:Mesh mesh = new Mesh(); 然后,定义顶点数组和三角形数组:Vector3[] vertices = new Vector3[4]; int[] triangles = new int[6]; 接着,为顶点数组设置位置数据,可以使用Vector3来设置顶点的坐标。 然后,为三角形数组设置顶点索引数据,确定三角形的顶点顺序和排列。 最后,将顶点数据和三角形数据分配给Mesh对象:mesh.vertices = vertices; mesh.triangles = triangles; 在脚本的Start()方法中,调用GeneratePlaneData()方法来生成平的网格数据,并将其赋值给MeshFilter的mesh属性:GetComponent<MeshFilter>().mesh = mesh; 最后,将脚本附加到刚刚创建的GameObject上。 运行Unity游戏,你将看到平已经根据我们在脚本中定义的顶点和三角形数据进行绘制了。 这只是一种用Mesh绘制的简单方法,你可以根据需要修改顶点和三角形数据,以实现更复杂的形状和效果。 ### 回答3: 使用Unity通过Mesh绘制可以按照以下步骤进行。 首先,在Unity中创建一个空对象,我们可以将其命名为"PlaneMesh"。接下来,为该对象添加一个MeshFilter组件。点击空对象,然后在Inspector板中点击"Add Component"按钮,选择"Mesh Filter"。此操作将为对象添加一个Mesh Filter组件,它负责存储和管理平的几何信息。 然后,我们需要创建一个名为"PlaneMesh"的C#脚本,并将其附加到空对象上。我们可以通过右键点击空对象,在弹出的菜单中选择"Create",然后选择"C# Script"来创建脚本。然后将脚本名称更改为"PlaneMesh"并单击确认,接着将新创建的脚本拖拽到空对象上。 在"PlaneMesh"脚本中,我们需要使用Mesh类来定义平的几何形状。我们可以使用一个包含四个顶点和两个三角形的顶点数组和三角形索引数组来表示平的形状。然后,我们可以通过将这些数组设置给Mesh对象的vertices和triangles属性来定义该平的几何信息。 最后,我们需要为该平创建一个MeshRenderer组件,使其能在游戏场景中呈现。点击空对象,然后在Inspector板中点击"Add Component"按钮,选择"Mesh Renderer"。这将为对象添加一个Mesh Renderer组件,它负责渲染Mesh的几何形状。 通过这些步骤,我们可以使用Unity通过Mesh绘制。我们可以在场景中通过调整顶点和材质等属性来修改平的外观,并使用其他组件进行进一步的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值