#perlin-noise #noise #perlin #terrain #procedural #simplex #graphics

无std fastnoise-lite

FastNoise Lite 是一个极其便携的开源噪声生成库,具有大量噪声算法选择

3个稳定版本

1.1.1 2024年3月5日
1.1.0 2023年10月15日
1.0.1 2023年10月6日

图像 类别中排名第 80

Download history 82/week @ 2024-04-08 145/week @ 2024-04-15 42/week @ 2024-04-22 132/week @ 2024-04-29 142/week @ 2024-05-06 76/week @ 2024-05-13 124/week @ 2024-05-20 121/week @ 2024-05-27 73/week @ 2024-06-03 132/week @ 2024-06-10 112/week @ 2024-06-17 74/week @ 2024-06-24 155/week @ 2024-07-01 219/week @ 2024-07-08 127/week @ 2024-07-15 313/week @ 2024-07-22

每月下载量 818
用于 noise-functions

MIT 许可证

140KB
2.5K SLoC

GitHub crates.io docs.rs

FastNoise Lite

FastNoise Lite 是一个极其便携的开源噪声生成库,具有大量噪声算法选择。此库专注于高性能,同时避免特定平台/语言的特性,允许轻松移植到尽可能多的语言。

特性

  • 2D & 3D采样
  • OpenSimplex2噪声
  • OpenSimplex2S噪声
  • 细胞(沃罗诺伊)噪声
  • Perlin噪声
  • 值噪声
  • 值立方噪声
  • 基于OpenSimplex2的域扭曲
  • 基本网格梯度域扭曲
  • 所有上述内容的多重分形选项
  • 支持X/Y采样位置使用 f32f64 精度浮点数(请参阅下方的“特性标志”)
  • no_std(请参阅下方的“特性标志”)

特性标志

您可以在 Cargo.toml 文件中通过您的 fastnoise-lite 依赖项选择性地启用以下选项。

  • "f64":使用 f64 而不是默认的 f32,X/Y坐标采样输入。
  • "std":使用Rust标准库进行浮点数操作(sqrt()trunc()、和abs())。必须启用此选项之一或"libm"。如果没有指定功能标志,则默认启用(但请注意,指定"f64"将意味着此选项不再是默认选项,并且也必须指定)。
  • "libm":启用no_std支持。必须启用此选项之一或"std"。使用libm可选依赖项(通过num-traits可选依赖项)允许进行浮点数操作(sqrt()trunc()、和abs()),而不依赖于Rust标准库的实现。除非使用此功能标志,否则FNL无依赖项,此时将引入这些可选依赖项。

入门指南

  • 首先,使用FastNoiseLite::new()FastNoiseLite::with_seed(seed)构造FastNoiseLite结构体
  • 接下来,你可以调用各种设置函数来配置对象的噪声生成设置,以满足你的需求。
  • 可选地,你可以使用domain_warp_2d(x, y)domain_warp_3d(x, y, z)将你的原始采样坐标转换为域扭曲坐标,然后再使用它们在下一步中采样噪声。
  • 最后,通过调用get_noise_2d(x, y)get_noise_3d(x, y, z)在每个像素的X/Y(/Z)坐标处采样噪声值。你可能需要将输出范围从-1..1重新映射到你的所需范围。

有关项目入门和文档的信息,请参阅其GitHub维基页面的入门文档页面。

以下是一个创建128x128 OpenSimplex2噪声数组的示例。

use fastnoise_lite::*;

// Create and configure the FastNoise object
let mut noise = FastNoiseLite::new();
noise.set_noise_type(Some(NoiseType::OpenSimplex2));

const WIDTH: usize = 128;
const HEIGHT: usize = 128;
let mut noise_data = [[0.; HEIGHT]; WIDTH];

// Sample noise pixels
for x in 0..WIDTH {
    for y in 0..HEIGHT {
        // Domain warp can optionally be employed to transform the coordinates before sampling:
        // let (x, y) = noise.domain_warp_2d(x as f32, y as f32);
        
        let negative_1_to_1 = noise.get_noise_2d(x as f32, y as f32);
        // You may want to remap the -1..1 range data to the 0..1 range:
        noise_data[x][y] = (neg_1_to_1 + 1.) / 2.;
        
        // (Uses of `as f32` above should become `as f64` if you're using FNL with the "f64" feature flag)
    }
}

// Do something with this data...

依赖项

~99KB