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大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
