返回介绍

Mathf.PerlinNoise 柏林噪波

发布于 2019-12-18 15:38:00 字数 5920 浏览 1945 评论 0 收藏 0

JavaScript => static function PerlinNoise(x: float, y: float): float;
C# => static float PerlinNoise(float x, float y);

Returns 返回

float Value between 0.0 and 1.0.

返回0.0 ~ 1.0的浮点数值

Description 描述

Generate 2D Perlin noise.

生成二维柏林噪波。

Perlin noise is a pseudo-random pattern of float values generated across a 2D plane (although the technique does generalise to three or more dimensions, this is not implemented in Unity). The noise does not contain a completely random value at each point but rather consists of “waves” whose values gradually increase and decrease across the pattern. The noise can be used as the basis for texture effects but also for animation, generating terrain heightmaps and many other things.

柏林噪波是在2D平面浮点值生成的伪随机图案(尽管该技术已经普及到三维或者更多维数,但在Unity还未实现)。此噪波不是由每个点的完全随机值构成,而是由逐渐增加和减少交错波形图案值构成。此噪波可以作为基本纹理效果,但也可用于动画、生成地形高度图以及其他东西。

Perlin noise sampled in the range 0..10 (the greyscale values represent values from 0..1)

Any point in the plane can be sampled by passing the appropriate X and Y coordinates. The same coordinates will always return the same sample value but the plane is essentially infinite so it is easy to avoid repetition by choosing a random area to sample from.

可以通过正确的XY坐标取样平面上的任意点。同一坐标将始终返回相同的样本值,但平面基本上是无限的,所以很容易通过选择一个随机样本以避免重复区域。

JavaScript:

// 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[];
 
 
function Start () {
	// 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];
	renderer.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();
}

C#:

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;
    void Start() {
        noiseTex = new Texture2D(pixWidth, pixHeight);
        pix = new Color[noiseTex.width * noiseTex.height];
        renderer.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();
    }
}

Although the noise plane is two-dimensional, it is easy to use just a single one-dimensional line through the pattern, say for animation effects.

尽管噪波平面是二维的,我们还是可以很容易的只使用一条一维的线穿过这图案(平面),去表示动画效果。

JavaScript:

// "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;
}

C#:

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;
    }
}

Mathf

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文