mesh学习1

2023-11-02

@[TOC] (基础一)

初识基础:

  1. 首先点和面的联系:三个点构成一个小三角形,然后面就是由无数的小三角形构成
    另外相同位置的顶点可以复用,就像一个正方形,四个点即可
    在这里插入图片描述

  2. 三角面有正反之分,关键看法线方向

    发现朝外的,我们能看到,反过来就看不到了,可以参考unity的Plane

  3. uv: 纹理坐标
    目的是让我们的图片正确的显示到我们的图形上,也就是贴图吧
    取值范围就是0到1
    在这里插入图片描述

  4. 三角形序列(triangle)
    都是三点倍数

emmmm关于以上的一些基础知识的定义呢,可以考虑其他大佬写的
基础的定义

mesh学习

代码创建一个mesh

[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class Generate_Mesh1 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();
        MeshFilter meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        mesh.name = "lianxi1";
    }
}

RequireComponent表示在代码编译前需要先添加俩组件
上面代码创建一个空物体,把上面脚本拖上去即可

制作一个三角形面片

[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class Generate_Mesh1 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();
        MeshFilter meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        mesh.name = "lianxi1";
        mesh.vertices = GetVertex();
        mesh.triangles = GetTriangles();
    }

    private Vector3[] GetVertex()
    {
        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
        };
    }
}

效果:

在这里插入图片描述
因为法线与摄像机方向相同了, 所以y轴旋转了180度
否则可以考虑GetTriangles 中的0,1,2 改成2,1,0

制作一个正方形

[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class Generate_Mesh1 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();
        MeshFilter meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        mesh.name = "lianxi1";
        mesh.RecalculateNormals();
        mesh.vertices = GetVertex();
        mesh.triangles = GetTriangles();
    }

    private Vector3[] GetVertex()
    {
        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[]
        {
            2,1,0,
            0,3,2
        };
    }
}

效果:

在这里插入图片描述

注意

注意朝向![在这里插入图片描述](https://img-blog.csdnimg.cn/20210301202810559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyMzU0MjA1,size_16,color_FFFFFF,t_70

z轴(蓝色的)和摄像机z轴同向,即沿着摄像头,顺时针方向的三个点,才能被我们看到

UV设计

通过以上方法,创建完正方形或者其他图形,拖上材质球,你会发现
图形并不能完全显示
在这里插入图片描述
所以就涉及到了UV

[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class Generate_Mesh1 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();
        MeshFilter meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        mesh.name = "lianxi1";
        mesh.RecalculateNormals();
        mesh.vertices = GetVertex();
        mesh.triangles = GetTriangles();
        mesh.uv = GetUV();
    }

    private Vector3[] GetVertex()
    {
        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[]
        {
            2,1,0,
            0,3,2
        };
    }

    private Vector2[] GetUV()
    {
        return new Vector2[]
        {
            new Vector2(0,0),
            new Vector2(1,0),
            new Vector2(1,1),
            new Vector2(0,1),
        };
    }
}

简单找个材质球拖上图片测试一下
在这里插入图片描述

如果显示上有点问题,应该是shader的问题 改成这个:
在这里插入图片描述
原图
在这里插入图片描述

UV上的坐标是怎么得到的呢

在这里插入图片描述
位置坐标也就是GetVertex中的四个顶点的坐标 因为我的物体坐标点方向账号和uv上的同向
或者我把GtVertex调整一下位置,注意观察GetUV:即顺序要保持一致

 private Vector3[] GetVertex()
    {
        return new Vector3[]
        {
            new Vector3(0,0,0),
            new Vector3(0,1,0),
            new Vector3(1,0,0),
            new Vector3(1,1,0)
            
        };
    }

    private int[] GetTriangles()
    {
        return new int[]
        {
            0,1,3,
            3,2,0
        };
    }

    private Vector2[] GetUV()
    {
        return new Vector2[]
        {
            new Vector2(0,0),
            new Vector2(0,1),
            new Vector2(1,0),
            new Vector2(1,1),
        };
    }

设置法线

[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class Generate_Mesh1 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();
        MeshFilter meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        mesh.name = "lianxi1";
        mesh.RecalculateNormals();
        mesh.vertices = GetVertex();
        mesh.triangles = GetTriangles();
        mesh.uv = GetUV();
        mesh.normals = GetNormals();
    }

    private Vector3[] GetNormals()
    {
        return new Vector3[]{
             Vector3.forward,
              Vector3.forward,
               Vector3.forward,
               Vector3.forward
        };
    }

    private Vector3[] GetVertex()
    {
        return new Vector3[]
        {
            new Vector3(0,0,0),
            new Vector3(0,1,0),
            new Vector3(1,0,0),
            new Vector3(1,1,0)
            
        };
    }

    private int[] GetTriangles()
    {
        return new int[]
        {
            0,1,3,
            3,2,0
        };
    }

    private Vector2[] GetUV()
    {
        return new Vector2[]
        {
            new Vector2(0,0),
            new Vector2(0,1),
            new Vector2(1,0),
            new Vector2(1,1),
        };
    }
}

