#mesh #image #density #convert-images #map #values #generator

density-mesh-core

密度网格生成器的核心模块

6 个稳定版本

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

#3#density

43 每月下载量
用于 5 个 crate (4 直接)

MIT 许可证

40KB
911

将图像密度/高度图转换为网格生成器

crates-io version

关于

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

算法获取源图像

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

地图区域更改优化

旧版本有一个实时网格生成器,它只重新生成给定区域改变的网格部分 - 由于存在网格生成器内部崩溃的角落情况,导致使用此功能不可靠,因此目前不支持此功能。此功能将在重新设计后添加。

命令行界面

安装/更新

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]

依赖项

~0.5–1.4MB
~29K SLoC