孙广东  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中使用柏林噪声生成地图的更多相关文章

  1. Unity中利用柏林噪声(perlinnoise)制作摇摆效果

    perlinnoise是unity中Mathf下的一个函数,需要两个float参数x和y进行采样,返回一个0-1的float型. 项目里经常要随机摇摆某些东西,比如摄像机,某个随机运动的目标等等,都可 ...

  2. 只写104行代码!在nopCommerce中如何实现自动生成网站地图

    表告诉我说你不知道nopCommerce是什么.它是目前.NET中最流行的完全开源网上商城,由俄罗斯的团队在2008年开始立项一直开发到现在已经是3.3版本了.代码目前托管在codeplex上,有兴趣 ...

  3. 用体渲染的方法在Unity中渲染云(18/4/4更新)

    github: https://github.com/yangrc1234/VolumeCloud 更新的内容在底部 最近在知乎上看到一篇文章讲云层的渲染(https://zhuanlan.zhihu ...

  4. Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染(下)

    http://forum.china.unity3d.com/thread-32273-1-1.html 今天我们继续分享米哈游技术总监贺甲在Unite Beijing 2018大会上的演讲<在 ...

  5. Book of Shaders 03 - 学习随机与噪声生成算法

    0x00 随机 我们不能预测天空中乌云的样子,因为它的纹理总是具有不可预测性.这种不可预测性叫做随机 (random). 在计算机图形学中,我们通常使用随机来模拟自然界中的噪声.如何获得一个随机值呢, ...

  6. Unity中创建二维码

    在网络上发现了一个可以把字符串转换成二维码的dll,但是我们要怎么使用他呢.不废话,直接进入主题. 用到的引用 using UnityEngine;using ZXing;using ZXing.Qr ...

  7. 在Unity中创建可远程加载的.unity3d包

    在一个Unity项目中,发布包本身不一定要包括所有的Asset(译为资产或组件),其它的部分可以单独发布为.unity3d,再由程序从本地/远程加载执行,这部分不在本文讨论范围.虽然Unity并没有直 ...

  8. 【原创翻译】初识Unity中的Compute Shader

    一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...

  9. 解读Unity中的CG编写Shader系列三

    转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...

随机推荐

  1. Python之字符编码(Day10)

    1. python解释器执行py文件的原理 ,例如python test.py    第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器 第二阶段:python解释器相当于文本编辑器, ...

  2. beego——URL构建

    如果可以匹配URl,那么beego也可以生成URL吗?当然可以. UrlFor()函数就是用于构建执行函数的URL的.它把对应控制器和函数名结合的字符串作为第一个参数,其余参数对应URL中的变量.未知 ...

  3. 第二课 GCC入门之静态库以及共享库

    序言: 前面一课讲了gcc的简单入门,包括gcc编译步骤:预处理:编译:汇编:链接.今天这节课就来讲下linux的库也欢迎大家吐糟共同学习. 原理: linux系统中分为2种库:静态库和共享库.静态库 ...

  4. SVN项目迁移到GIT

    源项目为SVN项目,  复制一份出来后. 在VS里无法修改 源码管理器的插件为GIT.    解决方法:  删除SVN插件信息 在解决方案文件中. 删除以下SVN信息就可以了   删除后:

  5. springmvc get post put delete

    web.xml <!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter: 可以把 POST 请求转为 DELETE 或 POS ...

  6. CodeForces - 995E Number Clicker (双向BFS)

    题意:给出u,v,p,对u可以进行三种变化: 1.u=(u+1)%p ; 2.u = (u+p-1)%p;  3.u = 模p下的逆元.问通过几步可以使u变成v,并且给出每一步的操作. 分析:朴素的b ...

  7. 让Jackson JSON生成的数据包含的中文以unicode方式编码

      本文出处:http://blog.csdn.net/chaijunkun/article/details/8257209,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建 ...

  8. C++添加简单的日记记录

    #include<fstream>#include<iostream> using namespace std;//这是一种日记记录 b 种void LOG(char *tx, ...

  9. JavaScript中堆栈解析,已经与delete之间的关系。

    1,在栈中的数据不会随意删除. 2,堆中的数据可以随意删除. 注意:用eval("var a")定义的变量存放在栈中. var 和function 语句在JavaScript中的优 ...

  10. Oracle数据类型(4)

    字符类型: CHAR(size):固定长度字符串,最大长度2000 bytes VARCHAR2(size):可变长度的字符串,最大长度4000 bytes,可做索引的最大长度749 NCHAR(si ...