Unity程序化生成地形
制作地形:
- 绘制方块
- 逐个绘制方块并加噪波高度
- 删除Gizmos和逐个绘制
1.draw quad
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(MeshFilter))]
public class mesh_generator : MonoBehaviour
{Mesh mesh;Vector3[] vertices;int[] triangles;// Start is called before the first frame updatevoid Start(){mesh = new Mesh();GetComponent<MeshFilter>().mesh = mesh;CreateShape();UpdateMesh();}// Update is called once per framevoid CreateShape(){vertices = new Vector3[]{new Vector3 (0,0,0),new Vector3 (0,0,1),new Vector3 (1,0,0),new Vector3 (1,0,1)};triangles = new int[]{0,1,2,1,3,2//1,2,3 will have back face culling problem.};}void UpdateMesh(){mesh.Clear();mesh.vertices = vertices;mesh.triangles = triangles;mesh.RecalculateNormals();}
}
2.逐块生成地形
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(MeshFilter))]
public class mesh_generator : MonoBehaviour
{Mesh mesh;Vector3[] vertices;int[] triangles;public int xSize = 20;public int zSize = 20;//vertex count = (xSize+1)*(zSize+1)// Start is called before the first frame updatevoid Start(){mesh = new Mesh();GetComponent<MeshFilter>().mesh = mesh;StartCoroutine(CreateShape());}private void Update(){UpdateMesh();}// Update is called once per frame//void CreateShape()IEnumerator CreateShape(){vertices = new Vector3[(xSize + 1) * (zSize + 1)];for (int i = 0,z =0; z <= zSize; z++){for(int x = 0; x <= xSize; x++){float y = Mathf.PerlinNoise(x*.4f, z * .4f) * 2f;//*.3f for scalevertices[i] = new Vector3(x, y, z);i++;}}triangles = new int[xSize*zSize*6];int vert = 0;int index =0;for (int z = 0; z < zSize; z++){for (int x = 0; x < xSize; x++){triangles[index + 0] = vert + 0;triangles[index + 1] = vert + xSize + 1;triangles[index + 2] = vert + 1;triangles[index + 3] = vert + 1;triangles[index + 4] = vert + xSize + 1;triangles[index + 5] = vert + xSize + 2;vert++;index += 6;yield return new WaitForSeconds(.01f);}vert++;//3*3, 行结束后 vert++,vert = 4, index = 18}}void UpdateMesh(){mesh.Clear();mesh.vertices = vertices;mesh.triangles = triangles;mesh.RecalculateNormals();}private void OnDrawGizmos(){if (vertices == null)return;for (int i = 0; i < vertices.Length; i++){Gizmos.DrawSphere(vertices[i], .1f);}}
}
3.最终效果
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(MeshFilter))]
public class mesh_generator : MonoBehaviour
{Mesh mesh;Vector3[] vertices;int[] triangles;public int xSize = 20;public int zSize = 20;//vertex count = (xSize+1)*(zSize+1)// Start is called before the first frame updatevoid Start(){mesh = new Mesh();GetComponent<MeshFilter>().mesh = mesh;//StartCoroutine(CreateShape());CreateShape();UpdateMesh();}//private void Update()//{// UpdateMesh();//}// Update is called once per framevoid CreateShape()//IEnumerator CreateShape(){vertices = new Vector3[(xSize + 1) * (zSize + 1)];for (int i = 0,z =0; z <= zSize; z++){for(int x = 0; x <= xSize; x++){float y = Mathf.PerlinNoise(x*.4f, z * .4f) * 2f;//*.3f for scalevertices[i] = new Vector3(x, y, z);i++;}}triangles = new int[xSize*zSize*6];int vert = 0;int index =0;for (int z = 0; z < zSize; z++){for (int x = 0; x < xSize; x++){triangles[index + 0] = vert + 0;triangles[index + 1] = vert + xSize + 1;triangles[index + 2] = vert + 1;triangles[index + 3] = vert + 1;triangles[index + 4] = vert + xSize + 1;triangles[index + 5] = vert + xSize + 2;vert++;index += 6;//yield return new WaitForSeconds(.01f);//yield return 只能在协程(即 IEnumerator 类型的函数)中使用}vert++;//3*3, 行结束后 vert++,vert = 4, index = 18}}void UpdateMesh(){mesh.Clear();mesh.vertices = vertices;mesh.triangles = triangles;mesh.RecalculateNormals();}generate Gizmos//private void OnDrawGizmos()//{// if (vertices == null)// return;// for (int i = 0; i < vertices.Length; i++)// {// Gizmos.DrawSphere(vertices[i], .1f);// }//}
}
附:叠加perlin noise
float y =amplitude1 * Mathf.PerlinNoise(x * frequency1,z * frequency1)+ amplitude2 * Mathf.PerlinNoise(x * frequency2, z * frequency2)+ amplitude3 * Mathf.PerlinNoise(x * frequency3, z * frequency3)* noiseStrength;
程序化生成颜色
0.用贴图
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(MeshFilter))]
public class mesh_generator : MonoBehaviour
{Mesh mesh;Vector3[] vertices;int[] triangles;Vector2[]uvs;public int xSize = 20;public int zSize = 20;//vertex count = (xSize+1)*(zSize+1)// Start is called before the first frame updatevoid Start(){mesh = new Mesh();GetComponent<MeshFilter>().mesh = mesh;//StartCoroutine(CreateShape());CreateShape();UpdateMesh();}//private void Update()//{// UpdateMesh();//}// Update is called once per framevoid CreateShape()//IEnumerator CreateShape(){vertices = new Vector3[(xSize + 1) * (zSize + 1)];for (int i = 0,z =0; z <= zSize; z++){for(int x = 0; x <= xSize; x++){float y = Mathf.PerlinNoise(x*.4f, z * .4f) * 2f;//*.3f for scalevertices[i] = new Vector3(x, y, z);i++;}}triangles = new int[xSize*zSize*6];int vert = 0;int index =0;for (int z = 0; z < zSize; z++){for (int x = 0; x < xSize; x++){triangles[index + 0] = vert + 0;triangles[index + 1] = vert + xSize + 1;triangles[index + 2] = vert + 1;triangles[index + 3] = vert + 1;triangles[index + 4] = vert + xSize + 1;triangles[index + 5] = vert + xSize + 2;vert++;index += 6;//yield return new WaitForSeconds(.01f);//yield return 只能在协程(即 IEnumerator 类型的函数)中使用}vert++;//3*3, 行结束后 vert++,vert = 4, index = 18}uvs = new Vector2[vertices.Length];for (int i = 0, z = 0; z <= zSize; z++){for (int x = 0; x <= xSize; x++){uvs[i]=new Vector2((float)x/xSize,(float)z/zSize);i++;}}}void UpdateMesh(){mesh.Clear();mesh.vertices = vertices;mesh.triangles = triangles;mesh.uv = uvs;mesh.RecalculateNormals();}generate Gizmos//private void OnDrawGizmos()//{// if (vertices == null)// return;// for (int i = 0; i < vertices.Length; i++)// {// Gizmos.DrawSphere(vertices[i], .1f);// }//}
}
1.根据高度给颜色 并用Shader Graph获取vertex color

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(MeshFilter))]
public class mesh_generator : MonoBehaviour
{Mesh mesh;Vector3[] vertices;int[] triangles;//Vector2[]uvs;Color[] colors;public int xSize = 20;public int zSize = 20;public Gradient gradient;float minTerrainHeight;float maxTerrainHeight;//normalize height//vertex count = (xSize+1)*(zSize+1)// Start is called before the first frame updatevoid Start(){mesh = new Mesh();GetComponent<MeshFilter>().mesh = mesh;//StartCoroutine(CreateShape());CreateShape();UpdateMesh();}//private void Update()//{// UpdateMesh();//}// Update is called once per framevoid CreateShape()//IEnumerator CreateShape(){vertices = new Vector3[(xSize + 1) * (zSize + 1)];for (int i = 0,z =0; z <= zSize; z++){for(int x = 0; x <= xSize; x++){float y = Mathf.PerlinNoise(x*.4f, z * .4f) * 2f;//*.3f for scalevertices[i] = new Vector3(x, y, z);if(y>maxTerrainHeight)maxTerrainHeight = y;if(y<minTerrainHeight)minTerrainHeight = y;i++;}}triangles = new int[xSize*zSize*6];int vert = 0;int index =0;for (int z = 0; z < zSize; z++){for (int x = 0; x < xSize; x++){triangles[index + 0] = vert + 0;triangles[index + 1] = vert + xSize + 1;triangles[index + 2] = vert + 1;triangles[index + 3] = vert + 1;triangles[index + 4] = vert + xSize + 1;triangles[index + 5] = vert + xSize + 2;vert++;index += 6;//yield return new WaitForSeconds(.01f);//yield return 只能在协程(即 IEnumerator 类型的函数)中使用}vert++;//3*3, 行结束后 vert++,vert = 4, index = 18}//uvs = new Vector2[vertices.Length];colors = new Color[vertices.Length];for (int i = 0, z = 0; z <= zSize; z++){for (int x = 0; x <= xSize; x++){//uvs[i]=new Vector2((float)x/xSize,(float)z/zSize);float height = Mathf.InverseLerp(minTerrainHeight, maxTerrainHeight, vertices[i].y);colors[i] = gradient.Evaluate(height);i++;}}}void UpdateMesh(){mesh.Clear();mesh.vertices = vertices;mesh.triangles = triangles;mesh.colors = colors;mesh.RecalculateNormals();}generate Gizmos//private void OnDrawGizmos()//{// if (vertices == null)// return;// for (int i = 0; i < vertices.Length; i++)// {// Gizmos.DrawSphere(vertices[i], .1f);// }//}
}
相关文章:
Unity程序化生成地形
制作地形: 绘制方块逐个绘制方块并加噪波高度删除Gizmos和逐个绘制 1.draw quad using System.Collections; using System.Collections.Generic; using UnityEngine;[RequireComponent(typeof(MeshFilter))] public class mesh_generator : MonoBehaviour {Mesh m…...
Vxe UI vue vxe-table 表格中使用下拉表格,单元格渲染下拉表格
Vxe UI vue vxe-table 表格中使用下拉表格,单元格渲染下拉表格 单元格中渲染下拉表格,需要使用到 vxe-table-select 这个组件,在 vxe-table 4.7 中使用非常简单,只需要配置好渲染器数据源就可以。 支持单选 也可以多选 代码 …...
Android开发教程实加载中...动效
Android开发教程实加载中…动效 加载中,发送中,匹配中都可以用,就是后面是三个点还是两个点,不断在切换 一、思路: 隔500ms发送一次,改变内容 二、效果图: 看视频更加直观点: An…...
NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案
一、方案背景 智慧小区构成了“平安城市”建设的基石。随着社会的进步,社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前,许多小区的物业管理和安全防护系统仍然较为简单和陈旧&a…...
适配器模式适用的场景
适配器模式是一种常用的设计模式,能够将不兼容的接口转换为客户端所需的接口。在实际开发中,我们常常会遇到需要统一接口、替换外部系统、兼容旧接口或适配不同数据格式的情况。本文将结合详细的代码示例,介绍适配器模式的适用场景。 1. 统一…...
Ambari里面添加hive组件
1.创建hive数据库 在添加hive组件之前需要做的事情,先在master这个虚拟机里面创建好hive 先进入虚拟机里面进入mysql 然后输入这个命令看看有没有自己创建的hive数据库 show databases;有的话会显示下面这个样子 没有的同学使用以下命令可以在MySQL中创建hive数…...
Windows部署rabbitmq
本次安装环境: 系统:Windows 11 软件建议版本: erlang OPT 26.0.2rabbitmq 3.12.4 一、下载 1.1 下载erlang 官网下载地址: 1.2 下载rabbitmq 官网下载地址: 建议使用解压版,安装版可能会在安装软件…...
【Flask】四、flask连接并操作数据库
目录 前言 一、 安装必要的库 二、配置数据库连接 三、定义模型 四、操作数据库 1.添加用户 2.删除用户 3.更新用户信息 4查询所有用户 五、测试结果 前言 在Flask框架中,数据库的操作是一个核心功能,它允许开发者与后端数据库进行交互…...
ES跟Kafka集成
配合流程 1. Kafka作为分布式流处理平台,能够实时收集和处理不同数据源的数据流; 2. 通过Kafka Connect或者Logstash等中间件,可以将Kafka中的数据流实时推送到Elasticsearch中; 3. Elasticsearch接收到数据后,会根据…...
Python Matplotlib:基本图表绘制指南
Python Matplotlib:基本图表绘制指南 Matplotlib 是 Python 中一个非常流行的绘图库,它以简单易用和功能丰富而闻名,适合各种场景的数据可视化需求。在数据分析和数据科学领域,Matplotlib 是我们展示数据的有力工具。本文将详细讲…...
供应商图纸外发:如何做到既安全又高效?
供应商跟合作伙伴、客户之间会涉及到图纸外发的场景,这是一个涉及数据安全、效率及合规性的重要环节。供应商图纸发送流程一般如下: 1.申请与审批 采购人员根据需要提出发放图纸的申请并提交审批; 采购部负责人审批发放申请,确…...
探索 Move 编程语言:智能合约开发的新纪元
目录 引言 一、变量的定义 二、整型 如何在Move中表示小数和负数? 三、运算符 as运算符 布尔型 地址类型 四、什么是包? 五、什么是模块? 六、如何定义方法? 方法访问权限控制 init方法 总结 引言 Move 是一种专为区…...
vue3+vant实现视频播放(含首次禁止进度条拖拽,视频看完后恢复,保存播放视频进度,刷新及下次进入继续播放,判断视频有无全部看完等)
1、效果图 2、 <div><videocontrolsclass"video_player"ref"videoPlayer":src"videoSrc"timeupdate"handleTimeUpdate"play"onPlay"pause"onPause"ended"onVideoEnded"></video><…...
情感强度分析:精确衡量文本情感强弱的 AI 技术
情感强度分析:精确衡量文本情感强弱的 AI 技术 一、引言 在当今信息爆炸的时代,我们每天都会接触到大量的文本信息。这些文本中蕴含着各种各样的情感,如喜悦、悲伤、愤怒、恐惧等。如何准确地理解和分析这些文本的情感强度,对于…...
工厂方法模式与抽象工厂模式
工厂方法模式 (Factory Method) 定义: 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法将类的实例化推迟到子类。 优点: 解耦:客户端代码与具体的产品类解耦…...
「Math」初等数学知识点大纲(占位待处理)
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...
百元高性价比头戴式降噪耳机选哪款?四款平价性价比品牌别错过!
随着科技的发展,现在的头戴式耳机真的是越来越多样了,很多的朋友在选购耳机的时候,不知道哪一款头戴式耳机的性价比较高,究竟百元高性价比头戴式降噪耳机选哪款?身为一名数码爱好者,这里就给大家推带来四款…...
vue3 setup写不写到标签上的区别
在vue3种setup的写法,可以单独写setup()也可以写到script标签中,当然我们推荐后面这种 他的好处有很多,代码也简洁很多。1、属性和方法无需return,可直接使用 /*原先*/ <script> import { defineComponent } from "v…...
【论文解读】EdgeYOLO:一种边缘实时目标检测器(附论文地址)
论文地址:https://arxiv.org/pdf/2302.07483 这篇文章的标题是《EdgeYOLO: An Edge-Real-Time Object Detector》,由中国北京理工大学的Shihan Liu、Junlin Zha、Jian Sun、Zhuo Li和Gang Wang共同撰写。这篇论文提出了一个基于最新YOLO框架的高效、低复…...
xlwings,让excel飞起来!
excel已经成为必不可少的数据处理软件,几乎天天在用。python有很多支持操作excel的第三方库,xlwings是其中一个。 关于xlwings xlwings开源免费,能够非常方便的读写Excel文件中的数据,并且能够进行单元格格式的修改。 xlwings还…...
新手入门:借助快马AI实现你的第一个超能力选择网页
作为一个刚接触编程的新手,我最近想尝试做一个有趣的网页项目。看到网上那些酷炫的交互效果,总觉得很神奇但又无从下手。直到发现了InsCode(快马)平台,它让我这个小白也能轻松实现"超能力选择器"这样的创意想法。 项目构思 我想做一…...
免费窗口调整工具:3分钟学会强制修改任意窗口大小
免费窗口调整工具:3分钟学会强制修改任意窗口大小 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽、尺寸固定的应用程序窗口而烦恼吗?Wi…...
DLSS状态指示器配置完全指南:实用监控工具深度解析
DLSS状态指示器配置完全指南:实用监控工具深度解析 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在追求极致游戏体验的路上,你是否曾疑惑DLSS是否真正生效?DLSS Swapper作为一款专…...
SketchUp STL开源工具:让3D设计无缝转化为可打印模型的完整方案
SketchUp STL开源工具:让3D设计无缝转化为可打印模型的完整方案 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 在…...
别再只改默认密码了!Nacos 1.x/2.x 生产环境安全加固保姆级清单(附漏洞自查脚本)
Nacos生产环境安全加固全指南:从基础配置到漏洞防御 在微服务架构盛行的今天,Nacos作为服务发现和配置管理的核心组件,其安全性直接影响整个系统的稳定性。许多团队在部署Nacos时往往只满足于修改默认密码,却忽视了完整的安全防护…...
Linux 中的硬链接和软连接是什么,二者有什么区别?
在 Linux 文件系统中,**硬链接(Hard Link)和软链接(Soft Link,又称符号链接 Symbolic Link)**是两种不同的文件引用方式。它们都允许用户通过不同的路径访问同一个文件内容,但它们的实现机制、限…...
SGMICRO圣邦微 SGM803B-JXN3G/TR SOT-23-3 监控和复位芯片
特性 适用于MAX803/MAX809/MAX810和ADM803/ADM809/ADM810的卓越升级版 高精度固定检测选项:3V、3.3V和5V 低供电电流:300nA(典型值)上电复位脉冲宽度:150毫秒(最小值) 复位输出选项: 开漏nRESET输出(SGM803B)推挽nRESET输出(SGM809B) . . 推挽复位输出(SGM810B)复位有效电压低至…...
RobotStudio新手必看:5分钟搞定夹取工件程序(附完整代码)
RobotStudio零基础实战:从夹取工件到高效编程的完整指南 第一次打开RobotStudio时,面对复杂的界面和陌生的术语,很多新手会感到无从下手。但别担心,掌握几个核心概念和操作步骤,你就能快速实现基础的夹取工件功能。本文…...
BVH构建优化:四种分割算法在光线追踪中的性能对比
1. BVH分割算法基础概念 当你在玩3D游戏时,有没有想过为什么场景中的物体能够如此快速地渲染出来?这背后就离不开BVH(边界体积层次结构)技术的支持。简单来说,BVH就像是一个高效的"物体分类系统",…...
苏州沃虎电子(VOOHU)10/100M集成式RJ45连接器SYT111B002BA2A1D产品介绍
苏州沃虎电子科技有限公司(品牌:VOOHU)供应的 SYT111B002BA2A1D 是一款高可靠性集成式RJ45连接器,专为10/100M以太网应用设计。该产品采用90侧插DIP封装,内置网络变压器,具备工业级宽温工作能力和优异的信号…...
