Unity给物体添加网格(Wire)绘制的方法参考

news2024/12/30 3:12:53

先看效果:       

再看代码:

using System.Collections.Generic;
using UnityEngine;

public class WireMesh : MonoBehaviour
{
	[SerializeField]
	Material material;

	void Start()
	{
		Mesh mesh = OptimizeMesh(GetComponent<MeshFilter>().mesh);

		GameObject objWire = new(gameObject.name + "_wire");
		objWire.layer = LayerMask.NameToLayer("Wire");

		Mesh meshWird = new() { vertices = mesh.vertices };
		int[] edges = GetEdges(mesh);

		meshWird.SetIndices(edges, MeshTopology.Lines, 0);
		//-------------------------------------------------------------------------------------------
		MeshFilter meshFilter = objWire.AddComponent<MeshFilter>();
		meshFilter.mesh = meshWird;
		MeshRenderer meshRenderer = objWire.AddComponent<MeshRenderer>();
		meshRenderer.material = material;
		objWire.transform.SetParent(transform);
		objWire.transform.localPosition = Vector3.zero;
		objWire.transform.localRotation = Quaternion.identity;
		objWire.transform.localScale = Vector3.one;

		int[] GetEdges(Mesh mesh)
		{
			var hashEdges = new HashSet<(int, int)>();

			var triangles = mesh.triangles;

			for (int i = 0; i < triangles.Length; i += 3)
			{
				AddEdge(triangles[i], triangles[i + 1]);
				AddEdge(triangles[i + 1], triangles[i + 2]);
				AddEdge(triangles[i + 2], triangles[i]);
			}

			List<int> listTriangle = new();
			foreach (var val in hashEdges)
			{
				listTriangle.Add(val.Item1);
				listTriangle.Add(val.Item2);
			}

			return listTriangle.ToArray();

			void AddEdge(int id1, int id2)
			{
				var edge = (Mathf.Min(id1, id2), Mathf.Max(id1, id2));
				hashEdges.Add(edge); // 只添加唯一组合
			}
		}
	}

	Mesh OptimizeMesh(Mesh originalMesh, bool recalculate = false)
	{
		Vector3[] originalVertices = originalMesh.vertices;
		int[] originalTriangles = originalMesh.triangles;

		Dictionary<Vector3, int> uniqueVertices = new Dictionary<Vector3, int>();
		List<Vector3> newVertices = new List<Vector3>();
		List<int> newTriangles = new List<int>();

		// Re-index vertices
		for (int i = 0; i < originalVertices.Length; i++)
		{
			Vector3 vertex = originalVertices[i];

			if (!uniqueVertices.ContainsKey(vertex))
			{
				uniqueVertices[vertex] = newVertices.Count;
				newVertices.Add(vertex);
			}
		}

		// Map old indices to new ones
		for (int i = 0; i < originalTriangles.Length; i++)
		{
			int oldIndex = originalTriangles[i];
			int newIndex = uniqueVertices[originalVertices[oldIndex]];
			newTriangles.Add(newIndex);
		}

		// Create new optimized mesh
		Mesh optimizedMesh = new()
		{
			vertices = newVertices.ToArray(),
			triangles = newTriangles.ToArray()
		};
		//
		if (recalculate)
		{
			optimizedMesh.RecalculateNormals();
			optimizedMesh.RecalculateBounds();
		} 

		return optimizedMesh;
	}
}

        这个代码给一个物体添加一个与原始物体重叠的网格渲染的物体。

        这里面涉及到了一些知识点和操作方法,逐条说一下。

        首先是网格内容优化。这里说的优化只是Mesh记录数据量的优化,并不是说能在渲染速度上的优化。为什么这么说呢?当我们把一个模型文件导入到unity中后,不管原来的网格数据是怎样的,unity总是会让顶点数组中的顶点(Vector3)复制出多个来,假设一个fbx格式的立方体有8个顶点,但Unity在使用时会显示Mesh包含24个顶点,不知道是否是出于提升渲染速度的考虑。但我们要尽可能优化这个点数,这样索引的最大值也会变小,也能让我们渲染的wire的边变少,否则同样的边会重复渲染多次。这里OptimizeMesh方法将Mesh中位置重叠的顶点去掉,同时也重置了面索引。在GetEdges方法中使用HashSet,这保证了不出现重叠的边。最后我们让Mesh使用了MeshTopology.Lines方式渲染,就得到了最终的结果。

        

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

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

相关文章

这 5 个自动化运维场景,可能用 Python 更香?

许多运维工程师会使用 Python 脚本来自动化运维任务。Python 是一种流行的编程语言&#xff0c;具有丰富的第三方库和强大的自动化能力&#xff0c;适用于许多不同的领域。 这里插播一条粉丝福利&#xff0c;如果你正在学习Python或者有计划学习Python&#xff0c;想要突破自我…

需求6:如何写一个后端接口?

这两天一直在对之前做的工作做梳理总结&#xff0c;不过前两天我都是在总结一些bug的问题。尽管有些bug问题我还没写文章&#xff0c;但是&#xff0c;我今天不得不先停下对bug的总结了。因为在国庆之后&#xff0c;我需要自己开发一个IT资产管理的功能&#xff0c;这个功能需要…

IDEA:Properties in parent definition are prohibited

问题背景 如果你在POM.xml中使用了自定义版本&#xff0c;那么IDEA就没办法很动态检测&#xff08;其实可以做到的&#xff0c;不是吗&#xff09;&#xff0c;就会有一个Properties in parent definition are prohibited 的错误信息&#xff08;禁止使用父级定义中的属性&…

2024 八九月份国内外CTF 散装re 部分wp

