Unity3D生成一段隧道网格的方法
更新时间:2020年8月18日 08:07 点击:2096
本文实例为大家分享了Unity3D生成一段隧道网格的具体代码,供大家参考,具体内容如下
一、需求
最近有一个需求,生成段隧道的骨架网格。目前想到的方法就是,获取隧道网格,通过一个算法分离内框和外框的点:
然后通过外框和内框上的点画线,可以通过深度优先搜索得到内外两个环的序列, 从而实现骨架网格
二、生成隧道算法
隧道由段圆弧和一条直线组成,所以算法如下:
1、取圆心为0,0,0,和圆上半径的向量 \underset{OB}{\rightarrow} ,绕z轴,旋转向量\underset{OB}{\rightarrow},取到圆上的点,外框上的点同理可得
2、平移内外框上的点,z轴加上偏离,得到隧道另一端的点
3、取相邻外框上的点和平移后的四个点,生成两个三角形。内框同理可得。
三、效果如下:
四、实现:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MeshCreater : MonoBehaviour { Mesh mesh; public Material mat;//mesh材质 public GameObject game; // Start is called before the first frame update void Start() { mesh = new Mesh(); mesh.Clear(); SetVertivesUV(); SetTriangles(); mesh.vertices = vertices.ToArray(); mesh.triangles = triangles; GameObject obj_cell = new GameObject(); obj_cell.name = "cell"; mesh.RecalculateNormals();//重置法线 mesh.RecalculateBounds(); //重置范围 obj_cell.AddComponent<MeshFilter>().mesh = mesh; obj_cell.AddComponent<MeshRenderer>(); obj_cell.GetComponent<MeshRenderer>().material = mat; MeshCaluate mesh_caluate = new MeshCaluate(); mesh_caluate.CalculateMesh(mesh); } // Update is called once per frame void Update() { } public List<Vector3> vertices = new List<Vector3>(); private float angle = 10; private float max_angle = 120; // 设置顶点信息 void SetVertivesUV() { Vector3 dir1 = new Vector3(Mathf.Sqrt(3f), -1, 0); Vector3 dir2 = dir1 * 0.8f; List<Vector3> points1 = new List<Vector3>(); List<Vector3> points2 = new List<Vector3>(); int count = (int)((360 - max_angle) / angle); for (int i = 0; i < count; i++) { Quaternion q= Quaternion.AngleAxis(i * angle, Vector3.forward); Vector3 point1 = q* dir1; Vector3 point2 = q* dir2; points1.Add(point1); points2.Add(point2); } points1.Add(points1[0]); points2.Add(points2[0]); for (int i = 0; i < points1.Count; i++) { var v1 = points1[i]; var v2 = points2[i]; var v3 = points1[i]; v3.z = 10; var v4 = points2[i]; v4.z = 10; vertices.Add(v1); vertices.Add(v3); vertices.Add(v2); vertices.Add(v4); } } private int[] triangles;//索引 // 设置索引 void SetTriangles() { triangles = new int[vertices.Count * 3]; int c = 0; for (int i = 0; i < triangles.Length -12 ; i += 12) { var v1 = c; var v2 = c + 1; var v3 = c + 4; var v4 = c + 5; var v5 = c + 2; var v6 = c + 3; var v7 = c + 6; var v8 = c + 7; triangles[i] = v4; triangles[i + 1] = v2; triangles[i + 2] = v1; triangles[i + 3] = v3; triangles[i + 4] = v4; triangles[i + 5] = v1; triangles[i + 6] = v5; triangles[i + 7] = v6; triangles[i + 8] = v8; triangles[i + 9] = v5; triangles[i + 10] = v8; triangles[i + 11] = v7; c += 4; } } }
五、缺陷
UV未计算,所以使用贴图时有问题
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
上一篇: c# 引用对象赋值时 为什么需要深度克隆
下一篇: 浅析c# 线程同步
相关文章
- 这篇文章主要为大家详细介绍了Unity3D UGUI实现翻书特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D使用GL实现图案解锁功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D实现飞机大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
Unity3D游戏开发数据持久化PlayerPrefs的用法详解
在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25- 这篇文章主要介绍了Unity3D基于OnGUI实时显示FPS,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D仿写Button面板事件绑定功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了unity3D实现三维物体跟随鼠标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- bootstrap框架中的网格系统就是将容器平分成12份,在使用的时候可以根据实际情况重新编译LESSSASS源码来修改12这个数值。接下来通过本文给大家介绍Bootstrap网格系统,感兴趣的朋友一起学习...2016-04-27
- 这个是在网上看到的,经测试可以在电脑上运行,确实调用了本地摄像头。有需要的小伙伴可以参考下。...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D Shader实现镜子效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D实现待机状态图片循环淡入淡出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D Shader实现动态屏幕遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D使用UGUI开发原生虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D UGUI特效之Image高斯模糊效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D实现物体闪烁效果,类似霓虹灯、跑马灯、LED灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D利用DoTween实现卡牌翻转效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D实现分页系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D实现鼠标控制视角转动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
xmlplus组件设计系列之网格(DataGrid)(10)
xmlplus 是一个JavaScript框架,用于快速开发前后端项目。这篇文章主要介绍了xmlplus组件设计系列之xmlplus网格,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-05-09- 这篇文章主要为大家详细介绍了Unity3D生成一段隧道网格的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-18