注意 GetNormals() 法线数组的个数要和顶点的个数保持一致,即每个点的法线

网格切线: mesh.tangents

那么它有什么用呢,他具体影响的是法线贴图的显示
在这里插入图片描述
就是这种凹凸不平的贴图 具体发现贴图添加位置:
在这里插入图片描述
涉及代码:

 void Update()
    {
        mesh.tangents = GetTangents();
    }

    private Vector4[] GetTangents()
    {
        return new Vector4[]{
            tempTangent,
            tempTangent,
            tempTangent,
            tempTangent
        };
    }

其中 tempTangent 是一个public 的Vector4 变量 ,放到Update中是为了方便看变化

详细代码

[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class Generate_Mesh1 : MonoBehaviour
{
    public Vector4 tempTangent;
    // Start is called before the first frame update
    private Mesh mesh;
    void Start()
    {
        mesh = new Mesh();
        MeshFilter meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        mesh.name = "lianxi1";
        mesh.RecalculateNormals();
        mesh.vertices = GetVertex();
        mesh.triangles = GetTriangles();
        mesh.uv = GetUV();
        mesh.normals = GetNormals();
        //mesh.RecalculateNormals();
    }

    void Update()
    {
        mesh.tangents = GetTangents();
    }

    private Vector4[] GetTangents()
    {
        return new Vector4[]{
            tempTangent,
            tempTangent,
            tempTangent,
            tempTangent
        };
    }

    //private Vector3[] GetNormals()
    //{
    //    return new Vector3[]{
    //         mesh.vertices[1] - mesh.vertices[0],
    //          mesh.vertices[2] - mesh.vertices[1],
    //           mesh.vertices[3] - mesh.vertices[2],
    //          mesh.vertices[0] - mesh.vertices[3]
    //    };
    //}
    private Vector3[] GetNormals()
    {
        return new Vector3[]{
             Vector3.back,
             Vector3.back,
             Vector3.back,
             Vector3.back
        };
    }

    private Vector3[] GetVertex()
    {
        return new Vector3[]
        {
            new Vector3(0,0,0),
            new Vector3(0,1,0),
            new Vector3(1,0,0),
            new Vector3(1,1,0)
            
        };
    }

    private int[] GetTriangles()
    {
        return new int[]
        {
            0,1,3,
            3,2,0
        };
    }

    private Vector2[] GetUV()
    {
        return new Vector2[]
        {
            new Vector2(0,0),
            new Vector2(0,1),
            new Vector2(1,0),
            new Vector2(1,1),
        };
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mesh学习1 的相关文章

  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • Unity3d Terrain地形制作系列(一)

    游戏简单地形 地形制作 地形制作 第一步在场景里加载一个地形对象 第二步 我们在属性面板里找到绘制地形 然后选择Set Height 绘制高度 应该我们要制作低凹的效果 所有先让他有个高度 不然是不能实现低凹的效果 如图 我们然后选择绘制地
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • Unity WebGL错误集锦

    ips 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace 可以在打出的包中的浏览器的webgl打印出错
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • c#获取cpu序列号

  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • 【Unity】如何让Unity程序一打开就运行命令行命令

    背景 Unity程序有时依赖于某些服务去实现一些功能 此时可能需要类似打开程序就自动运行Windows命令行命令的功能 方法 using UnityEngine using System Diagnostics using System T
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • 大家的毕业设计怎么做的?跟我一样吗?无极低码说你:只管建库建表,剩下的交给我

    首先呢 介绍一下无敌低代码平台 无极低代码平台是作者自己搭建的一个框架 刚开始由3行代码写服务升级而来 3行代码写服务当然也是作者自己写的 目的就是为了减少基础的开发工作 让不会后端开发的人员能够通过简单的步骤实现服务接口的编写 后面觉得3
  • 对比 Exception 和 Error,运行时异常与一般异常有什么区别?

    相同点 Exception 和 Error 都是继承了 Throwable 类 在 Java 中只有 Throwable 类型的实例才可以被抛出 throw 或者捕获 catch 它是异常处理机制的基本组成类型 Exception 和 Er
  • vue5种方式实现页面“刷新“

    vue中五种方式实现页面 刷新 1 使用window location reload 强制刷新 都会使页面有短暂的空白 体验效果不是特别好 home vue
  • 提高生活、学习、工作效率的方法——时间管理Vs个人管理

    首先 我想对于大家来说 时间管理这个词应该并不陌生 不过 在开会之前 又有几个知道呢 反正我当时并不知道 这就需要反思了 不过这里 先不做反思 先说说时间管理 初次接触到这个词 我想的是 为什么要管理 怎样进行时间管理 该怎么管理 随后 米
  • 12. 集群调度

    文章目录 简介 调度过程 自定义调度器 调度亲和性 Node亲和性 preferredDuringSchedulingIgnoredDuringExecution requiredDuringSchedulingIgnoredDuringE
  • 针对于MLE和MLP的代码例子实现

    背景 首先该例子来源于CSDN 详解最大似然估计 MLE 最大后验概率估计 MAP 以及贝叶斯公式的理解 nebulaf91的博客 这里的代码作为对上述内容的补充和实现 代码 import numpy as np import matplo
  • SSD接口种类

    转自微信公众号 存储随笔 随着SSD价格的不断下降以及SSD性能的不断提升 越来越多的朋友开始考虑给自己的电脑升级SSD固态硬盘 但是市面上现在SSD的根据不同的大小与尺寸 有多种多样的接口的SSD 本篇文章就当下主流的一些SSD接口进行简
  • OpenStack核心组件-horizon web 界面管理

    1 horizon 介绍 Horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 UI 服务 通过 Horizone 所提供的 DashBoard 服务 管理员可以使用通过 WEB UI 对 Opensta
  • Oracle 批量提交,批量绑定 OCIBindByName 和OCIBindObject 的使用

    穷遍所有OCI文档找不出一个能绑定多行数据的说明和示例 自己尝试快两周解决了Oracle Spatial 批量绑定将Oracle的写入效率提升到了5000行左右 以下是一点心得 Oracle OCI 基本操作 本文不多说 假设你会用基本的O
  • [面试题]java程序内存泄漏怎么排查

    java程序内存泄漏怎么排查 首先了解几个命令 怎么判断当前程序有没有出现内存溢出 模拟代码 模拟步骤 判断依据 出现内存溢出怎么办 最原始的方法 使用JProfiler解析hprof文件 在线dump文件分析网站https console
  • PCB相关知识-封装+元件属性+印制电路板PCB

    文章目录 封装Footprint 元件属性Properties 印制电路板PCB 封装Footprint 每个元器件都对应一个封装 封装相当于元器件在现实中的载体 原理图导入到PCB中的除了网络信息 还有封装信息 我们在PCB中移动摆放的就
  • vscode 好用的插件推荐

    vscode 好用的插件推荐 文章目录 vscode 好用的插件推荐 1 Tabnine 安装 使用 2 Git Graph 安装 使用 3 Comment Translate 安装 使用 1 Tabnine Tabnine 需要大量的代码
  • Vue3 Vite4 ElementPlus TS模板(含Vue-Router4+Pinia4)

    引言 手动安装配置Vue3 ElementPlus模板比较繁琐 网上寻找一些模板不太符合自己预期 因此花点精力搭建一个符合自己需求的架子 采用最新的组件 版本如下 vite 4 3 9 vite plugin mock 2 9 8 vue
  • Openwrt 自编译后安装官方ipk时产生kernel MD5不兼容的问题处理

    目录 环境 原因 解决方法 最后 环境 芯片 V3S 软件 基于Openwrt 19 07 3的自编译版本 问题 在安装需要校验kernel版本的ipk时 无法安装 报错 satisfy dependencies for Cannot sa
  • Linux·深入理解 ext4 等 Linux 文件系统

    了解 ext4 的历史 包括其与 ext3 和之前的其它文件系统之间的区别 目前的大部分 Linux 文件系统都默认采用 ext4 文件系统 正如以前的 Linux 发行版默认使用 ext3 ext2 以及更久前的 ext 对于不熟悉 Li
  • 网络安全课程设计Java实现DES加密算法(可视化界面)代码+设计文档

    一 DES加密 解密算法 DES是一种对称加密算法 DES算法明文分组长度为64 bit 秘钥长度也为64 bit 但是实际密钥长度只有56位 其中第8 16 24 32 40 48 56 64位是奇偶校验位 用于检查密钥在产生 分配及存储
  • 安装 Nginx后无法正常显示欢迎界面的问题--解决方案

    问题 在终端中输入 curl 127 0 0 1 后 代码中出现404 解决方案 1 卸载nginx 需要预先安装 aptitude aptitude remove nginx 2 重装nginx apt get install nginx
  • 由浅入深理解区块链技术

    一 区块链技术概述 区块链技术的核心思想与密码朋克组织的渊源很深 这个组织由一批致力于个人隐私保护的密码学爱好者组成 他们认为在互联网环境下想要保护个人隐私 应该使用基于技术的而非其他组织背书的加密方法 不能够全部依靠大型机构提供的加密工具
  • STM32使用SRAM扩展内存

    目录 一 SRAM介绍 二 STM32F103系列的FSMC模块 三 初始化配置及数据访问 四 使全局变量定义在外部SRAM中的方法 五 参考文章及资料 一 SRAM介绍 SRAM Static Random Access Memory 即
  • mesh学习1

    TOC 基础一 初识基础 首先点和面的联系 三个点构成一个小三角形 然后面就是由无数的小三角形构成 另外相同位置的顶点可以复用 就像一个正方形 四个点即可 三角面有正反之分 关键看法线方向 发现朝外的 我们能看到 反过来就看不到了 可以参考