Unity使用TriangleNet参考

TriangleNet下载如下:

TriangleNet

效果如下:

代码参考如下:

using System.Collections.Generic;
using UnityEngine;
using TriangleNet.Geometry;

public class TestTriangleNet : MonoBehaviour
{
	[SerializeField]
	Material material;
	void Start()
	{
		Vector3[] vs = new Vector3[625];
		for (int i = 0; i < vs.Length; i++)
		{
			vs[i] = new Vector3(i % 25, 0, i / 25);
		}

		Polygon poly = new();
		foreach (var v in vs)
		{
			poly.Add(new Vertex(v.x, v.z));
		}

		//设置外轮廓
		Vertex[] vertexOut = new Vertex[] { new(1, 10), new(3, 16), new(10, 19), new(16, 16), new(19, 10), new(16, 3), new(10, 1), new(3, 8) };
		poly.Add(new Contour(vertexOut), false);
		//设置洞洞1
		Vertex[] vertexIn01 = new Vertex[] { new(2, 10), new(4, 12), new(6, 10), new(4, 8) };
		poly.Add(new Contour(vertexIn01), true);
		//设置洞洞2
		Vertex[] vertexIn02 = new Vertex[] { new(12, 6), new(14, 8), new(16, 6), new(14, 4) };
		poly.Add(new Contour(vertexIn02), true);


		var options = new TriangleNet.Meshing.ConstraintOptions
		{
			SegmentSplitting = 1,
			ConformingDelaunay = false,
			Convex = false
		};
		//生成Triangle网格
		var triangleMesh = ExtensionMethods.Triangulate(poly, options);

		List<Vector3> listVert = new();
		foreach (Vertex v in triangleMesh.Vertices)
		{
			listVert.Add(new Vector3(v.X, 0, v.Y));
		}

		List<int> listTriangle = new();
		foreach (var tm in triangleMesh.Triangles)
		{
			listTriangle.Add(tm.GetVertexID(1));
			listTriangle.Add(tm.GetVertexID(0));
			listTriangle.Add(tm.GetVertexID(2));
		}

		Mesh mesh = new()
		{
			vertices = listVert.ToArray(),
			triangles = listTriangle.ToArray()
		};

		mesh.RecalculateNormals();

		MeshFilter filter = GetComponent<MeshFilter>();
		if (!filter) filter = gameObject.AddComponent<MeshFilter>();
		filter.sharedMesh = mesh;
		MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
		if(!meshRenderer)meshRenderer = gameObject.AddComponent<MeshRenderer>();
		meshRenderer.material = material;
	}
}

如果不想中间挖洞,使用下面的代码即可:

​
using System.Collections.Generic;
using UnityEngine;
using TriangleNet.Geometry;
using static UnityEditor.Progress;

