首页 > 编程语言 >Unity网格编程学习(一)

Unity网格编程学习(一)

时间:2024-09-04 19:37:27浏览次数:10  
标签:贴图 Vector3 编程 网格 private Unity mesh new 绘制

目录

1.创建平面


Unity有Mesh Filter和Mesh Renderer组件,通过编辑Mesh Filter的Mesh属性进行绘制,并使用Mesh Renderer将图形渲染到屏幕上。

//在C#脚本顶部使用这段语句检测绑定该脚本的对象是否存在Mesh Filter和Mesh Renderer组件,如果没有则创建
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]

使用以下代码编辑网格

private Mesh mesh;
private void Start()
{
    mesh = new Mesh();
    MeshFilter filter = this.GetComponent<MeshFilter>();
    filter.mesh = mesh;
    mesh.vertices = GetVertexs();
    mesh.triangles = GetTriangles();
}

获取Mesh filter组件并绑定mesh后,需要对mesh的顶点和绘制方式进行编辑
使用以下方法获取顶点和绘制信息

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

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

即可得到绘制的三角形

在GetVertexs方法中定义了三个顶点(0, 0, 0),(0, 1, 0),(1, 1, 0),如图所示

同时在GetTriangle方法中定义的数组0,1,2代表从第一个顶点->第二个顶点->第三个顶点进行绘制,如图所示

当数组中的值改为0,2,1时,会发现无法看到任何图案,移动摄像机,可以在反面发现以下的图案

这是因为在绘制平面时,顺时针方向绘制的平面方向可以被绘制出来,当绘制顺序变成0,2,1时,在正面以逆时针的方向进行绘制,所以平面将会在反面以上图的方式进行绘制

接下来通过对GetVertexs和GetTriangle方法中添加更多数据进行正方形的绘制

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

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

加入新的顶点(1, 0, 0)
加入新的绘制顺序0,2,3
即可得到新的平面图案,使用Shaded Wireframe模式可以更加清晰的看到路线

2.使用UV贴图


为对象的材质添加贴图,会发现在绘制的平面上并不能正确地显示贴图

这是因为我们需要对mesh的uv进行设置,指定贴图的位置
输入mesh的uv
mesh.uv = GetUVs();
定义GetUVs方法

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

即可得到如下所示的图案

这段数据将UV图的四个顶点与mesh的四个顶点进行对应,即可在平面上绘制贴图,当UV的顶点数据改为(1,1),(1,0),(0,0),(0,1)时,将会得到如下所示的图案

这是因为开始时UV贴图上的(0,0)与mesh的(0,0,0)对应,(0,1)与(0,1,0)对应...
修改UV顶点的数据后,UV贴图的(1,1)顶点与mesh的(0,0,0)对应,(1,0)与(0,1,0)对应... 所以平面上的图案翻转了过来

3.使用法线贴图


输入mesh的法线数据
mesh.normals = GetNormals();
定义GetNormals方法

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

可以发现当输入的数据为Vector3.right(1,0,0)时,绘制的图案收到的光照与立方体右侧的光照情况一致

在材质球上直接添加法线贴图时,会产生如下效果

通过输入切线数据来使法线贴图产生效果
private Vector4 tagent = new Vector4(0, 1, 0, -1);
mesh.tangents = GetTangents();

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


当修改tangent数据为(1, 0, 0, -1)时将会产生如下效果

这是因为光照情况由垂直于切线与法线组成平面的向量来计算,当切线方向变为(1,0,0)与法线一致时,无法进行有效的计算,所以平面会变光滑。tangent变量(0, 1, 0, -1),前三个数据代表了切线的方向,第四个值用于表示不同的坐标系空间

标签:贴图,Vector3,编程,网格,private,Unity,mesh,new,绘制
From: https://www.cnblogs.com/ekros-blog/p/18397095

相关文章

  • Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue
    BlockingQueueBlockingQueue是Java并发包(java.util.concurrent)中提供的一个阻塞队列接口,它继承自Queue接口。BlockingQueue中的元素采用FIFO的原则,支持多线程环境并发访问,提供了阻塞读取和写入的操作,当前线程在队列满或空的情况下会被阻塞,直到被唤醒或超时。常用的......
  • C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示
    1、本节实现的内容上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析,这节课......
  • 探秘JavaScript深度领域:精通面向对象编程、虚拟DOM等核心技术
    JaScript作为前端开发的核心技术之一,凭借其强大的灵活性和广泛的应用场景,吸引了大量开发者深入学习。在探秘JaScript的深度领域时,面向对象编程和虚拟DOM等核心技术无疑是两个重要的学习方向。面向对象编程(OOP)在JaScript中扮演着重要角色。虽然JaScript是一种基于原型的语言,而非传......
  • unity ui控件与C#脚本类对应表
    unityui控件与C#脚本类对应表原文中文C#--classesImage图像ImageText-TextMeshPro文本-TextMeshPrcTMP_TextRawImage原始图像RawImagePanel面板ImageToggle切换ToggleSlider滑动条SliderScrollbar滚动条ScrollbarScrollView滚动......
  • ARM微处理器编程模型与linux驱动开发
    文章目录微处理器指令系统数据类型字节对符号位扩展ARM体系结构ARM处理器工作模式寄存器异常过程调用标准程序内存划分STM32的使用常用资源GPIO口的使用GPIO固件库的使用STM固件库Proteus常用元器件中断AD转换BootLoader的定制:嵌入式......
  • 并行编程原理与实践-MPI实现快排
    并行编程原理与实践-MPI实现快排1.VS2022配置MPI环境可参考这篇博客:http://t.csdnimg.cn/T390g2.具体代码#include<mpi.h>#include<stdio.h>#include<stdlib.h>voidquicksort(int*array,intlow,inthigh);intpartition(int*array,intlow,inthigh);......
  • 【推荐100个unity插件之32】对中文支持很好的unity插件,集新手引导、本地化多语言、红
    文章目录前言条件官网下载资源安装设置unityinput选项生成配置文件功能1、新手引导文档效果2、本地化多语言功能文档效果3、红点功能文档效果4、刘海屏适配文档效果6、可视化层级管理工具文档效果7、其他完结前言ThunderFireUXTool由网易雷火UX用户体验中......
  • 《C++编程规范》四、函数与操作符
    目录第25条正确地选择通过值、(智能)指针或者引用传递参数第25条正确地选择通过值、(智能)指针或者引用传递参数正确选择参数:分清输入参数、输出参数和输入/输出参数,分清值参数和引用参数。正确地传递参数。选择如何传递参数时,应该遵循以下准则。对于只输入(input-only)参数:始......
  • Unity Hub 安装 Editor 失败,出现 “Install failed: Validation Failed” 的解决方法
    网上有很多解决方法,但是对我来说没有什么用,还是安装不成功。所以我想到了查看错误日志,通过错误日志来把问题解决掉。要查看UnityHub的错误日志,你可以按照以下步骤操作:Windows:1.打开文件资源管理器:按Win+E打开文件资源管理器。2.导航到日志文件夹:进入以下路径......
  • 10个主流的AI编程工具合集
    AI编程工具在软件开发、算法设计、数据分析等领域发挥着越来越重要的作用。下面是一些主流的AI编程工具合集,以及它们的主要功能、优点和缺点介绍:JupyterNotebook功能:交互式笔记本,支持代码、文本、图表、公式等多种格式,常用于数据科学、机器学习项目。优点:直观易用,适合教学......