Unity3d Mesh篇(三)— 创建立方体

文章目录

  • 前言
  • 一、Mesh组成
  • 二、使用步骤
      • GetVertices方法
      • GetTriangles方法
      • OnDrawGizmos方法
  • 三、效果
  • 四、总结


前言

在 Unity 中,创建立方体是学习和理解网格(Mesh)基础知识的重要一步。本篇教程将介绍如何使用 C# 脚本在 Unity 中创建一个简单的立方体,并使用 MeshFilter 和 MeshRenderer 组件来渲染它。


一、Mesh组成

顶点(vertex):顶点是物体表面上的点,用 Vector3 类型表示它们在局部空间中的位置。
法线(normal):法线是顶点的方向,用 Vector3 类型表示它们在局部空间中的单位向量。
UV 坐标(uv):UV 坐标是顶点的纹理坐标,用 Vector2 类型表示它们在纹理图像中的位置。
三角形(triangle):三角形是物体表面上的面,用整数数组表示它们由哪些顶点组成。每个三角形由三个顶点索引构成,顶点索引是顶点数组中的位置。

二、使用步骤

首先,我们需要在 Unity 中创建一个空的 3D 项目。然后,我们需要在场景中添加一个空的游戏对象,我们可以把它命名为 “Triangle” ,这将是我们的网格生成器。为了让我们的网格能够显示在屏幕上,我们还需要给它添加一些组件,分别是:

MeshFilter:这个组件允许我们上传和存储我们的网格数据,以供 Unity 的图形 API 渲染。
MeshRenderer:这个组件负责渲染我们的网格,我们给它指定一个材质来改变网格的颜色和外观。
C# 脚本:这个组件是我们编写网格生成逻辑的地方,我们把它命名为 “Test”

下图是我们的游戏对象在inspector面板中的样子:
在这里插入图片描述

首先,我们需要在游戏对象上添加MeshFilter组件和MeshRenderer组件。这可以通过RequireComponent属性来实现,它会在挂载脚本的时候,自动添加指定的组件。

//挂载脚本的时候,自动添加下面的组件
[RequireComponent(typeof(MeshFilter)),RequireComponent(typeof(MeshRenderer))]

在Start方法中,我们首先创建了一个Mesh对象,并将其赋值给MeshFilter组件。然后,我们启动一个协程GeneratePlane()来生成平面。

private void Start()
{
    _mesh = new Mesh();
    GetComponent<MeshFilter>().mesh = _mesh;
    _mesh.name = "Mesh03";
    StartCoroutine(GeneratePlane());
}

这个协程用于生成立方体。首先调用 GetVertices 方法生成顶点,然后设置 Mesh 的顶点数组,接着调用 GetTriangles 方法生成三角形,最后设置 Mesh 的三角形数组。

private IEnumerator GenerateCube()
{
    yield return GetVertices(Vector3.zero, 1f);
    _mesh.vertices = _vertices;
    yield return GetTriangles();
}

GetVertices方法

根据指定的中心点和立方体大小,生成立方体的顶点数组

private IEnumerator GetVertices(Vector3 center,float cubeSize)
{
    _vertices = new Vector3[8];
    // 清除网格的数据
    _mesh.Clear();
    // 计算正方形的四个顶点的坐标
    float halfEdge = cubeSize / 2;
    _vertices[0] = center + new Vector3(-halfEdge, -halfEdge, -halfEdge);
    yield return new WaitForSeconds(0.2f);
    _vertices[1] = center + new Vector3(halfEdge, -halfEdge, -halfEdge);
    yield return new WaitForSeconds(0.2f);
    _vertices[2] = center + new Vector3(-halfEdge, -halfEdge, halfEdge);
    yield return new WaitForSeconds(0.2f);
    _vertices[3] = center + new Vector3(halfEdge, -halfEdge, halfEdge);
    yield return new WaitForSeconds(0.2f);
    _vertices[4] = center + new Vector3(-halfEdge, halfEdge, -halfEdge);
    yield return new WaitForSeconds(0.2f);
    _vertices[5] = center + new Vector3(halfEdge, halfEdge, -halfEdge);
    yield return new WaitForSeconds(0.2f);
    _vertices[6] = center + new Vector3(-halfEdge, halfEdge, halfEdge);
    yield return new WaitForSeconds(0.2f);
    _vertices[7] = center + new Vector3(halfEdge, halfEdge, halfEdge);

}