CTFZone silentDRM 附件拖入ida 最后部分很明显是比较。mmap和munmap函数的块大小为0x23280&#xff0c;比较大&#xff0c;暂时不管它。下断点动调&#xff0c;跳过v6和v7的分析部分&#xff0c;因为它是根据每五个字节的第一个字节生成的。直接看call v7 做运算后分为…

【博弈强化学习】——UAV-BS 的联合功率分配和 3D 部署:基于博弈论的深度强化学习方法

【论文】&#xff1a;Joint Power Allocation and 3D Deployment for UAV-BSs: A Game Theory Based Deep Reinforcement Learning Approach 【引用】&#xff1a;Fu S, Feng X, Sultana A, et al. Joint power allocation and 3D deployment for UAV-BSs: A game theory based…

基于Node.js+Express+MySQL+VUE科研成果网站发布查看科研信息科研成果论文下载免费安装部署

目录 1.技术选型‌ ‌2.功能设计‌ ‌3.系统架构‌ ‌4.开发流程‌ 5.开发背景 6.开发目标 7.技术可行性 8.功能可行性 8.1功能图 8.2 界面设计 8.3 部分代码 构建一个基于Spring Boot、Java Web、J2EE、MySQL数据库以及Vue前后端分离的科研成果网站&#xff0c;可…

PACS系统的延伸:三维重建后处理

影像中心PACS系统源代码&#xff0c;C#语言三发的PACS源码&#xff0c;三甲以下医院都能满足。 PACS系统即医学影像存档与通信系统&#xff0c;是医疗领域中不可或缺的信息技术系统。它主要负责医院内医学影像的数字化存储、管理、传输和显示&#xff0c;极大地促进了医疗影像信…

在线PDF怎么转换成JPG图片?分享14种转换操作!

作为一名社畜&#xff0c;俺也经常要将PDF转换为图片格式&#xff01; 如何进行快速转换&#xff0c;包括电脑端、在线端和手机端&#xff0c;今天俺就测评了50款工具&#xff0c;给你得出了下面这些渠道&#xff0c;不少也是免费的&#xff0c;相信对你有帮助哦&#xff01; …

springboot基于Vue的电影在线预定与管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

VS Code调整字体大小

##在工程目录底下.vscode/settings.json添加设置参数 {"editor.fontSize": 15,"window.zoomLevel": 1.5 }

Coursera_ Algorithms I 学习笔记:Module_3_Analysis_of_Algorithm_Introduction

Coursera_ Algorithms I 学习笔记&#xff1a;Module_3_Analysis_of_Algorithm_Introduction scientific method applied to analysis of algorithms data analysis log-log plot doubling hypothesis experimental alogrithmics System independent effectsSystem dependen…

【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

Clocking System

文章目录 1. 介绍2. 时钟源2.1 scillator Circuit (OSC)2.1.1 外部时钟输入模式2.1.2 外部晶体/陶瓷谐振器模式2.1.3 振荡器的配置2.1.4 Oscillator Watchdog 2.2 Back-up Clock 3. 锁相环&#xff08;PLL&#xff09;3.1 系统锁相环3.1.1 Features3.1.2 框图 3.2.外设锁相环3.…

JAVA云洋系统聚合快递打造一站式快递系统小程序源码

云洋系统聚合快递 —— 打造一站式快递管理新体验 &#x1f680; 一站式快递管理新时代 在快节奏的现代生活中&#xff0c;快递已经成为我们日常不可或缺的一部分。然而&#xff0c;面对众多快递公司和复杂的物流信息&#xff0c;如何高效管理快递成为了许多人的难题。幸运的是…

基于SpringBoot大学生就业管理系统设计与实现

1.1 研究背景 科学技术日新月异的如今&#xff0c;计算机在生活各个领域都占有重要的作用&#xff0c;尤其在信息管理方面&#xff0c;在这样的大背景下&#xff0c;学习计算机知识不仅仅是为了掌握一种技能&#xff0c;更重要的是能够让它真正地使用到实践中去&#xff0c;以…

从“抄袭”到“原创”:5个超实用的论文降重技巧!

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 每当写完一篇论文&#xff0c;松了一口气准备庆祝时&#xff0c;突然想到还有一个名叫“查重”的终极大Boss等着你&#xff0c;瞬间心情从云端跌入谷底。 是不是你&#xff1f; 很多同学在提交之前&#…

CDGA|利用人工智能与边缘计算显著提升数据治理效率与效果的实践案例

在当今数字化转型的浪潮中&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何高效、安全地治理这些数据成为企业面临的重要挑战。人工智能&#xff08;AI&#xff09;与边缘计算技术的融合&#xff0c;为数据治理带来了前所…

《程序猿之Redis缓存实战 · 哈希类型》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

《ToDesk 云电脑、易腾云、青椒云移动端体验实测:让手机秒变超级电脑》

前言 科技发展到如今2024年&#xff0c;可以说每一年都在发生翻天覆地的变化。云电脑这个市场近年来迅速发展&#xff0c;无需购买和维护额外的硬件就可以体验到电脑端顶配的性能和体验&#xff0c;并且移动端也可以带来非凡体验。我们在外出办公随身没有携带电脑情况下&#x…

聊一聊大模型六小虎生存现状!

ChatGPT横空出世&#xff0c;打响了生成式AI创业热潮的发令枪。 在国内&#xff0c;智谱AI、百川智能、零一万物、月之暗面、Minimax率先领跑。今年6月&#xff0c;前微软全球副总裁姜大昕创办的阶跃星辰&#xff0c;开始受到资本的青睐&#xff0c;一轮20亿美元的融资&#x…