当前位置: 首页 > 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;通过按键转换工作模式。 模…...

告别黑白日志!用Xshell正则高亮集,让服务器报错、成功信息一目了然

告别黑白日志&#xff01;用Xshell正则高亮集&#xff0c;让服务器报错、成功信息一目了然 在运维和开发人员的日常工作中&#xff0c;与服务器打交道是家常便饭。无论是查看系统日志、调试应用程序&#xff0c;还是执行自动化脚本&#xff0c;我们都需要面对大量的命令行输出信…...

告别FreeRTOS:在乐鑫ESP32-C3上为RT-Thread打上‘内核补丁’的完整指南

从FreeRTOS到RT-Thread&#xff1a;ESP32-C3内核替换的工程实践 在嵌入式开发领域&#xff0c;操作系统的选择往往决定了项目的技术栈和生态边界。对于习惯了ESP-IDF和FreeRTOS的开发者来说&#xff0c;RT-Thread以其模块化设计和丰富的中间件支持正成为颇具吸引力的替代方案。…...

从‘黑窗口’到彩色世界:用GLUT快速实现你的第一个OpenGL图形程序(含完整代码解析)

从命令行到绚丽图形&#xff1a;GLUT快速入门OpenGL视觉编程 在计算机图形学的浩瀚海洋中&#xff0c;OpenGL无疑是最闪耀的灯塔之一。对于初学者而言&#xff0c;如何快速跨过复杂的配置和抽象的理论&#xff0c;直接看到图形输出的成果&#xff0c;是激发学习兴趣的关键。本文…...

Go语言实现CI/CD流水线:从GitHub Actions到Argo CD的完整指南

Go语言实现CI/CD流水线&#xff1a;从GitHub Actions到Argo CD的完整指南 引言 CI/CD是现代软件开发的核心实践&#xff0c;Go语言项目可以通过各种CI/CD工具实现自动化构建、测试和部署。本文将深入探讨Go语言项目的CI/CD流水线实现&#xff0c;涵盖GitHub Actions、GitLab CI…...

C++ STL常用函数一览表(快速记忆版本)

C STL 常用数据结构与函数整理 这份笔记按常见 STL 容器分类整理&#xff0c;适合在刷题和复习时快速查阅。1. vector 1.1 特点 底层是动态数组支持随机访问尾部插入、删除效率高中间插入、删除效率低 1.2 常用定义 vector<int> v; vector<int> v(5); /…...

Logisim新手避坑指南:手把手搞定头歌平台偶校验解码电路(附完整data.circ文件配置)

Logisim新手避坑指南&#xff1a;手把手搞定头歌平台偶校验解码电路 第一次打开Logisim时&#xff0c;那个简陋的界面和密密麻麻的逻辑门可能会让你望而生畏。更不用说还要在头歌平台上完成偶校验解码电路的评测——光是看到"找不到GB2312ROM.circ"的报错就足以让大多…...

VSCode Mermaid Preview:面向技术团队的实时图表协作解决方案

VSCode Mermaid Preview&#xff1a;面向技术团队的实时图表协作解决方案 【免费下载链接】vscode-mermaid-preview Previews Mermaid diagrams 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-mermaid-preview 在技术文档编写、系统架构设计和项目规划过程中&…...

直流电机双闭环控制调参避坑指南:从Simulink仿真到稳定波形的关键几步

直流电机双闭环控制调参避坑指南&#xff1a;从Simulink仿真到稳定波形的关键几步 在电机控制领域&#xff0c;双闭环系统因其出色的动态性能和抗扰能力而广受青睐。然而&#xff0c;从理论设计到实际调试&#xff0c;工程师们常常会遇到各种"坑"&#xff1a;转速震荡…...

(最新版)GitGitHub实操图文详解教程(10)—SSH

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 1. 应用场景 前面几课已经完成了本地Git基础操作:先通过git init初始化仓库,再用git status查看状态,用git add把修改加入暂存区,用git commit创建本地提交,最后用git log查看提交历史。到…...

手把手教你用Obsidian+Excalidraw画流程图,告别切换软件的麻烦

手把手教你用ObsidianExcalidraw画流程图&#xff0c;告别切换软件的麻烦 每次写技术文档时&#xff0c;最让我头疼的就是画流程图。原本思路清晰&#xff0c;一打开绘图软件就卡壳——要么是工具太复杂&#xff0c;要么是画完图还要导出再插入笔记&#xff0c;来回切换几次灵感…...