GetTriangles方法

生成立方体的三角形数组,共 36 个三角形。

private IEnumerator GetTriangles() {
	_triangles = new int[36];
	_triangles[0] = 0;
	_triangles[1] = 1;
	_triangles[2] = 2;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[3] = 1;
	_triangles[4] = 3;
	_triangles[5] = 2;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[6] = 6;
	_triangles[7] = 5;
	_triangles[8] = 4;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[9] = 6;
	_triangles[10] = 7;
	_triangles[11] = 5;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[12] = 5;
	_triangles[13] = 7;
	_triangles[14] = 1;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[15] = 7;
	_triangles[16] = 3;
	_triangles[17] = 1;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[18] = 4;
	_triangles[19] = 5;
	_triangles[20] = 0;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[21] = 5;
	_triangles[22] = 1;
	_triangles[23] = 0;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[24] = 6;
	_triangles[25] = 4;
	_triangles[26] = 0;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[27] = 0;
	_triangles[28] = 2;
	_triangles[29] = 6;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[30] = 7;
	_triangles[31] = 6;
	_triangles[32] = 2;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
	_triangles[33] = 3;
	_triangles[34] = 7;
	_triangles[35] = 2;
	_mesh.triangles = _triangles;
	yield return new WaitForSeconds(0.2 f);
}

OnDrawGizmos方法

用于在Scene视图中绘制顶点的辅助图形,方便调试和观察

private void OnDrawGizmos()
{
    if (_vertices == null) return;
    for (int i = 0; i < _vertices.Length; i++)
    {
        // 遍历所有顶点,绘制球形代表每个顶点
        Gizmos.DrawSphere(_vertices[i], 0.2f);
    }
}

三、效果

在这里插入图片描述

四、总结

通过本教程,你学会了如何使用 C# 脚本在 Unity 中创建一个简单的立方体,并使用 MeshFilter 和 MeshRenderer 组件来渲染它。立方体的创建是理解网格基础知识的重要一步,希望本教程能够帮助你更深入地了解 Unity 中的网格操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PSO-CNN-LSTM多输入时序预测|粒子群算法优化的卷积-长短期神经网络时序预测(Matlab)——附代码+数据

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序数据分享下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台…

怎样消除视频上的字幕和文字?3个方法值得推荐

怎样消除视频上的字幕和文字&#xff1f;消除视频上的字幕和文字不仅是一个常见的需求&#xff0c;更是一个对视频内容质量提升的关键步骤。特别是在处理从网络下载的带有水印或标识的视频时&#xff0c;这些额外的文字和信息往往会干扰观众的观看体验&#xff0c;甚至可能影响…

Excel中使用ROW函数自动更新行号或编号

操作步骤&#xff1a; 1、在编号“1”的单元格输入公式“ROW()-1”&#xff1b; 2、在上一步填好公式的单元格基础上下拉填充&#xff0c;即可批量得到编号&#xff0c;如果删掉其中的一行或几行&#xff0c;编号会自动进行更新。

vscode更新至1.86版本后,ssh远程连接服务器出现异常

问题 you are connected to an OS version that is unsupported by Visual Studio Code 你已连接到不受Visual Studio Code支持的OS 版本 原因是vscode更新到1.86版本后要求远程连接服务器的内核版本和库版本需要符合下面条件。 解决方法 因此有两种方法解决 1.更新服务器…

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方&#xff0c;试一下一句话木马 txt 不让传txt 另存为tlyjpg&#xff0c;木马文件上传成功 给出了存放目录&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…

Java-nio

一、NIO三大组件 NIO的三大组件分别是Channel&#xff0c;Buffer与Selector Java NIO系统的核心在于&#xff1a;通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如&#xff1a;文件、套接字)的连接。若需要使用 NIO 系统&#xff0c;需要获取用于连接 IO 设备的通…

ChatGPT 是什么?如何订阅ChatGPTPLUS?

ChatGPT 是什么&#xff1f; ChatGPT 是一种大型语言模型&#xff08;LLM&#xff09;&#xff0c;由OpenAI开发。 它使用深度学习技术来模拟人类的语言生成和理解能力&#xff0c;可以用于自然语言处理、对话系统等多种应用。 ChatGPT基于自然语言处理技术和神经网络模型&a…

无字母数字rce总结(自增、取反、异或、或、临时文件上传)

