Unity程序化生成地形

 制作地形:

  1. 绘制方块
  2. 逐个绘制方块并加噪波高度
  3. 删除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);//    }//}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于MoviNet检测视频中危险暴力行为

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【Faster & Mask R-CNN模型实现啤酒瓶瑕疵检测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生…

Java项目实战II基于Java+Spring Boot+MySQL的桂林旅游景点导游平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于Java、…

每日读则推(十四)——Meta Movie Gen: the most advanced media foundation models to-date

premiere n.首映,首次公演 v.首次公演(戏剧、音乐、电影) a.首要的,最早的 Today we’re premiering Meta Movie Gen: the most advanced media foundation models to-date. 迄今,到现在为止 …

整数越界详解

目录 一、整数类型的范围 二、整数越界的原因 三、整数越界的示例 1.算术运算导致的整数越界 2.位运算导致的整数越界 3.数据类型转换导致的整数越界 四、整数越界的解决方法 在编程中&#xff0c;整数越界是一个需要特别注意的问题。当整数的计算结果超出了其所能表…

深度学习基础知识-编解码结构理论超详细讲解

编解码结构&#xff08;Encoder-Decoder&#xff09;是一种应用广泛且高效的神经网络架构&#xff0c;最早用于序列到序列&#xff08;Seq2Seq&#xff09;任务&#xff0c;如机器翻译、图像生成、文本生成等。随着深度学习的发展&#xff0c;编解码结构不断演变出多种模型变体…

Yolo系列 Yolo v4简介

目录 简介 YOLOv4的特点 1、数据增强&#xff1a;马赛克数据增强&#xff08;Mosaic Data Augmentation&#xff09; 2、 防止过拟合的方法DropBlock 3、标签平滑&#xff08;Label Smoothing&#xff09; 4、损失函数 &#xff1a;GIOU损失、DIOU损失、CIOU损失 &#x…

C语言的数组地址 数组的遍历与练习

1.int main(void) { int a[5] { 10,20,30,40,50 };//数组间的元素地址相连的 int* p; printf("%d\n", &a[0]); printf("%d\n", &a[1]); printf("%d\n", &a[2]); printf("%d\n", &a[3]); …

Python实现SSA智能麻雀搜索算法优化XGBoost-MLP回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着大数据技术的迅猛发展&#xff0c;机器学习模型在各行各业的应用越来越广泛。特别是在回归任务…

nginx 设置多个代理服务器(nginx多代理)

修改配置文件 nginx.conf 修改前的内容&#xff0c;如下&#xff1a; worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80…

如何找到网上爆款内容,快速复制扩大品牌声量

社媒内容爆款复制是现代营销中的一个重要策略&#xff0c;它对于提升品牌声量、曝光度和知名度具有显著效果。 首先什么是爆款&#xff1f; 爆款内容指的是在社交媒体或其他在线平台上迅速获得大量关注、分享和讨论的内容。 准确、及时找到这部分品牌相关的爆款内容&#xf…

2024年10月文章一览

2024年10月编程人总共更新了21篇文章&#xff1a; 1.2024年9月文章一览 2.《Programming from the Ground Up》阅读笔记&#xff1a;p147-p180 3.《Programming from the Ground Up》阅读笔记&#xff1a;p181-p216 4.《Programming from the Ground Up》阅读笔记&#xff…

Git连接码云-保姆级教学(连接Gitee失败的解决)

Git介绍 码云连接 一、Git介绍 二、Git的工作机制 下载链接&#xff1a;Git - 下载软件包 三、使用步骤 创建一个wss的文件夹&#xff0c;作为‘工作空间’ 四、连接码云账号 五、连接Gitee失败的解决方法 一、Git介绍 Git是一个免费的、开源的分布式版本控制…

KINGBASE部署

环境&#xff1a;x86_64 系统&#xff1a;centos7.9 数据库–版本&#xff1a;KingbaseES_V008R006C008B0014_Lin64_install 授权文件–版本&#xff1a;V008R006-license-企业版-90天 一 前置要求 1.1. 硬件环境要求 KingbaseES支持通用X86_64、龙芯、飞腾、鲲鹏等国产C…

Java并发常见面试题总结(下)

Map&#xff08;重要&#xff09; HashMap 和 Hashtable 的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMa…

Java - 免费图文识别_Java_免费_图片转文字_文字识别_spring ai_spring ai alibaba

本文主要是介绍借助阿里云免费的大模型额度来做高质量的图转文识别&#xff0c;图片转文字&#xff0c;或者文字识别都可以使用&#xff0c;比传统的OCR模式要直接和高效很多 。 本文使用的技术是spring ai qwen vl 。 Qwen vl有 100万Token 免费额度&#xff0c;可以用来免费…

基于边缘计算的智能门禁系统架构设计分析

案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统&#xff0c;用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前&#xff0c;可以通过线上提前预约的方式将自己的个人信息…

基于SpringBoot+Vue的购物商城系统【前后端分离】

基于SpringBootVue的购物商城系统设计与实现 摘要 随着互联网技术的不断发展&#xff0c;线上购物已经成为人们日常生活中不可或缺的一部分。本博客将详细介绍一个基于Spring Boot和Vue的购物商城系统的设计与实现。该系统包含了商品展示、购物车管理、订单处理、用户管理等模块…

标签之文字排版,图片,链接,音视频(HTML) 基础版

目录 标签之文字排版,图片,链接,音视频知识点: 练习题一: 效果: 练习题二: 效果: 标签之文字排版,图片,链接,音视频知识点: 超文本:链接 标记:标签<> 双标签 单标签 <br>//换行 <hr>//水平线 向后tab 向前shifttab html注释<!----> css /**/ …

后端:Spring、Spring Boot-实例化Bean依赖注入(DI)

文章目录 1. 实例化Bean2. 使用FactoryBean3. 依赖注入(DI)3.1 AutoWired 属性注入(查找顺序&#xff1a;先类型&#xff0c;后名字)3.2 AutoWired 在构造函数&参数上的使用3.3 Inject和Resource 进行依赖注入3.4 Value 进行注入 1. 实例化Bean 默认使用无参构造函数&…