Unity中使用柏林噪声生成地图
孙广东 2017.3.27
http://blog.csdn.NET/u010019717
主要是利用Unity的 Mathf.PerlinNoise 函数(柏林噪声)的不同寻常的功能。
https://docs.unity3d.com/ScriptReference/Mathf.PerlinNoise.html 其中一个实例代码是生成 柏林噪声图片。 第二个实例是动画效果(看似y轴的随机运动,对随机的动画来讲很好啊!)。
这样设置 得到:
1、Mathf.PerlinNoise 函数的返回值是 0~1
2、一样的输入,输出也必将是一样的: 比如下面的测试,输出一直是 0.4652731
void Update()
{
float height = heightScale *Mathf.PerlinNoise(5f/*Time.time * xScale*/, 0.0F);
3、他的代码思路就是 100 *100个方块,然后根据 x, z 设置y坐标值和颜色(跟y有关),
|
float xSample = (cube.transform.localPosition.x + _seedX) / _relief; float zSample = (cube.transform.localPosition.z + _seedZ) / _relief; float noise = Mathf.PerlinNoise(xSample, zSample); y = _maxHeight * noise; |
为了增加随机性, 对x,z 的系数做随机:
|
_seedX = Random.value * 100f; _seedZ = Random.value * 100f; |
比如使用噪声生成 类似我的世界的地图等
代码相对简单,直接在Awake 函数中执行生成了 地图!
改变 尺寸 (宽度和深度)
改变 最大高度
如果不启用柏林噪声,而是使用随机的效果:
平整度:
还有是否添加碰撞体:
_relief 跌宕起伏,决定了 采样的间隔大小。值越大跨度越小。
地图大小,就是控制父对象的scale
// RandomMapMaker.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class RandomMapMaker : MonoBehaviour {
private float _seedX, _seedZ;
[SerializeField]
private float _width = 50;
[SerializeField]
private float _depth = 50;
[SerializeField]
private bool _needToCollider = false;
[SerializeField]
private float _maxHeight = 10;
[SerializeField]
private bool _isPerlinNoiseMap = true;
[SerializeField]
private float _relief = 15f;
[SerializeField]
private bool _isSmoothness = false;
[SerializeField]
private float _mapSize = 1f;
//=================================================================================
//初期化
//=================================================================================
private void Awake () {
transform.localScale = new Vector3(_mapSize, _mapSize, _mapSize);
_seedX = Random.value * 100f;
_seedZ = Random.value * 100f;
for (int x = 0; x < _width; x++) {
for (int z = 0; z < _depth; z++) {
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.localPosition = new Vector3 (x, 0, z);
cube.transform.SetParent (transform);
if(!_needToCollider){
Destroy(cube.GetComponent<BoxCollider> ());
}
SetY (cube);
}
}
}
private void OnValidate (){
if(!Application.isPlaying){
return;
}
transform.localScale = new Vector3(_mapSize, _mapSize, _mapSize);
foreach (Transform child in transform) {
SetY (child.gameObject);
}
}
private void SetY(GameObject cube){
float y = 0;
if(_isPerlinNoiseMap){
float xSample = (cube.transform.localPosition.x + _seedX) / _relief;
float zSample = (cube.transform.localPosition.z + _seedZ) / _relief;
float noise = Mathf.PerlinNoise(xSample, zSample);
y = _maxHeight * noise;
}
else{
y = Random.Range (0, _maxHeight);
}
if(!_isSmoothness){
y = Mathf.Round (y);
}
cube.transform.localPosition = new Vector3 (cube.transform.localPosition.x, y, cube.transform.localPosition.z);
Color color = Color.black;
if(y > _maxHeight * 0.3f){
ColorUtility.TryParseHtmlString("#019540FF", out color);
}
else if(y > _maxHeight * 0.2f){
ColorUtility.TryParseHtmlString("#2432ADFF", out color);
}
else if(y > _maxHeight * 0.1f){
ColorUtility.TryParseHtmlString("#D4500EFF", out color);
}
cube.GetComponent<MeshRenderer> ().material.color = color;
}
}
参考:
百度百科: http://baike.baidu.com/item/%E6%9F%8F%E6%9E%97%E5%99%AA%E5%A3%B0
http://postd.cc/understanding-perlin-noise/
http://evilonedeath.blog.fc2.com/blog-entry-127.html
http://befool.co.jp/blog/ayumegu/unity-study-Noise/
http://kan-kikuchi.hatenablog.com/entry/PerlinNoise
Unity中使用柏林噪声生成地图的更多相关文章
- Unity中利用柏林噪声(perlinnoise)制作摇摆效果
perlinnoise是unity中Mathf下的一个函数,需要两个float参数x和y进行采样,返回一个0-1的float型. 项目里经常要随机摇摆某些东西,比如摄像机,某个随机运动的目标等等,都可 ...
- 只写104行代码!在nopCommerce中如何实现自动生成网站地图
表告诉我说你不知道nopCommerce是什么.它是目前.NET中最流行的完全开源网上商城,由俄罗斯的团队在2008年开始立项一直开发到现在已经是3.3版本了.代码目前托管在codeplex上,有兴趣 ...
- 用体渲染的方法在Unity中渲染云(18/4/4更新)
github: https://github.com/yangrc1234/VolumeCloud 更新的内容在底部 最近在知乎上看到一篇文章讲云层的渲染(https://zhuanlan.zhihu ...
- Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染(下)
http://forum.china.unity3d.com/thread-32273-1-1.html 今天我们继续分享米哈游技术总监贺甲在Unite Beijing 2018大会上的演讲<在 ...
- Book of Shaders 03 - 学习随机与噪声生成算法
0x00 随机 我们不能预测天空中乌云的样子,因为它的纹理总是具有不可预测性.这种不可预测性叫做随机 (random). 在计算机图形学中,我们通常使用随机来模拟自然界中的噪声.如何获得一个随机值呢, ...
- Unity中创建二维码
在网络上发现了一个可以把字符串转换成二维码的dll,但是我们要怎么使用他呢.不废话,直接进入主题. 用到的引用 using UnityEngine;using ZXing;using ZXing.Qr ...
- 在Unity中创建可远程加载的.unity3d包
在一个Unity项目中,发布包本身不一定要包括所有的Asset(译为资产或组件),其它的部分可以单独发布为.unity3d,再由程序从本地/远程加载执行,这部分不在本文讨论范围.虽然Unity并没有直 ...
- 【原创翻译】初识Unity中的Compute Shader
一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...
- 解读Unity中的CG编写Shader系列三
转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...
随机推荐
- appium之Context切换
原文地址http://blog.csdn.net/Mandypan/article/details/51396302 Context切换driver.getContextHandles();//获取页 ...
- AngularJS 笔记之创建服务方式比较 : factory vs service vs provider 。
首先说一下服务这个东西是用来干嘛的.很多时候我们把太多的数据和逻辑都一股脑儿地往 controller 里放.这样我们的 controller 原来越臃肿.从它们的生命周期可以发现,其实 contro ...
- 前端 and css小技巧
随意更改网页 重新格式化代码,解决缩进问题 https://q1mi.github.io/PythonBlog/post/about_frontend/ css margin: 0 auto 居中 文 ...
- pytharm提示过期 License Activation 解决办法
遇到如下问题: 打开网站: http://idea.lanyus.com/ next next ok
- nodejs fs学习
在本章的开始,我本来只想写一些关于fs模块的内容,虽然这个模块包含的方法非常的多,但没有想到的是它和我们上一篇文章Node.js Buffer还存在着关联,所以我又把关于Buffer的内容简单的学习下 ...
- shiro的过滤器
shiro的过滤器也是不多的我们可以自定义的方法,它的继承体系如下: 另外UserFilter是继承于AccessControlFilter 1.NameableFilter NameableFilt ...
- MySQL-5.7 Update语句详解
1.语法 (1)单表 UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET assignment_list [WHERE where_condition ...
- Python3:Django根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'
Python3:Django根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete' 一.分析 在 ...
- Easy-RSA 3快速入门自述文件
Easy-RSA 3快速入门自述文件 这是使用Easy-RSA版本3的快速入门指南.运行./easyrsa -h可以找到有关使用和特定命令的详细帮助.可以在doc /目录中找到其他文档. 如果您从Ea ...
- 洛谷P4311 士兵占领
题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...