目录 自增 取反 异或 或 临时文件上传 自增 自 PHP 8.3.0 起&#xff0c;此功能已软弃用 在 PHP 中&#xff0c;可以递增非数字字符串。该字符串必须是字母数字 ASCII 字符串。当到达字母 Z 且递增到下个字母时&#xff0c;将进位到左侧值。例如&#xff0c;$a Z; $a;将…

化肥工业5G智能制造工厂数字孪生可视化平台,推进化肥行业数字化转型

化肥工业5G智能制造工厂数字孪生可视化平台&#xff0c;推进化肥行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的必然趋势。在化肥工业领域&#xff0c;5G智能制造工厂数字孪生可视化平台的应用正在逐渐普及&#xff0c;为行业数字化转型提供…

vue3 + vite 项目可以使用纯Js开发吗?

答案&#xff1a;可以 创建项目&#xff1a; 按照链接参考或者按官方&#xff1a; webstorm 创建vue3 vite 项目-CSDN博客 项目目录 tsconfig.json 配置允许js allowJs指定是否编译js文件&#xff0c;在任意文件当中,如果我们模块使用js写的&#xff0c;那么我们需要 将all…

Redis---持久化

Redis是内存数据库&#xff0c;是把数据存储在内存中的&#xff0c;但是内存中的数据不是持久的&#xff0c;如果想要做到持久&#xff0c;那么就需要让redis将数据存储到硬盘上。 Redis持久化有两种策略&#xff1a; RDB > Redis DataBase RDB机制采取的是定期备份AOF …

JSON 文件里的 “$schema” 是干什么用的?

最近我在做一些前端项目&#xff0c;我发现有的配置文件&#xff0c;比如 .prettierrc.json 或者 tsconfig.json 里面都会看到一个 $schema 字段&#xff0c;有点好奇&#xff0c;就查了一下。 什么是 JSON Schema JSON Schema是一种基于JSON (JavaScript Object Notation) 的…

多模态论文阅读-LLaVA

Visual Instruction Tuning Abstract1. Introduction2. Related Work3. GPT-assisted Visual Instruction Data Generation4. Visual Instruction Tuning4.1 Architecture4.2 Training 5 Experiments5.1 Multimodal Chatchot5.2 ScienceQA 6 Conclusion Abstract 使用机器生成…

【LeetCode-中等】209.长度最小的子数组-双指针/滑动窗口

力扣题目链接 1. 暴力解法 这道题的暴力解法是两层嵌套for循环&#xff0c;第一层循环从 i 0 开始遍历至数组末尾&#xff0c;第二层循环从 j i 开始遍历至找到总和大于等于 target 的连续子数组&#xff0c;并将该连续子数组的长度与之前找到的子数组长度相比较&#xff0…

tcpdump 常用用法

简要记录下tcpdump用法 监控某个ip上的某个端口的流量 tcpdump -i enp0s25 tcp port 5432 -nn -S 各个参数作用 -i enp0s25 指定抓包的网卡是enp0s25 -nn 显示ip地址和数字端口 &#xff0c;如果只 -n 则显示ip&#xff0c;但是端口为services文件中的服务名 如果一个…

YOLOv8-TensorRT on Jetson

YOLOv8-TensorRT Jetson 项目地址&#xff1a;https://github.com/triple-Mu/YOLOv8-TensorRT/blob/main/docs/Jetson.md 文档地址&#xff1a;https://github.com/triple-Mu/YOLOv8-TensorRT/blob/main/docs/Jetson.md 注意 engine 文件不跨平台&#xff0c;只能在对应的平台…

无人机飞行控制系统技术,四旋翼无人机控制系统建模技术详解

物理建模是四旋翼无人机控制系统建模的基础&#xff0c;主要涉及到无人机的物理特性和运动学特性。物理建模的目的是将无人机的运动与输入信号&#xff08;如控制电压&#xff09;之间的关系进行数学描述。 四旋翼无人直升机是具有四个输入力和六个坐标输出的欠驱动动力学旋翼…

基于springboot+vue的线上辅导班系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Spring容器中使用依赖注入时对象为空的原因

问题描述 在用spring容器依赖注入时&#xff0c;Autowired注入的类对象为空。 如上图&#xff0c;new了一个handresponse对象&#xff0c;在调用的handresult()函数中用 Autowired注入了类实例化对象&#xff0c;导致该实例化对象为空&#xff0c;如下图。 从而引发了空指针异…

【Linux C | 网络编程】gethostbyaddr 函数详解及C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…