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

news2024/9/24 17:20:01

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;
#endif

public class codeMesh2 : MonoBehaviour
{
	GUIStyle fontStyle = new GUIStyle();
	string msg = " - - ";
	// Start is called before the first frame update
	Vector3 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_EDITOR
		showNormals();
#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 frame
	void 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>();
		//创建mesh
		mesh = 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;
		
		//创建顶点和UV
		vertices = new Vector3[6];
		Vector2[] uv = new Vector2[6];

		vertices[0] = new Vector3(0, 1, 0);//0
		vertices[1] = new Vector3(1, 1, 0);//1
		vertices[2] = new Vector3(1, 0, 0);//2
		vertices[3] = new Vector3(0, 0, 0);//3
		vertices[4] = new Vector3(0, 0, 1);//4
		vertices[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_EDITOR
	private 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.coloradmin.cn/o/958288.html

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

相关文章

Unity MonoBehaviour事件函数的生命周期

Unity运行时候的默认的几个函数的执行顺序&#xff1a; 首先是Awake&#xff0c;OnEnable&#xff0c;Start等&#xff0c;后面是FixUpdate Update 最后是OnDisable、OnDestroy

《CTFshow-Web入门》09. Web 81~90

Web 入门 索引web81题解 web82题解原理 web83题解 web84题解 web85题解 web86题解 web87题解原理 web88题解 web89题解 web90题解 ctf - web入门 索引 web81&#xff1a;include() 利用&#xff0c;一句话木马之 Nginx 日志利用。web82~86&#xff1a;include() 利用&#xff…

pyqt5的 Qprogressbar 如何设计得好看一些?

参考官网内容 style 自定义&#xff1a; https://doc.qt.io/qtforpython-5/overviews/stylesheet-examples.html#customizing-qprogressbar 1.圆角&#xff0c;浅蓝色 QProgressBar {border: 2px solid grey;border-radius: 5px; }QProgressBar::chunk {background-color: #0…

Halo2、Caulk+、Baloo、Cq Lookup argument细览

1. 引言 本文主要参考2023年2月以太坊基金会Mary Maller在第13届 BIU Winter School on Cryptography上的视频分享 A Close Look at a Lookup Argument - Mary Maller。 以证明 0 ≤ x < 4 0\leq x <4 0≤x<4为例&#xff0c;相比于使用算术化电路中如何使用定制gat…

免费s5爬虫ip:真正靠谱还是泡沫?

在网络世界中&#xff0c;许多人寻找免费的s5爬虫ip以实现匿名上网和绕过地域限制。然而&#xff0c;关于这些免费服务的可信度一直存在争议。本文将探讨免费s5爬虫ip背后的真相&#xff0c;并帮助您判断它们到底是值得依赖还是只不过虚幻泡沫。 1、充斥着风险 大部分提供免费…

不平衡的数据集将如何影响模型的性能?示例说明

一、说明 朋友们&#xff0c;您可能听说过&#xff0c;在不平衡数据集上训练的模型可能会受到泛化不佳和少数类检测减少的影响。在接下来的几篇文章中&#xff0c;我将给你一个例子来展示不平衡的数据集如何影响模型的性能&#xff0c;以及我们如何处理这个问题。在这篇文章中&…

【pdf密码】忘记了密码该如何编辑PDF文件?

PDF文件设置了密码&#xff0c;无法编辑PDF文件&#xff0c;如果忘记了PDF密码&#xff0c;无法取消限制编辑&#xff0c;那么这种情况&#xff0c;我们该如何解决&#xff1f;分享两个方法。 方法一&#xff1a; 将PDF文件转换为其他格式&#xff0c;这里&#xff0c;我们可…

Navicat:解决导入csv文件中文乱码的问题

文章目录 1 问题描述2 解决方案 1 问题描述 导入时编码格式默认选择UTF-8 后面发现源字段中文显示乱码 2 解决方案 用记事本txt格式打开csv文件&#xff0c;查看右下角编码格式是否为UTF-8 一般通过xls另存的csv&#xff0c;编码格式为ANSI&#xff0c;需要转换为UTF-8 转…

解决小程序中textarea ios端样式不兼容的方法

问题描述 &#xff0c;今天在调试小程序的时候有个需求需要textarea与标题对其&#xff0c;微信开发工具和安卓系统都没有问题 但是ios系统textarea存在内边距。出现不兼容的情况 解决方法&#xff1a;我们看官网的textarea的属性 textarea | uni-app官网 disable-default-p…

插座上亚马逊美国站UL1449测试报告标准

美规插座有UL498&#xff1b;UL1363&#xff1b;UL1449等标准。不同结构&#xff1b;不同形式使用的标准不同。UL498插座部分主要是对结构和常规性测试的要求&#xff1b;此类插座称为Receptacle&#xff1b;UL1363主要是对室内用的延长线插座的要求&#xff1b;此类插座常简写…

基于ssm+vue舞蹈网站的设计与实现

基于ssmvue舞蹈网站的设计与实现111 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技…

开发指导—利用CSS动画实现HarmonyOS动效(一)

注&#xff1a;本文内容分享转载自 HarmonyOS Developer 官网文档 一. CSS 语法参考 CSS 是描述 HML 页面结构的样式语言。所有组件均存在系统默认样式&#xff0c;也可在页面 CSS 样式文件中对组件、页面自定义不同的样式。请参考通用样式了解兼容 JS 的类 Web 开发范式支持的…

易基因:De novo组装和转录组表征:东方田鼠原发性卵巢癌机制新见解|项目文章

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2022年&#xff0c;中南大学湘雅医学院周智君教授团队在Mol Med Rep发表了题为" De novo assembly and transcriptome characterization: Novel insights into the mechanisms of p…

PDF转成翻页的电子图册?或许这样做你也可以

PDF转成翻页的电子图册是一种很有趣的方式&#xff0c;可以让读者像翻阅实体书一样浏览电子文档。这种形式的电子图册可以通过将PDF文件转换为HTML5格式来实现翻页效果。这样做的好处是可以增加用户的阅读体验&#xff0c;使阅读更加生动有趣。 如果你也想转换成翻页的电子图册…

首批!八家大模型企业面向全民开放

Datawhale干货 开放&#xff1a;国产大模型&#xff0c;编辑&#xff1a;司玉鑫 前 言 在科技领域&#xff0c;一项重要的消息引起了广泛关注&#xff1a; 8月31日凌晨&#xff0c;首批大模型产品终于获得了正式批准。这一消息不仅令行业内的巨头企业欢欣鼓舞&#xff0c;也使…

探索隧道ip如何助力爬虫应用

在数据驱动的世界中&#xff0c;网络爬虫已成为获取大量信息的重要工具。然而&#xff0c;爬虫在抓取数据时可能会遇到一些挑战&#xff0c;如IP封禁、访问限制等。隧道ip&#xff08;TunnelingProxy&#xff09;作为一种强大的解决方案&#xff0c;可以帮助爬虫应用更高效地获…

什么是malloxx勒索病毒,服务器中malloxx勒索病毒了怎么办?

Malloxx勒索病毒是一种新型的电脑病毒&#xff0c;它通过加密用户电脑中的重要文件数据来威胁用户&#xff0c;并以此勒索钱财。这种病毒并不是让用户的电脑瘫痪&#xff0c;而是以非常独特的方式进行攻击。在感染了Malloxx勒索病毒后&#xff0c;它会加密用户服务器中的数据&a…

使用(七牛云)为例子实现将文件上传到云服务器

目的 目前&#xff0c;用户的头像、分享生成的长图等文件都是存放在本地的&#xff0c;我们可以将他们存放在云服务器中&#xff0c;此处我们使用七牛云作为例子示范。 七牛云 创建账户并申请如下的两个bucket&#xff0c;分别是用户头像的存储空间和分享长图的存储空间。 …

浅谈电能计量管理系统在煤矿上的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;随着煤矿供电系统管、控一体化的发展需要&#xff0c;本文提出了一种基于矿井光纤网络构成的煤矿电参数计量系统&#xff0c;该系统具有实现变电所各类开关、动力设备的用电高精度计量&#xff1b;远程实时监…

Linux命令grep的使用方法大全

常用总结&#xff1a; 1.在当前路径下搜索&#xff1a; grep "whetherInCommon" ./* -n执行效果参考&#xff1a; 说明&#xff1a;这里我指定在当前路径下搜索关键字&#xff1a; “whetherInCommon” 并显示行号 -n&#xff08;–line-number&#xff09;&…