#mesh #image #map #density #generate #values #generator

app density-mesh-cli

CLI 程序,用于密度网格生成器

6 个稳定版本

1.5.0 2020 年 11 月 8 日
1.4.0 2020 年 11 月 7 日
1.3.0 2020 年 10 月 12 日

渲染 中排名 #137

MIT 许可证

77KB
2K SLoC

图像密度/高度图到网格生成器

crates-io version

关于

用于从表示密度/高度图的图像生成 2D 网格的 Crates。

算法获取源图像

image source

将其转换为密度/高度值(此处来自 alpha 通道)

image values

然后生成陡度值

image steepness

并基于最高陡度点构建网格

image mesh

Rust API

重要模块

典型用例是使用这两个模块中的一个从图像创建网格,但如果你有自己的图像处理程序,你可以坚持使用核心模块并自行生成密度图。

处理块

以前,有一种方法可以通过块来优化大型地图的工作,但这些块并没有提供可靠的拓扑结构,因此必须删除。

实时密度网格修改

想象一下,你有一个大网格,你想修改网格的可变大小区域,但又不想将其分成块 - 对于这种用例,有一个专门的 DensityMeshGenerator 类型。请注意,目前,即使你只更改地图的非常智能的部分,整个网格也将被重建,这意味着对于大型地图,这可能会花费很长时间,这意味着,目前你不应该使用此 crate 进行高性能、高清地图的生成。

let image = DynamicImage::ImageRgba8(
    image::open("../resources/heightmap.png")
        .expect("Cannot open file")
        .to_rgba(),
);
let settings = GenerateDensityImageSettings::default();
let map = generate_densitymap_from_image(image.clone(), &settings)
    .expect("Cannot produce density map image");
let settings = GenerateDensityMeshSettings {
    points_separation: 16.0.into(),
    keep_invisible_triangles: true,
    ..Default::default()
};
let mut generator = DensityMeshGenerator::new(vec![], map, settings.clone());
generator.process_wait().expect("Cannot process changes");
generator
    .change_map(64, 64, 128, 128, vec![255; 128 * 128], settings.clone())
    .expect("Cannot change live mesh map region");
generator
    .process_wait()
    .expect("Cannot process live changes");
generator
    .change_map(384, 384, 64, 64, vec![0; 64 * 64], settings)
    .expect("Cannot change live mesh map region");
generator
    .process_wait()
    .expect("Cannot process live changes");
let mut image = DynamicImage::ImageRgba8(
    generate_image_from_densitymap(generator.map(), false).to_rgba(),
);
apply_mesh_on_map(&mut image, generator.mesh().unwrap());
image
    .save("../resources/heightmap.live.png")
    .expect("Cannot save output image");

有了这些,我们添加了两个实心矩形,结果看起来像

image live

地图区域更改的优化

以前的版本有一个实时网格生成器,它只重新生成给定区域已更改的网格部分 - 目前此功能不再支持,因为存在内部网格生成崩溃的边缘情况,这使得使用此功能不可靠。此功能将在重新设计后添加。

CLI

安装 / 更新

cargo install density-mesh-cli --force

示例

density-mesh mesh -i image.png -o mesh.obj --obj

选项

density-mesh-cli 1.4.0
Patryk 'PsichiX' Budzynski <psichix@gmail.com>
CLI app for density mesh generator

USAGE:
    density-mesh.exe [SUBCOMMAND]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    help     Prints this message or the help of the given subcommand(s)
    image    Produce density map image
    mesh     Produce density mesh
density-mesh.exe-image
Produce density map image

USAGE:
    density-mesh.exe image [FLAGS] [OPTIONS] --input <PATH> --output <PATH>

FLAGS:
    -h, --help         Prints help information
    -s, --steepness    Produce steepness image
    -V, --version      Prints version information
        --verbose      Display settings used

OPTIONS:
        --density-source <NAME>    Density source: luma, luma-alpha, red, green, blue, alpha [default: luma-alpha]
    -i, --input <PATH>             Input image file
    -o, --output <PATH>            Output image file
        --scale <INTEGER>          Image scale [default: 1]
density-mesh.exe-mesh
Produce density mesh

USAGE:
    density-mesh.exe mesh [FLAGS] [OPTIONS] --input <PATH> --output <PATH> <--json|--json-pretty|--yaml|--obj|--png>

FLAGS:
    -h, --help                        Prints help information
        --json                        Produce JSON mesh
        --json-pretty                 Produce pretty JSON mesh
        --keep-invisible-triangles    Keep invisible triangles
        --obj                         Produce OBJ mesh
        --png                         Produce PNG mesh visualization
    -V, --version                     Prints version information
        --verbose                     Display settings used
        --yaml                        Produce YAML mesh

OPTIONS:
        --density-source <NAME>            Density source: luma, luma-alpha, red, green, blue, alpha [default: luma-
                                           alpha]
        --extrude-size <NUMBER>            Extrude size
    -i, --input <PATH>                     Input image file
        --max-iterations <INTEGER>         Maximum tries number when finding point to place [default: 32]
    -o, --output <PATH>                    Output mesh file
        --points-separation <NUMBER>       Points separation [default: 10]
        --scale <INTEGER>                  Image scale [default: 1]
        --steepness-threshold <NUMBER>     Steepness threshold [default: 0.01]
        --update-region-margin <NUMBER>    Margin around update region box [default: 0]
        --visibility-threshold <NUMBER>    VIsibility threshold [default: 0.01]

依赖项

~16MB
~140K SLoC