• 【unity3D-网格编程】01:Mesh基础属性以及用代码创建一个三角形


    💗 未来的游戏开发程序媛,现在的努力学习菜鸡
    💦本专栏是我关于游戏开发的网格编程方面学习笔记
    🈶本篇是unity的网格编程系列01-mesh基础属性

    mesh基础属性

    在Unity中,网格编程Mesh是一种用于定义3D对象形状的基本组件。它定义了一个对象的顶点、三角形、法向量和UV贴图坐标等基本属性。

    • 顶点(Vertices):是对象的顶点,为Vector3类型的数组。
      :所有的图形都是点和面(三角形的面)构成的。

    • 三角序列(Triangles):由三个顶点组成的面,也称为“网格面”或“多边形”。是一个int数组,并且个数是三的倍数。

    • 法向量(Normals):法向量在计算光照和投影时至关重要,通常用于计算光照效果。
      :法向量为正方向的面为正面。(为了优化性能,反面不渲染,也就是反面是不可见的)

    • UV贴图坐标(UV Coordinates):它是网格表面上的纹理坐标,用于将纹理映射到网格表面。每个顶点都有一个对应的UV贴图坐标。

    • 颜色(Colors):它是与网格相对应的颜色数组,用于设置网格的材质颜色和纹理。

    • 切线(Tangents):用于计算网格表面上的光照效果。它们定义了网格表面上的切线方向。

    实践操作

    用代码初始化一个三角形

    1. 新建一个脚本
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]//自动挂载MeshFilter和MeshRenderer
    public class GenerateMesh01 : MonoBehaviour
    {
        void Start()
        {
            //初始化
            Mesh mesh = new Mesh();
            MeshFilter meshfilter = GetComponent<MeshFilter>();
            meshfilter.mesh = mesh;
            //获取顶点坐标和三角序列
            mesh.vertices = GetVertices();
            mesh.triangles = GetTriangles();
        }
        private Vector3[] GetVertices()
        {//赋值顶点坐标
            return new Vector3[]
            {
                new Vector3(0,0,0),
                new Vector3(1,0,0),
                new Vector3(1,1,0),
            };
        }
        private int[] GetTriangles()
        {//赋值三角序列
            return new int[]
            {
                0,1,2,
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    1. 新建一个空物体将脚本挂载上去
      在这里插入图片描述
      在这里插入图片描述
    2. 点击运行,会生成一个三角形(当然,正面看是可以看见的,反面看是没有的。而且,因为我们没有给材质,所以此时三角形面片显示材质缺失时的紫色)
      在这里插入图片描述

    在三角形的基础上改成正方形

    图解:左边是我们原先的三角形,现在只需要在多加一个顶点以及三角序列就可以,根据基础知识,顺时针为正方向,新加的三角序列为0,2,3
    在这里插入图片描述
    代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]//自动挂载MeshFilter和MeshRenderer
    public class GenerateMesh01 : MonoBehaviour
    {
        void Start()
        {
            //初始化
            Mesh mesh = new Mesh();
            MeshFilter meshfilter = GetComponent<MeshFilter>();
            meshfilter.mesh = mesh;
            //获取顶点坐标和三角序列
            mesh.vertices = GetVertices();
            mesh.triangles = GetTriangles();
        }
        private Vector3[] GetVertices()
        {//赋值顶点坐标
            return new Vector3[]
            {
                new Vector3(0,0,0),
                new Vector3(1,0,0),
                new Vector3(1,1,0),
                new Vector3(0,1,0),//添加了顶点
            };
        }
        private int[] GetTriangles()
        {//赋值三角序列
            return new int[]
            {
                0,1,2,
                0,2,3,//添加了三角序列
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    贴图正确的显示

    知识点:UV坐标和顶点的关系

    1.为空物体直接添加一个贴图,不赋值UV,启动后结果是这样的:贴图没有正常显示
    在这里插入图片描述

    1. 在代码中添加为该正方形赋值UV坐标的代码,添加后代码为:
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]//自动挂载MeshFilter和MeshRenderer
    public class GenerateMesh01 : MonoBehaviour
    {
        void Start()
        {
            //初始化
            Mesh mesh = new Mesh();
            MeshFilter meshfilter = GetComponent<MeshFilter>();
            meshfilter.mesh = mesh;
            //获取顶点坐标和三角序列
            mesh.vertices = GetVertices();
            mesh.triangles = GetTriangles();
            //获取UV坐标
            mesh.uv = GetUV();
        }
        private Vector3[] GetVertices()
        {//赋值顶点坐标
            return new Vector3[]
            {
                new Vector3(0,0,0),
                new Vector3(1,0,0),
                new Vector3(1,1,0),
                new Vector3(0,1,0),
            };
        }
        private int[] GetTriangles()
        {//赋值三角序列
            return new int[]
            {
                0,1,2,
                0,2,3,
            };
        }
        private Vector2[] GetUV()
        {//UV
            return new Vector2[]
            {
                new Vector2(1,0),
                new Vector2(0,0),
                new Vector2(0,1),
                new Vector2(1,1),
            };
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    1. 再次启动后,结果:贴图正常显示
      在这里插入图片描述
    2. 关系图解:
      在这里插入图片描述

    补充

    1. RequireComponent的使用

    用法:在脚本前加上[RequireComponent(typeof (X))]

    其中X为其它脚本,或者Unity组件
    当你挂载这个脚本时,X会和当前脚本一起被挂载上去。


    💦更多内容请前往主页置顶或点击链接直达:【unity3D】游戏开发专栏的目录

  • 相关阅读:
    【java:牛客每日三十题总结-6】
    高等教育学:教育研究与科学研究(完)
    Python 06 之面向对象基础
    洛谷P1102 A-B数对 详细解析及AC代码
    OPengl学习(二)——opengl环境搭建
    ARMv8平台上安装QT开发环境
    P1510 精卫填海-01背包
    猜测了一个sora模型结构
    C# InvokeRequired线程安全
    【算法训练营】 - ⑩ 并查集与图
  • 原文地址:https://blog.csdn.net/zhurouwanzi/article/details/134512105