簡體   English   中英

噪音功能如何實際起作用?

[英]How does the noise function actually work?

我查看了libnoise源並找到了ValuNoise3D函數:

double noise::ValueNoise3D (int x, int y, int z, int seed)
{
    return 1.0 - ((double)IntValueNoise3D (x, y, z, seed) / 1073741824.0);
}

int noise::IntValueNoise3D (int x, int y, int z, int seed)
{
    // All constants are primes and must remain prime in order for this noise
    // function to work correctly.
    int n = (
        X_NOISE_GEN    * x
      + Y_NOISE_GEN    * y
      + Z_NOISE_GEN    * z
      + SEED_NOISE_GEN * seed)
      & 0x7fffffff;

    n = (n >> 13) ^ n;
    return (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff;
}

但是當我看到這個時,這對我來說是一種魔力。 這實際上是如何工作的? 我的意思是為什么寫這篇文章的人拿這些素數代替其他人? 為什么這樣的等式 他是如何決定使用這些方程而不是其他方程式的? 只是......怎么理解這個?

libnoise網站對這種噪聲函數背后的數學有很好的解釋。 特別是關於素數:

這些大整數是素數。 這些整數可以修改,只要它們保持為素數; 非素數可能會在輸出中引入可辨別的模式。

noise::IntValueNoise3D實際上noise::IntValueNoise3D操作:第一步將(x,y,z)坐標轉換為單個整數,第二步將整數通過整數噪聲函數產生一個大致在-1073741824之間的噪聲值。 1073741824. noise::ValueNoise3D只是將該整數轉換為介於-1和1之間的浮點值。

至於為什么noise::IntValueNoise3D執行所有那些復雜的操作,它基本上歸結為這個特定的操作序列產生一個漂亮,嘈雜的結果,沒有明顯的模式可見。 這不是唯一可以使用的操作順序; 任何產生足夠嘈雜結果的東西都會起作用。

隨機性有一種藝術。 有很多東西使偽隨機數“看起來很好”。 對於很多3D功能而言,使其“看起來很好”最重要的是擁有適當的頻率分布。 確保以2 ^ 32為模數的良好頻率分布的任何東西都將產生非常好看的數字。 乘以大素數會產生良好的頻率分布,因為它們沒有2 ^ 32的因子共享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM