#mass #inertia #trimesh

no-std polyhedral_mass_properties

计算三角形网格的质量属性

4个版本

0.2.2 2024年8月15日
0.2.1 2024年8月15日
0.2.0 2024年8月15日
0.1.0 2024年8月13日

数据格式中排名第38

Download history 263/week @ 2024-08-12

每月下载量263
mass-props中使用

AGPL-3.0

24KB
282

多面体质量属性

计算三角形网格的质量属性(质量、质心、惯性矩阵/张量)。

该算法基于Michael Kallay的论文"通过三角形网格定义的固体的惯性矩计算"代码)。

文档

docs.rs上提供了带有示例的文档 📚️

演示二进制文件

二进制文件mass-props使用此库计算glTF文件中网格的质量属性。您可以尝试它以测试此库的输出。


lib.rs:

计算三角形网格的质量属性(质量、质心、惯性矩阵/张量)。

该算法基于Michael Kallay的论文"通过三角形网格定义的固体的惯性矩计算"代码)。

工作原理

网格中的每个三角形都对整个网格的质量属性有自身的贡献(TriangleContrib)。这些贡献可以独立计算,然后求和(O(N),其中N是网格中三角形的数量)。

然后可以将总和转换为实际的质量属性(MassProperties)使用MassProperties::from_contrib_sumO(1))。

示例

使用vertices: &[[f64; 3]]indices: &[usize]

#
#
#
let contribution_sum = indices
    .chunks_exact(3)
    .map(|indices| {
        TriangleContrib::new(
            vertices[indices[0]],
            vertices[indices[1]],
            vertices[indices[2]],
        )
    })
    .sum();
let mass_properties = MassProperties::from_contrib_sum(contribution_sum);

迭代器

如果 indices 是一个已知长度的 usize 迭代器(例如实现了 ExactSizeIterator),则无需先收集索引即可执行以下操作

#
#
#
let contribution_sum = (0..indices.len() / 3)
    .map(|_| {
        TriangleContrib::new(
            vertices[indices.next().unwrap()],
            vertices[indices.next().unwrap()],
            vertices[indices.next().unwrap()],
        )
    })
    .sum();
let mass_properties = MassProperties::from_contrib_sum(contribution_sum);

使用 Rayon 进行多线程

可以通过使用 Rayon 来轻松实现计算质量属性的多线程。

#
#
#
use rayon::prelude::*;

let contribution_sum = indices
    .par_chunks_exact(3) // par_chunks_exact instead of chunks_exact
    .map(|indices| {
        TriangleContrib::new(
            vertices[indices[0]],
            vertices[indices[1]],
            vertices[indices[2]],
        )
    })
    .sum();
let mass_properties = MassProperties::from_contrib_sum(contribution_sum);
多线程有一些开销,并且对于小型网格,甚至可能比单线程慢,特别是如果你可以使用迭代器而不是先收集它们来使用 Rayon。在使用之前,请首先针对您的用例基准测试多线程版本。

功能标志

  • std:启用标准库的使用。由 fmagltf 启用。
  • fma:使用 FMA 指令集 以获得更好的性能。需要使用 RUSTFLAGS="-C target-cpu=native" 编译。
  • serde:为 InertiaMassProperties 实现 SerializeDeserialize 特性。
  • gltf:启用使用 MassProperties::from_gltf 计算gltf/glb文件的质量属性。

依赖关系

~0–0.8MB
~17K SLoC