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

news2024/11/18 20:01:26

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

网格编程系列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】游戏开发专栏的目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1233530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小众市场:探索跨境电商中的利基领域

随着全球数字化和互联网的普及&#xff0c;跨境电子商务已经成为了一个蓬勃发展的产业。从亚马逊到阿里巴巴&#xff0c;大型电商平台已经占据了很大一部分市场份额。 然而&#xff0c;在这个竞争激烈的领域&#xff0c;寻找小众市场和利基领域可能是一种成功的策略。本文将探…

电脑显示找不到mfc140.dll怎么办?哪个修复方法值得推荐

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;例如"mfc140.dll文件缺失"这个问题可能会导致某些应用程序无法正常运行&#xff0c;可能给您带来困扰。本篇文章为您提供了六种有效解决此类问题的策略&#xff0c;使您能够迅速修复并恢复应用程…

Linux fork和vfork函数用法

fork和vfork是用于创建新进程的函数&#xff0c;在Linux的C语言编程中非常常见。 fork函数 fork函数是用于创建一个新的进程&#xff0c;新进程是调用进程的副本。新进程将包含调用进程的地址空间、文件描述符、栈和数据。在fork之后&#xff0c;父进程和子进程将并发执行。 …

被开除的ChatGPT之父,又回来了?

前两天&#xff0c;科技界爆出一个惊天大瓜&#xff0c;ChatGPT的创始人兼CEO&#xff0c;山姆阿尔特曼被自己的公司给开除了&#xff1a; 突发&#xff01;ChatGPT之父被开除&#xff01; 这条新闻一出来&#xff0c;整个科技界都炸锅了&#xff0c;有些幽默网友为了调侃这件事…

Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案

Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案 也是昨天晚上折腾了一个晚上到凌晨四点多,实在没有头绪,在论坛,贴吧,各种求助查贴,没有什么人解决.后面请教了一个安全圈的大佬朋友给解决了. 我的问题是在kali上的,所以只写了kali 的解决方案: 修改插件: vim /opt/…

小型洗衣机什么牌子好又便宜?性价比迷你洗衣机推荐

相信大家都知道&#xff0c;我们的内衣、内裤等贴身的衣物是不能和其它衣服直接放进大型洗衣机里洗的&#xff0c;每一次清洗都要把内衣一件件挑出来&#xff0c;然后再用手去洗&#xff0c;而我们每天都要上厕所&#xff0c;不可避免地会沾染上一些污垢和细菌&#xff0c;用手…

public private protected区别

北风胡乱刮着&#xff0c;我只想关上窗&#xff0c;煮着茶&#xff0c;在扑哧扑哧的白烟里心安理得地懒着。像郁达夫说得那样&#xff1a;“躲在屋里过活的两三个月的生活&#xff0c;却是一年之中最有劲的一段蛰居异境。”不管门外如何变幻莫测&#xff0c;围炉煮茶&#xff0…

2024专业的数据恢复软件EasyRecovery16

当我们处理重要的文件数据时&#xff0c;遇到突然停电导致数据来不及保存&#xff0c;再次打开电脑后&#xff0c;此前处理的数据可能丢失&#xff0c;这无疑会影响我们的工作进度&#xff0c;数据恢复软件在此时就派上用场&#xff0c;那么下面就来具体介绍EasyRecovery软件的…

【GUI】-- 11 贪吃蛇小游戏之绘制静态的小蛇

GUI编程 04 贪吃蛇小游戏 4.2 第二步&#xff1a;绘制静态的小蛇 现在绘制静态的小蛇(即小蛇初始位置)&#xff0c;并且完善游戏默认初始状态。这一步还在GamePanel类中实现。 首先&#xff0c;定义了小蛇的数据结构&#xff0c; //定义蛇的数据结构int length; //小蛇总长…

代码随想录算法训练营第23期day52|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

目录 一、300.最长递增子序列 二、674. 最长连续递增序列 三、718. 最长重复子数组 一、300.最长递增子序列 力扣题目链接 子序列是可以在不改变原有次序的情况下删除一些元素&#xff0c;需要进行二重遍历进行判断 class Solution { public:int lengthOfLIS(vector<in…

uniapp+vue3使用pinia,安卓端报错白屏

报错内容&#xff1a; reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->at useStore2 (app-service.js:1487:15)at (app-service.js:1714:17)at (app-serv…

spring boot加mybatis puls实现,在新增/修改时,对某些字段进行处理,使用的@TableField()或者AOP @Before

1.先说场景&#xff0c;在对mysql数据库表数据插入或者更新时都得记录时间和用户id 传统实现有点繁琐&#xff0c;这里还可以封装一下公共方法。 2.解决方法&#xff1a; 2.1&#xff1a;使用aop切面编程&#xff08;记录一下&#xff0c;有时间再攻克&#xff09;。 2.1.1&am…

盘点35个Python书籍Python爱好者不容错过

盘点35个Python书籍Python爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1uf-MXZc9aC7y3Qju6VnCYw?pwd8888 提取码&#xff1a;8888 书籍名称&#xff1a; Django教…

Servlet---API详解

文章目录 HttpServlet基础方法doXXX方法Servlet的生命周期 HttpServletRequest获取请求中的信息获取请求传递的参数获取 query string 里的数据获取form表单里的数据获取JSON里的数据如何解析JSON格式获取数据返回数据 HttpServletResponse设置响应的Header设置不同的状态码设置…

Linux入门必备指令

Linux学习之路起始篇——Linux基本指令 文章目录 Linux学习之路起始篇——Linux基本指令**一、ls指令****二、pwd命令****三、cd命令****四、touch指令****五、mkdir命令****六、rm命令****七、man 命令****八、cp命令****九、mv命令****10、cat 指令****十一、tac命令** 前言&…

基于蜜獾算法优化概率神经网络PNN的分类预测 - 附代码

基于蜜獾算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蜜獾算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蜜獾优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

基于Spring Boot 框架的试卷自动生成系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

数据结构:lambda表达式

基本概念 语法 // 1. 不需要参数,返回值为 2 () -> 2 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数字),并返回他们的和 (x, y) -> x y // 4. 接收2个int型整数,返回他们的乘积 (int x, int y) -> x * y // 5. 接受一个 string 对…

【外汇天眼】投资之道:成功背后的频繁交易陷阱

成功的投资需要超越人性的短板&#xff0c;其中之一就是频繁交易。巴菲特曾明言&#xff0c;如果商学院的毕业生在毕业后拿一张卡片&#xff0c;每买一支股票就打一个洞&#xff0c;那么这张卡片最终会被打得最少的人将成为巨富。“钱在这里从活跃的投资者流向有耐心的投资者。…

leetcode——设计循环队列

设计循环队列 这个题目在这里小编只分享一个解题思路&#xff0c;因为还有一个思路小编还在尝试&#xff0c;一直过不了&#xff0c;还在这里不断尝试&#xff0c;等我试出来的时候我在分享给大家&#xff0c;首先我们在这里给出的是数组的形式&#xff0c;后面在分享单链表的思…