当前位置: 首页 > news >正文

Unity 顶点vertices,uv,与图片贴图,与mesh

mesh就是组成3d物体的三角形们。

mesh由顶点组成的三角形组成,三角形的大小 并不 需要一样,由顶点之间的位置决定。

mesh可以是一个或者多个面。

贴图的原点在左下角,uv是贴图的坐标,数量和顶点数一样(不是100%确定,比如前后左右4个面,贴图最终如何封闭,我还不知道),是贴图和顶点的对应关系。

新建空场景,把一下代码放到main camera:

using System;
using System.Collections;
using System.Collections.Generic;using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endifpublic class codeMesh2 : MonoBehaviour
{GUIStyle fontStyle = new GUIStyle();string msg = " - - ";// Start is called before the first frame updateVector3 center = new Vector3();GameObject o;bool ready = false;//int startCalled = 0;Camera c;string err = "";int moveRage = 25; int moveRage2 = 0;int moveRage2_1 = 0;Mesh mesh = null;public int width = 10;public int height = 10;public Texture aText = null;/// <summary>/// 上一次更新帧率的时间/// </summary>private float m_lastUpdateShowTime = 0f;/// <summary>/// 更新显示帧率的时间间隔/// </summary>private readonly float m_updateTime = 0.05f;/// <summary>/// 帧数/// </summary>private int m_frames = 0;/// <summary>/// 帧间间隔/// </summary>//private float m_frameDeltaTime = 0;private float m_FPS = 0;//private Rect m_fps, m_dtime;//顶点数组private Vector3[] vertices;//顶点法线private Vector3[] normals;private MeshFilter meshFilter;private int i = 0;private bool f = false;private string test2 = "";private int waitCount = 0;private void Awake(){Application.targetFrameRate = 30;moveRage2 = moveRage * 2;moveRage2_1 = moveRage * 2 - 1;fontStyle.normal.background = null;    //设置背景填充fontStyle.normal.textColor = Color.red;   //设置字体颜色fontStyle.fontSize = 40;fontStyle.wordWrap = true;c = GetComponent<Camera>();msg += " Waiting ";Vector3 v1 = new Vector3(5, 5, 5);Vector3 v2 = new Vector3(5, 5, 3);test2 = (v2 - v1).normalized.ToString();}void Start(){try{o = GenerateMeshTest1();center = c.transform.position;o.name = "d mesh";o.transform.position = new Vector3(-5, -5, 20);o.transform.localScale = new Vector3(10.0f, 10.0f, 10.0f);o.transform.rotation = Quaternion.Euler(new Vector3(0, 45, 45));m_lastUpdateShowTime = Time.realtimeSinceStartup;ready = true;}catch (Exception e){err = printException(e);}aText = Resources.Load("type/two_sizes") as Texture;o.GetComponent<MeshRenderer>().material.mainTexture = aText;#if UNITY_EDITORshowNormals();
#endif}private void OnGUI(){GUI.color = Color.red;msg = "fps=" + m_FPS + "/"+ Application.targetFrameRate +(err.Length>1?(", err=" + err):"")  + " waitCount = " + (ready? waitCount : (waitCount++));GUI.Label(new Rect(50, 10, 900, 100), "" + test2, fontStyle);GUI.Label(new Rect(100, 100, 900, 100), "[V07]:" + msg, fontStyle);}// Update is called once per framevoid Update(){if (!ready) return;int ri = i % (moveRage2);float x = ri - moveRage;if (!f){x = moveRage - ri;}if (ri == moveRage2_1){f = !f;}//o.transform.position = new Vector3(x, x, 20);//Debug.Log(x);//o.transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));/*Mesh mesh = o.GetComponent<MeshFilter>().mesh;//mesh.Clear();Vector3[] vertices = mesh.vertices;Vector3[] normals = mesh.normals;for (var i = 0; i < vertices.Length; i++){vertices[i] += normals[i] * Mathf.Sin(Time.time);}mesh.vertices = vertices;*/m_frames++;if (Time.realtimeSinceStartup - m_lastUpdateShowTime >= m_updateTime){m_FPS = m_frames / (Time.realtimeSinceStartup - m_lastUpdateShowTime);//m_frameDeltaTime = (Time.realtimeSinceStartup - m_lastUpdateShowTime) / m_frames;m_frames = 0;m_lastUpdateShowTime = Time.realtimeSinceStartup;//Debug.Log("FPS: " + m_FPS + ",间隔: " + m_FrameDeltaTime);}i++;}private GameObject GenerateMeshTest1(){GameObject obj = new GameObject();meshFilter = obj.AddComponent<MeshFilter>();//创建meshmesh = new Mesh();meshFilter.mesh = mesh;MeshRenderer renderer = obj.AddComponent<MeshRenderer>();//标准材质Material mat = new Material(Shader.Find("Legacy Shaders/Transparent/Diffuse"));mat.color = Color.white;renderer.material = mat;//创建顶点和UVvertices = new Vector3[6];Vector2[] uv = new Vector2[6];vertices[0] = new Vector3(0, 1, 0);//0vertices[1] = new Vector3(1, 1, 0);//1vertices[2] = new Vector3(1, 0, 0);//2vertices[3] = new Vector3(0, 0, 0);//3vertices[4] = new Vector3(0, 0, 1);//4vertices[5] = new Vector3(1, 0, 1);//5-int k = 0;uv[k++%6] = new Vector2(0, 1);uv[k++ % 6] = new Vector2(1, 1);uv[k++ % 6] = new Vector2(1, 0.5f);uv[k++ % 6] = new Vector2(0,0.5f);uv[k++ % 6] = new Vector2(0, 0);uv[k++ % 6] = new Vector2(1, 0);mesh.vertices = vertices;mesh.uv = uv;//mat.mainTexture = aText;int[] triangles = new int[12];k = 0;triangles[k++] = 3;triangles[k++] = 2;triangles[k++] = 5;triangles[k++] = 3;triangles[k++] = 5;triangles[k++] = 4; triangles[k++] = 0;triangles[k++] = 1;triangles[k++] = 2;triangles[k++] = 0;triangles[k++] = 2;triangles[k++] = 3;mesh.triangles = triangles; //三角面mesh.RecalculateNormals();  //计算法线/*Vector3[] normals = new Vector3[4];normals[0] = Vector3.back;normals[1] = Vector3.back;normals[2] = Vector3.back;normals[3] = Vector3.back;mesh.normals = normals;*///mesh.SetIndices//mat.SetTexture()return obj;}public static string printException(Exception e){return "\n\trs=" + e.HResult + ",\n\tmsg=" + e.Message + ",\n\tstack=" + e.StackTrace + "\n------------------------------------\n";}#if UNITY_EDITORprivate void showNormals(){if (mesh != null){//当前对象的操做从局部空间转换到世界空间 这样在下面的操作位置即可同步 否则位置是不会同步的Handles.matrix = meshFilter.transform.localToWorldMatrix;Handles.color = Color.green;int vertextCount = mesh.vertices.Length;//采用从顶点的位置[法线的起点】到法线的终点位置,既可以显示出当前顶点的法线for (int index = 0; index < vertextCount; index++){Handles.DrawLine(vertices[index], vertices[index] + normals[index]);}}}
#endif
}

