当前位置: 首页 > wzjs >正文

那个网站可以找人做设计关键词林俊杰mp3免费下载

那个网站可以找人做设计,关键词林俊杰mp3免费下载,java cms建站,b2c 电子商务网站简单介绍柏林噪声 柏林噪声(Perlin Noise)是一种由 Ken Perlin 在1983年提出的梯度噪声(Gradient Noise)算法,用于生成自然、连续的随机值。它被广泛用于计算机图形学中模拟自然现象(如地形、云层、火焰等…

简单介绍柏林噪声

柏林噪声(Perlin Noise)是一种由 Ken Perlin 在1983年提出的梯度噪声(Gradient Noise)算法,用于生成自然、连续的随机值。它被广泛用于计算机图形学中模拟自然现象(如地形、云层、火焰等),是程序化生成(Procedural Generation)的核心技术之一。

柏林噪声的核心特点

  1. 连续性
    噪声值在空间中是平滑过渡的,没有突兀的跳变(与白噪声不同)。
  2. 可控随机性
    通过相同的输入(坐标+种子)总能得到相同的输出,适合可预测的生成。
  3. 分形扩展性
    可通过多层级叠加(Octaves)生成复杂细节(即分形噪声/Fractal Noise)。

也就是说,柏林噪声提供的是一个确定性的随机结果
更重要的是,它是连续的(输入连续的X,返回的Y也是连续的),这一点对于生成随机地形是非常有意义的。
而且还可以通过多次采样(通过参数控制采样粒度和影响强度)后进行叠加,为随机结果增加更多的细节。

用柏林噪声生成随机地图

假设我们定义好了地图的长宽,然后我们也有了一个柏林噪声的采样器(网上找一找就有),这时候就可以遍历地图上每一个地块,然后进行柏林噪声的采样,大概代码可能长这样(没写这个版本)

 			for (int _y = 0; _y < mMapManager.MapHeight; _y++){for (int _x = 0; _x < mMapManager.MapWidth; _x++){float _sampleValue = mPerlinNoise.Noise(_x, _y) * 2f - 1f;//可能还有一堆存储结果、记录极致之类的操作}}//最后还要对结果做一下归一化处理。。。

好,这就是最简单的版本了。但是这样有两个问题:一是我们缺少控制手段,结果完全依赖于柏林噪声的原始分辨率,二是结果虽然是随机的,但丰富度不够,也就是缺乏细节。

emmm…什么叫缺乏细节呢,文字描述起来比较费劲,直接看图吧。
这是一张缺乏细节的噪声图:
在这里插入图片描述
这是一张不缺乏细节的噪声图:
在这里插入图片描述
这样看起来就直观一些了。

那么接下来我们就开始增加细节。

首先,我们可以先增加一个ScaleParam的控制参数,通过这个控制参数对采样点(x,y)进行缩放,可以理解为修改了变化的频率,在相同变化幅度下,当频率变大,整个波形就会变得更扁平,也就是地形更平坦。这样我们就可以控制整个地图的基础地形特点了。

大概的代码长下面这样:

		//影响频率,提供整个地图基础的细节丰富程度(平坦程度,决定大的基础地形)float _invScaleParam = 1f / (float)mMapManager.ScaleParam;for (int i = 0; i < mMapManager.MapHeight; i++){for (int j = 0; j < mMapManager.MapWidth; j++){float _x = (j - _halfWidth) * _invScaleParam;float _y = (i - _halfHeight) * _invScaleParam;float _sampleValue = mPerlinNoise.Noise(_x, _y) * 2f - 1f;//还有一堆存储结果、记录极致之类的操作}}//同样需要归一化处理

在此之上,可以添加参数继续增加更加丰富的细节,这个过程说白了就是经过多轮采样,比如第一轮采样决定了基础的地形特点,第二轮采样增加山丘与平原的差异,第三轮采样。。。

所以,我们需要一个控制进行几轮采样的参数Octaves,并且为每一轮采样提供一个独立的类似ScaleParam一样调整波形频率的参数_frequency,整个多轮采样是一个从粗犷到细致的过程(从大的地形到小的细节),显而易见,每一轮采样结果对最终结果的贡献程度是由差别,因此还需要一个_amplitude来影响波形的振幅,从而做到单独控制每一轮采样对地形的修改幅度。

最后,刚才提到过了,_frequency和_amplitude都是针对每一轮采样动态变化的,因此还需要两个参数来分别控制它们在多轮采样间是如何变化的。

于是最终的结果就变成了下面这样:

using UnityEngine;namespace MapRandom.PerlinNoise
{public class TestPerlinNoiseMap : MonoBehaviour{public Transform MapRoot;public int MapWidth = 100;public int MapHeight = 100;public float Seed = 1f;public int ScaleParam = 20;public int Octaves = 3;public float Persistance = 0.5f;public float Lacunarity = 2f;private MapGenerator mMapGenerator;private MapNodeData[,] mMapData;private void Update(){if (Input.GetKeyUp(KeyCode.F2)){CreateMap();    }}private void CreateMap(){MapRoot.position = Vector3.zero;MapRoot.rotation = Quaternion.identity;MapRoot.localScale = Vector3.one;EnsureMapGenerator();mMapData = mMapGenerator.CreateMap();}private void EnsureMapGenerator(){if (null != mMapGenerator) return;mMapGenerator = new MapGenerator(this);}private void OnDrawGizmos(){if (null == mMapData) return;for (int _y = 0; _y < MapHeight; _y++){for (int _x = 0; _x < MapWidth; _x++){MapNodeData _mapNodeData = mMapData[_x, _y];Gizmos.color = _mapNodeData.Color;Gizmos.DrawCube(new Vector3(_x, 0, _y), Vector3.one);}}}}
}
using UnityEngine;namespace MapRandom.PerlinNoise
{public class MapNodeData{public float X;public float Y;public float Height;public Color32 Color = UnityEngine.Color.white;public MapNodeData(float _x, float _y, float _height){X = _x;Y = _y;Height = _height;}public void FormatColor(){if (Height < 0.25f){//深海Color = UnityEngine.Color.blue;}else if (Height < 0.5f){//浅海Color = UnityEngine.Color.cyan;}else if (Height < 0.55f){//平原Color = UnityEngine.Color.yellow;}else if (Height < 0.75f){//矮山(林地)Color = UnityEngine.Color.green;}else{//高山(雪山)Color = UnityEngine.Color.white;}}}public class MapGenerator{private TestPerlinNoiseMap mMapManager;private PerlinNoise mPerlinNoise;public MapGenerator(TestPerlinNoiseMap _mapManager){mMapManager = _mapManager;mPerlinNoise = new PerlinNoise();}public MapNodeData[,] CreateMap(){mPerlinNoise.Seed(mMapManager.Seed);MapNodeData[,] _retMap = new MapNodeData[mMapManager.MapWidth, mMapManager.MapHeight];float _maxValue = float.MinValue, _minValue = float.MaxValue;float _halfWidth = mMapManager.MapWidth * 0.5f;float _halfHeight = mMapManager.MapHeight * 0.5f;//影响频率,提供整个地图基础的细节丰富程度(平坦程度,决定大的基础地形)float _invScaleParam = 1f / mMapManager.ScaleParam;//扫描每一个地块for (int i = 0; i < mMapManager.MapHeight; i++){for (int j = 0; j < mMapManager.MapWidth; j++){float _noiseValue = 0f;//影响频率,在基础地形一致的情况下,每一层可以通过这个参数额外提供一些细节丰富度float _frequency = 1f;//影响振幅,控制每一层细节对原始地形的修改幅度float _amplitude = 1f;//逐层添加细节for (int k = 0; k < mMapManager.Octaves; k++){float _x = (j - _halfWidth) * _invScaleParam * _frequency;float _y = (i - _halfHeight) * _invScaleParam * _frequency;float _sampleValue = mPerlinNoise.Noise(_x, _y) * 2f - 1f;_noiseValue += _sampleValue * _amplitude;_frequency *= mMapManager.Lacunarity;_amplitude *= mMapManager.Persistance;}//记录最终结果MapNodeData _mapNode = _retMap[j, i];if (null == _mapNode){_mapNode = new MapNodeData(j, i, _noiseValue);_retMap[j, i] = _mapNode;}else{_mapNode.Height = _noiseValue;}//记录极值,用于归一化处理_maxValue = Mathf.Max(_maxValue, _noiseValue);_minValue = Mathf.Min(_minValue, _noiseValue);}}float _fixParam = 1f / (_maxValue - _minValue);for (int i = 0; i < mMapManager.MapHeight; i++){for (int j = 0; j < mMapManager.MapWidth; j++){MapNodeData _mapNode = _retMap[j, i];_mapNode.Height = (_mapNode.Height - _minValue) * _fixParam;_mapNode.FormatColor();}}return _retMap;}}
}

生成的效果如下:
在这里插入图片描述

http://www.dtcms.com/wzjs/29390.html

相关文章:

  • 东莞整站优化推广公司找火速搜索引擎营销就是seo
  • 做网站常规语言百度爱采购竞价
  • 深圳网站建设 易通鼎自媒体怎么入门
  • 深圳招聘网站哪个好自己建网页
  • 免费做网站公司推荐seo推广是什么工作
  • 外贸网站设计方案接单平台app
  • 做网站要什么颜色模式百度手机助手官网
  • 网站之家查询在哪里找专业推广团队
  • 开发小程序商城的费用刷排名seo
  • 戴尔网站建设目标百度一下百度搜索入口
  • 百度快照网站百度平台商户电话号码
  • 网站的建设论文爱站seo综合查询
  • 内蒙古企业网站制作浏览广告赚钱的平台
  • wordpress 房产模板搜索引擎优化自然排名
  • 企业网站建设的目的和意义百度人工优化
  • php网站留言板怎么做seo是什么工作
  • 靠谱的代运营公司广州网站优化公司如何
  • 网站建设的数据所有权引擎搜索优化
  • 微网站特效培训机构网站设计
  • 自助网站免费注册新闻软文推广案例
  • 网站结构说明排名seo怎么样
  • 休闲会所网站建设茶叶seo网站推广与优化方案
  • 律师网站素材三门峡网站seo
  • 做网站购买服务器吗西安优化排名推广
  • 无锡网站策划公司百度竞价登录
  • ecshop 手机网站开发强强seo博客
  • 网站建设详细教程视频百度优化
  • 网站建设综合实践 教材百度的网址是什么
  • 高端网站设计企业网站建设搜索指数的数据来源
  • 建网站培训学校网络营销网站推广