Unity3D生成一段隧道网格的方法

本文实例为大家分享了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未计算,所以使用贴图时有问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D网格功能生成球体网格模型

    本文实例为大家分享了Unity3D网格功能生成球体网格模型的具体代码,供大家参考,具体内容如下 前面已经讲过怎样使用mesh生成一个自己的网格,那么本文将会讲述怎样将这个网格变换成自己想要的形状,比如一个球体. 我们需要知道一个从平面坐标到球体坐标的映射公式.假设平面坐标是(x,y),球体坐标是(x0,y0,z0),则 球体坐标(x0,y0,z0)可以通过以下代码得到,(x,y) 对应vertices[i].x和vertices[i].y. v.x = r * Mathf.Cos(vertice

  • Unity3D动态生成平面网格

    在编写几何着色器的时候发现默认的Plane无法满足需求,并且顶点顺序未知,于是便写了一个网格生成代码,便于生成指定大小的Plane,且顶点顺序可控. 效果如下: 一个单元格由4个顶点,两个三角面组成. 四个顶点如下图 则生成面的顶点顺序为: 左上三角形:0 -> 1 -> 2 右下三角形:2 -> 3 -> 0 Unity中顺时针绘制为正面,逆时针绘制为反面. 实现脚本如下: //PlaneBuilder.cs using System.Collections; using Sys

  • Unity3D实现NavMesh导航网格寻路

    NavMesh(导航网格)是3D游戏世界中用于动态物体实现自动寻路的技术. NavMesh系统是人工智能的一种,它使用一个添加在游戏对象上或者作为游戏对象父物体的名为"导航网格代理"(NavMeshAgent)的组件来控制该游戏对象寻找能够通过的路径,并最终到达目的地. 自动寻路还可以实现绕过障碍.爬上与跳下障碍物.按类别寻找属于自己的道路.动态设置道路中的障碍等技术. 下面用一个简单的Demo来介绍NavMesh的应用: 1.在Scene场景中添加Cube设置场景,如图所示: 2.选

  • Unity3D生成一段隧道网格的方法

    本文实例为大家分享了Unity3D生成一段隧道网格的具体代码,供大家参考,具体内容如下 一.需求 最近有一个需求,生成段隧道的骨架网格.目前想到的方法就是,获取隧道网格,通过一个算法分离内框和外框的点: 然后通过外框和内框上的点画线,可以通过深度优先搜索得到内外两个环的序列, 从而实现骨架网格 二.生成隧道算法 隧道由段圆弧和一条直线组成,所以算法如下: 1.取圆心为0,0,0,和圆上半径的向量 \underset{OB}{\rightarrow}  ,绕z轴,旋转向量\underset{OB}

  • python生成IP段的方法

    本文实例讲述了python生成IP段的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/local/bin/python #-*- coding: UTF-8 -*- ############################################################# # python 生成IP段 ############################################################# if __name__ == '__mai

  • Python随机生成信用卡卡号的实现方法

    本文实例讲述了Python随机生成信用卡卡号的实现方法.分享给大家供大家参考.具体分析如下: 这段Python代码根据信用卡卡号产生规则随机生成信用卡卡号,是可以通过验证的,仅供学习参考,请不要用于非法用途,否则后果自负. #!/usr/bin/python """ gencc: A simple program to generate credit card numbers that pass the MOD 10 check (Luhn formula). Usefull

  • C#生成互不相同随机数的实现方法

    本文实例讲述了C#生成互不相同随机数的实现方法,在进行C#应用程序设计时非常具有实用价值.本文详细讲述了其功能的实现过程.分享给大家供大家参考之用.具体方法如下: 一般来说,用C#生成足够随机的互不相同的随机数 Dotnet.Frameword中提供了一个专门产生随机数的类System.Random,计算机并不能产生完全随机的数字,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了. 在使用随机数时,要先初始化

  • php生成过去100年下拉列表的方法

    本文实例讲述了php生成过去100年下拉列表的方法.分享给大家供大家参考.具体如下: 项目中经常会用到年份选择,这段代码自动生成从今年开始的过去100年的下拉列表 <select name="year"> <?php $years = range(date("Y"), date("Y", strtotime("now - 100 years"))); foreach($years as $year){ ech

  • vue打包之后生成一个配置文件修改接口的方法

    前言: 我们的vue代码打包上传到服务器之后,要是数据接口 以后换了域名什么的,是不是需要重新去vue文件里修改接口. 能不能生成一个配置文件,里面可以配置域名或其它什么字段之类的,这样以后换了域名,只需打开记事本 修改一下域名即可. 教程: 第一步:安装generate-asset-webpack-plugin插件 npm install --save-dev generate-asset-webpack-plugin 第二步:配置webpack.prod.conf.js文件 //让打包的时候

  • Linux Shell 生成随机数和随机字符串的方法示例

    日常生活中,会经常用到随机数,使用场景非常广泛,例如买彩票.丢骰子.抽签.年会抽奖等. Shell 下如何生成随机数呢,米扑博客特意写了本文,总结 Linux Shell 产生随机数的多种方法. 计算机产生的的只是"伪随机数",不会产生绝对的随机数(是一种理想随机数).实际上,伪随机数和理想随机数也是相对的概念,例如伪随机数在1万万亿亿亿年内也无法重复,算是理想随机数么? 伪随机数在大量重现时也并不一定保持唯一,但一个好的伪随机产生算法将可以产生一个非常长的不重复的序列,例如 UUID

  • AngularJS实现给动态生成的元素绑定事件的方法

    本文实例讲述了AngularJS实现给动态生成的元素绑定事件的方法.分享给大家供大家参考,具体如下: 1 . 我们知道在jQuery中,动态生成一个元素,如果要在动态生成元素的同时,动态绑定事件,可以通过live/on方法(在jquery3.0中已经废除了bind方法). 2 . 在AngularJS中,操作DOM一般在指令中完成,事件监听机制是在对于已经静态生成的dom绑定事件,而如果在指令中动态生成了DOM节点,动态生成的节点不会被JS事件监听. 举例来说: angular.module('

  • Linux下nginx生成日志自动切割的实现方法

    Linux下nginx生成日志自动切割的实现方法 1.编辑切割日志的 shell 程序,目录自定 #vi /data/nginx/cut_nginx_log.sh 输入代码: #!/bin/bash # This script run at 00:00 function cutAccess() { dir=$1 newdir="${dir}/$(date -d "yesterday" +"%Y")/$(date -d "yesterday&quo

  • Angular JS 生成动态二维码的方法

    一.场景 二维码的场景,很多.这里是二维码一种小场景,比如分享一个链接,商品链接,项目链接,优惠券链接- 技术实现,如果用后端实现,需要构造输出一个图片流.或者后端生产二维码图片,给图片地址就好了.弊端,这个二维码就是一个链接,后端的文件 IO 操作,还得考虑存储.太费力. 如果前端实现,这样就很轻松了.这只是个分享二维码,分享出去给人家扫一扫.利用前端的 canvas,这里坐下调研. jq 封装的 qrcode.js ,文章网上一大堆. angular js :https://github.c

随机推荐