public class TestTriangleNet : MonoBehaviour
{
	[SerializeField]
	Material material;
	void Start()
	{
		Vector3[] vs = new Vector3[625];
		for (int i = 0; i < vs.Length; i++)
		{
			vs[i] = new Vector3(i % 25, 0, i / 25);
		}

		Polygon poly = new();
		foreach (var v in vs)
		{
			poly.Add(new Vertex(v.x, v.z));
		}

		var triangleMesh = poly.Triangulate();

		List<Vector3> listVert = new();
		foreach (Vertex v in triangleMesh.Vertices)
		{
			listVert.Add(new Vector3(v.X, 0, v.Y));
		}

		List<int> listTriangle = new();
		foreach (var tm in triangleMesh.Triangles)
		{
			listTriangle.Add(tm.GetVertexID(1));
			listTriangle.Add(tm.GetVertexID(0));
			listTriangle.Add(tm.GetVertexID(2));
		}

		Mesh mesh = new()
		{
			vertices = listVert.ToArray(),
			triangles = listTriangle.ToArray()
		};

		mesh.RecalculateNormals();

		MeshFilter filter = GetComponent<MeshFilter>();
		if (!filter) filter = gameObject.AddComponent<MeshFilter>();
		filter.sharedMesh = mesh;
		MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
		if(!meshRenderer)meshRenderer = gameObject.AddComponent<MeshRenderer>();
		meshRenderer.material = material;
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

耳夹式耳机哪个品牌音质好?五大优质音质的耳夹式耳机!

随着健康理念的传播&#xff0c;运动健身成为大众追求高品质生活的重要部分。传统耳机在运动场景下有局限性&#xff0c;稳定性差、清洁不便&#xff0c;影响运动体验。这时&#xff0c;耳夹式耳机出现&#xff0c;以独特设计和传音方式重塑运动音乐享受&#xff0c;无需入耳&a…

游戏推荐业务中基于 sentinel 的动态限流实践

作者&#xff1a;来自 vivo 互联网服务器团队- Gao Meng 本文介绍了一种基于 sentinel 进行二次开发的动态限流解决方案&#xff0c;包括什么是动态限流、为什么需要引入动态限流、以及动态限流的实现原理。 一、背景 1.1 当前的限流方案 随着互联网的发展及业务的增长&…

Flythings学习(四)串口通信

文章目录 1 串口编程基本步骤1.1 打开串口1.2 配置串口 1.3 读串口1.4 发送串口1.5 关闭串口 2 综合使用3 如何在软件上保证串口稳定通信4 flythings中的串口通讯5 协议接收部分使用和修改方法6 通讯协议数据怎么和UI控件对接 1 串口编程基本步骤 串口通信有5个步骤 1.打开串口…

Telegram——Bot 机器人/小程序入门指南

一、Bot 介绍 在 TG 中,机器人可以用于接收和发送消息、管理群组(在有权限的情况下可以封禁用户、删除消息、置顶消息等)、通过API进行编程操作、使用 Inline 查询功能在不同的聊天室中提供查询服务、创建自定义键盘按钮、发出账单并收款、接入小程序游戏等。 然而,Bot 默…

单片机中断概念以及示例

中断允许控制寄存器 CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。 EX0(IE.0)&#xff0c;外部中断0允许位&#xff1b;EX01&#xff0c;打开外部中断0中断&#xff1b;EX00关闭外部中断0中断。 ET0(IE.1)&#xff0c;定时/计数器T0中断允许…

沪尚茗居装修秘籍:嵌入式蒸烤箱,让厨房生活更精彩

在装修厨房时&#xff0c;选择一款合适的嵌入式蒸烤箱不仅能提升烹饪效率&#xff0c;还能为厨房增添一份现代感。沪尚茗居深知用户对厨房电器的需求&#xff0c;从实际出发&#xff0c;为用户推荐选购嵌入式蒸烤箱的实用技巧&#xff0c;让厨房生活更加美好。    首先&…

Real-World Image Variation by Aligning Diffusion Inversion Chain

https://proceedings.neurips.cc/paper_files/paper/2023/file/61960fdfda4d4e95fa1c1f6e64bfe8bc-Paper-Conference.pdfhttps://rival-diff.github.io/ 问题引入 针对的是image varation generation这个任务&#xff0c;tuning free的&#xff1b; methods C C C表示condit…

【closerAI ComfyUI】电商模特一键换装解决方案来了!细节到位无瑕疵!再加上flux模型加持,这个工作流不服不行!

不得了了兄弟们。这应该是电商界的福音&#xff0c;电商模特一键换装解决方案来了&#xff01;细节到位无瑕疵&#xff01;再加上flux模型加持&#xff0c;这个工作流不服不行&#xff01; 这期我们主要讨论如何使用stable diffusion comfyUI 制作完美无瑕疵的换装工作流。** …

《Linux从小白到高手》综合应用篇:详解Linux系统调优之服务器硬件优化

List item 本篇介绍Linux服务器硬件调优。硬件调优主要包括CPU、内存、磁盘、网络等关键硬件组。 1. CPU优化 选择适合的CPU&#xff1a; –根据应用需求选择多核、高频的CPU&#xff0c;以满足高并发和计算密集型任务的需求。CPU缓存优化&#xff1a; –确保CPU缓存&#x…

C++和OpenGL实现3D游戏编程【连载15】——着色器初步

&#x1f525;C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 上一节我们介绍了通过VBO、VAO和EBO怎样将顶点发送到GPU显存&#xff0c;利用GPU与显存之间的高效处理速度&#xff0c;来提高我们的图形渲染效率。那么在此过程中&#xff0c;我们又可以通过着色器&#xff…

【C++网络编程】(二)Linux平台下UDP客户/服务端程序

Linux平台下UDP客户/服务端程序 图片来源&#xff1a;https://subingwen.cn/linux/udp/ UDP服务器无法直接检测客户端断开连接。 UDP 服务端 server.cpp #include <iostream> #include <cstdlib> // std::exit #include <cstring> // memset #i…

【数据结构与算法】单链表探秘:解锁数据结构中的灵动链条

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 一.单链表初探&#xff1a;构建数据结构的基石 1.1 单链表的概念及结构 1.2 节点的理解 1.3 链表的性质 二.单链表的作用&#xff1a;为何它是数据处理的优选 2.1 动态内存管理&#xff1a;内存世界的魔术师 2.2 高效的…

篇章九 【NPM】包管理工具

文章目录 一、认识NPM二、npm 镜像的设置与查看三、安装 NPM 工具1. 下载Node.js安装包2. 打开下载好的安装程序&#xff0c;点击下一步3. 选择接受许可协议&#xff0c;点击下一步4. 选择自己的安装路径&#xff08;默认是c盘&#xff09;&#xff0c;选择完成后&#xff0c;点…

喜讯AAA级!国信华源荣获全国水利建设信息化3A级信用

近日&#xff0c;中国水利工程协会发布了《2024年度水利建设市场主体&#xff08;供货、信息化单位&#xff09;信用评价结果公示》&#xff0c;国信华源荣获2024年度全国水利建设信息化单位AAA级信用评价。这一荣誉不仅是对国信华源在水利建设领域信息化能力和诚信经营的肯定&…

中波长线天线耦合的一个方法

围绕窗外墙外牵了10米的室外天线。 短波&#xff0c;fm都是很简单&#xff0c;一个夹子直接夹在拉杆天线上面&#xff0c;效果已经很好。 今天偶尔听到中波前面大约510khz的地方有个摩尔斯码。是成都附近机场的NDB。这个平时要在楼顶或者很空旷的地方才能收到。音量比较小&am…

vue2项目 实现上边两个下拉框,下边一个输入框 输入框内显示的值为[“第一个下拉框选中值“ -- “第二个下拉框选中的值“]

效果: 思路: 采用vue中 [computed:] 派生属性的方式实现联动效果,上边两个切换时,下边的跟随变动 demo代码: <template><div><!-- 第一个下拉框 --><select v-model"firstValue"><option v-for"option in options" :key&q…

神经网络中使用的激活函数有什么用?

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; &#x1f50d;【大厂面试真题】系列&#xff0c;带你攻克大厂面试真题&#xff0c;秒变offer收割机&#xff01; ❓今日问题&am…

python项目实战——下载美女图片

python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…

Git推送被拒

今天开发完成一个新的需求&#xff0c;将自己的分支合并到test分支后&#xff0c;推送到远程仓库&#xff0c;结果显示推送被拒&#xff1a; 原因是因为有人更新了test分支的代码&#xff0c;我在合并之前没有拉取最新的test分支代码&#xff0c;所以他提示我“推送前需要合并…

Steinberg VST Live Pro v2.1.1 演出音频灯光控制软件

现场演出音频视频灯光控制软件 Steinberg VST Live Pro 将让现场表演更轻松。这是一款独特、稳定的软件解决方案&#xff0c;专为想要进行精彩表演的音乐家而设计&#xff0c;无论身在何处都能使用声音、灯光和视频等相关功能。VST Live附带大量虚拟乐器&#xff0c;音乐同步功…