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的图片。

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 el-tooltip 根据内容控制宽度大小换行和并且内容太短不显示

el-tooltip 根据长度自适应换行以及显隐 环境 vue: "3.2.37" element-ui: "2.1.8"要求 tooltip 根据内容自动换行如果内容超出显示省略号显示&#xff0c;不超出不显示 tooltip 代码 组件 // ContentTip 组件 <template><el-tooltipv-bind&qu…

【数学建模竞赛】超详细Matlab二维三维图形绘制

二维图像绘制 绘制曲线图 g 是表示绿色 b--o是表示蓝色/虚线/o标记 c*是表示蓝绿色(cyan)/*标记 ‘MakerIndices,1:5:length(y) 每五个点取点&#xff08;设置标记密度&#xff09; 特殊符号的输入 序号 需求 函数字符结构 示例 1 上角标 ^{ } title( $ a…

初识c++

文章目录 前言一、C命名空间1、命名空间2、命名空间定义 二、第一个c程序1、c的hello world2、std命名空间的使用惯例 三、C输入&输出1、c输入&输出 四、c中缺省参数1、缺省参数概念2、缺省参数分类3、缺省参数应用 五、c中函数重载1、函数重载概念2、函数重载应用 六、…

【⑰MySQL】 变量 | 循环 | 游标 | 处理程序

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL变量 | 循环 | 游标 | 处理程序的分享✨ 目录 前言1. 变量1.1系统变量1.2 用户变量 2. 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决 3. 流程控制3.1 分支结构3.2 循环结构3.3 跳转…

设计模式-9--迭代器模式(Iterator Pattern)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于提供一种统一的方式来访问一个聚合对象中的各个元素&#xff0c;而不需要暴露该聚合对象的内部结构。迭代器模式将遍历集合的责任从集合对象中分离出来&#xf…

【深入解析spring cloud gateway】07 自定义异常返回报文

Servlet的HttpResponse对象&#xff0c;返回响应报文&#xff0c;一般是这么写的&#xff0c;通过输出流直接就可以将返回报文输出。 OutputStream out response.getOutputStream(); out.write("输出的内容"); out.flush();在filter中如果发生异常&#xff08;例如…

Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

Socket 在Java中&#xff0c;Socket是一种用于网络通信的编程接口&#xff0c;它允许不同计算机之间的程序进行数据交换和通信。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍&#xff1a; Socket类型&…

1775_树莓派3B键盘映射错误解决

全部学习汇总&#xff1a; GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 入手树莓派3B之后用了没有多长时间&#xff0c;最初的这段时间感觉想让它代替我的PC机是不肯能的。性能先不说&#xff0c;我完全没有找到当初在我的笔记本上使…

css网格布局

css网格布局 常用属性 display: grid; //开启网格grid-template-columns: 2fr 1fr 1fr 1fr 1fr; //设置多少列每列宽度grid-gap: 10px; // 设置表格之间间距grid-template-rows: 50px 50px 50px 50px; // 设置多少行 每行的高度grid-column : 1 //占据位置 占据1格grid-colu…

机器人中的数值优化(九)——拟牛顿方法(下)、BB方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

某物联网数智化园区行业基于 KubeSphere 的云原生实践

公司简介 作为物联网 数智化园区一体化解决方案提供商&#xff0c;我们致力于为大中型园区、停车场提供软硬件平台&#xff0c;帮助园区运营者实现数字化、智能化运营。 在使用 K8s 之前我们使用传统的方式部署上线&#xff0c;使用 spug&#xff08;一款轻量级无 Agent 的自…

网络版五子棋C++实现

目录 1.项目介绍 2.开发环境 3.核心技术 4.环境搭建 5.WebSocketpp介绍 5.1WebSocketpp是什么 5.2为什么使用WebSocketpp 5.3原理解析&#xff1a; 5.4WebSocketpp主要特性 6.WebSocketpp使用 7.JsonCpp使用 8.MySQL API 9.项目模块设计以及流程图 10.封装日志宏…

NewStarCTF 2022 web方向题解 wp

----------WEEK1---------- BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP] 先看题目&#xff0c;要传参加绕过。 分析一下代码&#xff1a;首先get一个datadata://test/plain,Wel…。然后key1和2用数组可以绕过。num2077a可以绕过弱类型。eval()中的php语句被#注释了&#xff0c…

并发编程的故事——JUC

JUC 文章目录 JUC一、Semaphore二、CountDownLatch三、线程安全类 一、Semaphore 为什么需要用到Semaphore? 限流 Semaphore的场景&#xff1f; 秒杀商品的时候&#xff0c;不能够让那些没有秒杀成功的线程进入&#xff0c;只有占了坑位的才可以使用&#xff0c;这里可以用re…

【Hello Algorithm】二叉树相关算法

本篇博客介绍&#xff1a;介绍二叉树的相关算法 二叉树相关算法 二叉树结构遍历二叉树递归序二叉树的交集非递归方式实现二叉树遍历二叉树的层序遍历 二叉树难题二叉树的序列化和反序列化lc431求二叉树最宽的层二叉树的后继节点谷歌面试题 二叉树结构 如果对于二叉树的结构还有…

Linux命令执行完成提醒

有些命令任务执行时间较长&#xff0c;可以让其执行完成时发出声音来提示。 如下&#xff1a; ls && echo -e "\a" 前一条命令成功执行后&#xff0c;会发出声音。 如果当前不在Iterm2窗口里&#xff0c;还会弹窗提示。

2023新版医保目录明细(药品查询)

查询医保目录的主要目的是为了了解医保政策对于特定医疗服务、药品和医疗器械的覆盖范围和支付标准。大众可以通过查看医保目录可以确定哪些药品可以被医保支付以及报销的比例和限额&#xff1b;医药从业者可通过查看医保目录可以即使了解医保政策的变化&#xff0c;便于做出相…

15种下载文件的方法文件下载方法汇总超大文件下载

15种下载文件的方法&文件下载方法汇总&超大文件下载 15种下载文件的方法Pentesters经常将文件上传到受感染的盒子以帮助进行权限提升&#xff0c;或者保持在计算机上的存在。本博客将介绍将文件从您的计算机移动到受感染系统的15种不同方法。对于那些在盒子上存在且需要…

基于jeecg-boot的flowable流程审批时增加下一个审批人设置

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 因为有时…

[ROS]虚拟机ubuntu18.04系统里面运行usb_cam

首先安装usb_cam sudo apt-get install ros-melodic-usb-cam 运行&#xff1a; roscore roslaunch usb_cam usb_cam-test.launch 如果一运行报错&#xff0c;首先确认是否存在/dev/video0 可以使用ls /dev/video*查看&#xff0c;如果没有就是没有连接摄像头&#xff0c;…