two_sizes.png是一张 宽高比为1:2的图片。

三角形之间的定义顺序不会影响贴图。但单个三角形三个顶点是逆时针,则从外部可以看到贴图,从内部看不到。反之亦然:

(顺时针之后,从内部可见)

如果把图片直接放到场景,则两面都可见。

相关文章:

Unity 顶点vertices,uv,与图片贴图,与mesh

mesh就是组成3d物体的三角形们。 mesh由顶点组成的三角形组成&#xff0c;三角形的大小 并不 需要一样&#xff0c;由顶点之间的位置决定。 mesh可以是一个或者多个面。 贴图的原点在左下角&#xff0c;uv是贴图的坐标&#xff0c;数量和顶点数一样&#xff08;不是100%确定…...

Shell编程之函数

目录 基本概念 自定义函数 系统函数 1.read 2.basename 3.dirname 基本概念 将一段代码组合封装在一起实现某个特定的功能或返回某个特定的值&#xff0c;然后给这段代码取个名字&#xff0c;也就是函数名&#xff0c;在需要实现某个特定功能的时候直接调用函数名即可。 函…...

10.物联网LWIP之TCP状态转变

一。TCP状态机 1.青粗线&#xff1a;理想TCP状态转变&#xff08;服务器视角下&#xff09; 2.虚线&#xff1a;被动TCP状态转变&#xff08;服务器视角下&#xff09; 3.细实线&#xff1a;不经常出现的TCP状态转变&#xff08;类似于边界处理&#xff09; 1.青粗线解释--》服…...

Img标签的src地址自动拼接本地域名(localhost:8080)导致图片不显示问题

摘要&#xff1a;做Vueelement ui项目的时候&#xff0c;发现使用element ui的upload上传图片时&#xff0c;不显示的问题。我项目的图片是上传到七牛云&#xff0c;长传成功后返回存储在七牛云中的地址。后面发现是因为返回的地址是外部地址&#xff0c;需要完整的URL&#xf…...

数据结构入门 — 栈

本文属于数据结构专栏文章&#xff0c;适合数据结构入门者学习&#xff0c;涵盖数据结构基础的知识和内容体系&#xff0c;文章在介绍数据结构时会配合上动图演示&#xff0c;方便初学者在学习数据结构时理解和学习&#xff0c;了解数据结构系列专栏点击下方链接。 博客主页&am…...

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 目录 Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 一、简单介绍 二、OKHttp 4.xx 的 SDK 封装 aar 给 Unity 的使用注意 三、附录 OKHttp 的…...

内嵌功能强大、低功耗STM32WB55CEU7、STM32WB55CGU7 射频微控制器 - MCU, 48-UFQFN

