x | X-coordinate of sample point. |
y | Y-coordinate of sample point. |
float @return Значение между 0.0 и 1.0.
Генерирует 2D шум Перлина.
Perlin noise(шум Перлина), это - псевдослучайный шаблон чисел с плавающей запятой спроецированных на двумерную плоскость ( несмотря на то, что
техника позволяет обобщать три и более измерений, это не реализовано в Unity).
Шум не содержит полностью случайные значения в каждой точке, но состоит
из "волн" чьи значения постепенно увеличиваются или уменьшаются по шаблону. Шум может
быть использован, как основа для текстурных эффектов, но так же для анимации, генерации ландшафтных карт высот
и много другого.
Perlin noise находится в промежутке 0..10 (оттенки серого представлены значениями 0..1)
Любая точка плоскости, может быть с легкостью получена передачей соответствующих значений для X и Y координат.
Одни и те же координаты, всегда возвращают одинаковые значения, однако плоскость бесконечна
, так что можно с легкостью обойти повторение выбрав случайную область для получения значений.
// Create a texture and fill it with Perlin noise. // Try varying the xOrg, yOrg and scale values in the inspector // while in Play mode to see the effect they have on the noise.
// Width and height of the texture in pixels. var pixWidth: int; var pixHeight: int;
// The origin of the sampled area in the plane. var xOrg: float; var yOrg: float;
// The number of cycles of the basic noise pattern that are repeated // over the width and height of the texture. var scale = 1.0;
private var noiseTex: Texture2D; private var pix: Color[]; private var rend: Renderer;
function Start () { rend = GetComponent.<Renderer>(); // Set up the texture and a Color array to hold pixels during processing. noiseTex = new Texture2D(pixWidth, pixHeight); pix = new Color[noiseTex.width * noiseTex.height]; rend.material.mainTexture = noiseTex; }
function CalcNoise() { // For each pixel in the texture... for (var y = 0.0; y < noiseTex.height; y++) { for (var x = 0.0; x < noiseTex.width; x++) { // Get a sample from the corresponding position in the noise plane // and create a greyscale pixel from it. var xCoord = xOrg + x / noiseTex.width * scale; var yCoord = yOrg + y / noiseTex.height * scale; var sample = Mathf.PerlinNoise(xCoord, yCoord); pix[y * noiseTex.width + x] = new Color(sample, sample, sample); } } // Copy the pixel data to the texture and load it into the GPU. noiseTex.SetPixels(pix); noiseTex.Apply(); }
function Update () { CalcNoise(); }
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { public int pixWidth; public int pixHeight; public float xOrg; public float yOrg; public float scale = 1.0F; private Texture2D noiseTex; private Color[] pix; private Renderer rend; void Start() { rend = GetComponent<Renderer>(); noiseTex = new Texture2D(pixWidth, pixHeight); pix = new Color[noiseTex.width * noiseTex.height]; rend.material.mainTexture = noiseTex; } void CalcNoise() { float y = 0.0F; while (y < noiseTex.height) { float x = 0.0F; while (x < noiseTex.width) { float xCoord = xOrg + x / noiseTex.width * scale; float yCoord = yOrg + y / noiseTex.height * scale; float sample = Mathf.PerlinNoise(xCoord, yCoord); pix[y * noiseTex.width + x] = new Color(sample, sample, sample); x++; } y++; } noiseTex.SetPixels(pix); noiseTex.Apply(); } void Update() { CalcNoise(); } }
Несмотря на то, что плоскость шума двумерная, очень просто использовать одномерную линию из шаблона, скажем для анимационных эффектов.
// "Bobbing" animation from 1D Perlin noise. // Range over which height varies. var heightScale = 1.0; // Distance covered per second along X axis of Perlin plane. var xScale = 1.0; function Update () { var height = heightScale * Mathf.PerlinNoise(Time.time * xScale, 0.0); var pos = transform.position; pos.y = height; transform.position = pos; }
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { public float heightScale = 1.0F; public float xScale = 1.0F; void Update() { float height = heightScale * Mathf.PerlinNoise(Time.time * xScale, 0.0F); Vector3 pos = transform.position; pos.y = height; transform.position = pos; } }
Note: It is possible for the return value to slightly exceed 1.0f. You may need to clamp the return value if the 0.0 to 1.0 range is important to you.