Unity中 噪音算法

转载 2018年04月16日 12:55:46


           主要是利用Unity Mathf.PerlinNoise   函数(柏林噪声)的不同寻常的功能。

https://docs.unity3d.com/ScriptReference/Mathf.PerlinNoise.html   其中一个实例代码是生成  柏林噪声图片。     第二个实例是动画效果(看似y的随机运动,对随机的动画来讲很好啊!)。

这样设置 得到:


 

1Mathf.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

 

[csharp] view plain copy
  1. // RandomMapMaker.cs  
  2. using UnityEngine;  
  3. using System.Collections;  
  4. using System.Collections.Generic;  
  5.   
  6. public class RandomMapMaker : MonoBehaviour {  
  7.   
  8. private float _seedX, _seedZ;  
  9.   
  10. [SerializeField]  
  11. private float _width = 50;  
  12. [SerializeField]  
  13. private float _depth = 50;  
  14.   
  15. [SerializeField]  
  16. private bool _needToCollider = false;  
  17.   
  18. [SerializeField]  
  19. private float _maxHeight = 10;  
  20.   
  21. [SerializeField]  
  22. private bool _isPerlinNoiseMap = true;  
  23.   
  24. [SerializeField]  
  25. private float _relief = 15f;  
  26.   
  27. [SerializeField]  
  28. private bool _isSmoothness = false;  
  29.   
  30. [SerializeField]  
  31. private float _mapSize = 1f;  
  32. //=================================================================================  
  33. //初期化  
  34. //=================================================================================  
  35. private void Awake () {  
  36.   
  37. transform.localScale = new Vector3(_mapSize, _mapSize, _mapSize);  
  38.   
  39. _seedX = Random.value * 100f;  
  40. _seedZ = Random.value * 100f;  
  41.   
  42. for (int x = 0; x < _width; x++) {  
  43. for (int z = 0; z < _depth; z++) {  
  44.   
  45. GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);  
  46. cube.transform.localPosition = new Vector3 (x, 0, z);  
  47. cube.transform.SetParent (transform);  
  48. if(!_needToCollider){  
  49. Destroy(cube.GetComponent<BoxCollider> ());  
  50. }  
  51.   
  52. SetY (cube);  
  53. }  
  54. }  
  55. }  
  56.   
  57. private void OnValidate (){  
  58.   
  59. if(!Application.isPlaying){  
  60. return;  
  61. }  
  62.   
  63. transform.localScale = new Vector3(_mapSize, _mapSize, _mapSize);  
  64.   
  65. foreach (Transform child in transform) {  
  66. SetY (child.gameObject);  
  67. }  
  68. }  
  69.   
  70. private void SetY(GameObject cube){  
  71. float y = 0;  
  72.   
  73. if(_isPerlinNoiseMap){  
  74. float xSample = (cube.transform.localPosition.x + _seedX) / _relief;  
  75. float zSample = (cube.transform.localPosition.z + _seedZ) / _relief;  
  76. float noise = Mathf.PerlinNoise(xSample, zSample);  
  77. y = _maxHeight * noise;  
  78. }  
  79.   
  80. else{  
  81. y = Random.Range (0, _maxHeight);  
  82. }  
  83.   
  84. if(!_isSmoothness){  
  85. y = Mathf.Round (y);  
  86. }  
  87.   
  88. cube.transform.localPosition = new Vector3 (cube.transform.localPosition.x, y, cube.transform.localPosition.z);  
  89.   
  90. Color color = Color.black;  
  91. if(y > _maxHeight * 0.3f){  
  92. ColorUtility.TryParseHtmlString("#019540FF"out color);  
  93. }  
  94. else if(y > _maxHeight * 0.2f){  
  95. ColorUtility.TryParseHtmlString("#2432ADFF"out color);  
  96. }  
  97. else if(y > _maxHeight * 0.1f){  
  98. ColorUtility.TryParseHtmlString("#D4500EFF"out color);  
  99. }  
  100. cube.GetComponent<MeshRenderer> ().material.color = color;  
  101. }  
  102. }  





参考:

百度百科:  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

Unity3D噪声

http://www.manew.com/thread-97282-1-1.html
  • sgnyyy
  • sgnyyy
  • 2016-11-18 11:44:52
  • 336

Unity中使用柏林噪声生成地图

主要是利用Unity的 Mathf.PerlinNoise   函数(柏林噪声)的不同寻常的功能。https://docs.unity3d.com/ScriptReference/Mathf.Perl...
  • u010019717
  • u010019717
  • 2017-05-24 09:31:41
  • 3653

unity shader:使用噪声

噪声纹理的应用:噪声往往会应用到规则的事物里,从而产生一种杂乱无章的特殊效果。噪声纹理的创建:噪声纹理本质上是一个程序纹理,是由一些程序算法生成的纹理,相关纹理参数都在程序里面进行控制。常用的噪声纹理...
  • zjz520yy
  • zjz520yy
  • 2017-12-25 13:31:26
  • 131

图形学基础(4)——柏林噪声

柏林噪声  如果要构建复杂的表面,经常需要在纹理中加入一些可控的随机变化。比如不同的木板纹路,大理石纹路以及水面等等。   这个时候就需要引入可控的随机特征——噪声。总的来说,图形学中的噪声表示为 ...
  • qq_33274326
  • qq_33274326
  • 2017-03-29 17:34:51
  • 1252

Unity中利用柏林噪音生成随机地图

利用柏林噪音生成随机地图 什么是柏林噪音?(请自行百度)Perlin噪声 ( Perlin noise )指由Ken Perlin发明的自然噪声生成算法 。 原理学习可以参考:http://p...
  • MaximilianLiu
  • MaximilianLiu
  • 2018-02-02 16:17:59
  • 153

[算法]柏林噪声 Perlin Noise

关于柏林噪声的原理和算法在参考文献[1]的博客中,已经描述的非常详细。我在查阅Perlin本人的论文和那篇博客后,先写了一个一维PerlinNoise的演示程序~。在写完这个演示程序之后,发现原来不懂...
  • Mahabharata_
  • Mahabharata_
  • 2017-01-26 12:31:23
  • 9102

噪音贴图

作者:FOXhunt 链接:https://zhuanlan.zhihu.com/p/22337544 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 噪...
  • cexgiant
  • cexgiant
  • 2016-09-21 09:38:19
  • 1050

[图形学] 柏林噪声 (perlin noise)

参考论文:《An Image Synthesizer》 Ken Perlin         如果你是游戏玩家,你也许曾在游戏风景中驻足,并仔细观察草木和岩石的贴图,并感叹于它那看似杂乱而又...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2017-05-03 18:54:13
  • 3662

3D数学之柏林噪声(Perlin Noise)

经过四天的努力,终于自己实现了3D柏林噪声,当第一次用它成功渲染出茶壶的时候,感觉自己跟《当幸福来敲门》的男主角chris一样,当时不由自主为自己鼓起了掌. 4天时间啊,这4天时间基本上没有背单词,白...
  • seamanj
  • seamanj
  • 2013-09-07 02:19:03
  • 8605
收藏助手
不良信息举报
您举报文章:Unity中 噪音算法
举报原因:
原因补充:

(最多只允许输入30个字)