一、概述&#xff1a; STM32WB55xx多协议无线和超低功耗器件内嵌功能强大的超低功耗无线电模块&#xff08;符合蓝牙 低功耗SIG规范5.0和IEEE 802.15.4-2011标准&#xff09;。该器件内含专用的Arm Cortex -M0&#xff0c;用于执行所有的底层实时操作。这些器件基于高性能Arm …...

【测试】笔试03

文章目录 1. 哪种测试模型把测试过程作为需求分析、概要设计、详细设计及编码之后的阶段&#xff08; &#xff09;2. 在下面所列举的逻辑测试覆盖中&#xff0c;测试覆盖最强的是&#xff1f;3. 网络管理员编写了shell程序prog1.sh,测试时程序死循环无法结束,可以通过下列方式…...

JavaScript的while和for循环

一、循环语句 1.认识循环 在开发中我们经常需要做各种各样的循环操作&#xff1a; 比如把一个列表中的商品、歌曲、视频依次输出进行展示&#xff1b;比如对一个列表进行累加计算&#xff1b;比如运行相同的代码将数字 1 到 10 逐个输出&#xff1b; 循环 是一种重复运行同…...

mqtt安卓客户端

1.MQTT&#xff08;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于 发布/订阅 &#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c; 该协议构建于TCP/IP协议上 。MQTT最大优点在于&#xff0c;可以以极少的代码和有限的带宽&…...

pdf怎么删除其中一页?

pdf怎么删除其中一页&#xff1f;现在&#xff0c;pdf文件已经深入影响着我们的工作和学习&#xff0c;如果你是一个上班族&#xff0c;那么几乎每天都会使用到pdf格式的电脑文件。当我们阅读一个页数众多的PDF文件时&#xff0c;可能会发现实际上只需要其中的一小部分内容。很…...

10.Redis 渐进式遍历

Redis 渐进式遍历 渐进式遍历scan 渐进式遍历 keys 命令一次性的把整个redis中所有的key都获取到&#xff0c;keys *但这个操作比较危险&#xff0c;可能会一下子得到太多的key,阻塞 redis 服务器。 通过渐进式遍历&#xff0c;就可以做到&#xff0c;既可以获取到所有的 key&…...

字符函数和字符串函数(2)

目录 memcpy memmove memcmp memcpy void * memcpy ( void * destination, const void * source, size_t num ); 1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 2.这个函数在遇到 \0 的时候并不会停下来。 3.如果source和destination有…...

目录扫描+JS文件中提取URL和子域+403状态绕过+指纹识别(dirsearch_bypass403)

dirsearch_bypass403 在安全测试时&#xff0c;安全测试人员信息收集中时可使用它进行目录枚举&#xff0c;目录进行指纹识别&#xff0c;枚举出来的403状态目录可尝试进行绕过&#xff0c;绕过403有可能获取管理员权限。不影响dirsearch原本功能使用 运行流程 dirsearch进行…...

【UE 材质】常用向量运算节点——点积、叉积、归一化

目录 一、点积 二、叉积 三、归一化 一、点积 点积&#xff0c;也称为内积或数量积&#xff0c;是一种用于计算两个向量之间关系的操作。对于两个三维向量 A&#xff08;a1,a2,a3&#xff09;和 B(b1,b2,b3)&#xff0c;它们的点积可以用以下公式表示&#xff1a; ABa1​⋅…...

音视频 ffmpeg命令提取PCM数据

提取PCM ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f…...

【MySQL】实现可扩展性:构建高性能的系统

什么是可扩展性&#xff1f;可扩展性的好处扩展方式纵向扩展&#xff08;Scaling Up&#xff09;横向扩展&#xff08;Scaling Out&#xff09; 总结 &#x1f4af;感谢 &#x1f496; 什么是可扩展性&#xff1f; 可扩展性是指系统能够在需要时轻松地适应更多的工作负载和资源…...

网站用户体验之深度感悟

个性化定制界面和极简版原装界面&#xff0c;哪一个你用起来更加顺手呢&#xff0c;相比之下你更喜欢哪一个&#xff1f; 界面选择&#xff1a; &#xff08;提醒&#xff1a;仅个人感悟。~~&#xff09; 方向一&#xff1a;表明自己的喜好 我个人觉得更喜欢个性化定制界面。…...

目标检测YOLO实战应用案例100讲-道路场景下目标检测与分割模型的压缩研究与实现

目录 前言 目标检测方法 语义分割方法 相关理论基础 2.1 YOLO目标检测算法介绍...

基于MSP430 红外避障-遥控小车(电赛必备 附项目代码)

文章目录 一、硬件清单二、模块连接三、程序设计四、项目源码 项目环境&#xff1a; 1. MSP430F55292. Code Composer Studio3. 蓝牙调试助手 项目简介&#xff1a; 小车可分为3种工作模式&#xff0c;每种工作模式都会打印在OLED显示屏上&#xff0c;通过按键转换工作模式。 模…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...