【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. 点击运行,会生成一个三角形(当然,正面看是可以看见的,反面看是没有的。而且,因为我们没有给材质,所以此时三角形面片显示材质缺失时的紫色)
    在这里插入图片描述

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

图解:左边是我们原先的三角形,现在只需要在多加一个顶点以及三角序列就可以,根据基础知识,顺时针为正方向,新加的三角序列为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,//添加了三角序列
        };
    }
}

贴图正确的显示

知识点: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. 关系图解:
    在这里插入图片描述

补充

  1. RequireComponent的使用

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

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


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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪肉丸子~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值