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
每月下载量263
在mass-props中使用
24KB
282 行
多面体质量属性
计算三角形网格的质量属性(质量、质心、惯性矩阵/张量)。
该算法基于Michael Kallay的论文"通过三角形网格定义的固体的惯性矩计算"(代码)。
文档
在docs.rs上提供了带有示例的文档 📚️
演示二进制文件
二进制文件mass-props
使用此库计算glTF文件中网格的质量属性。您可以尝试它以测试此库的输出。
lib.rs
:
计算三角形网格的质量属性(质量、质心、惯性矩阵/张量)。
该算法基于Michael Kallay的论文"通过三角形网格定义的固体的惯性矩计算"(代码)。
工作原理
网格中的每个三角形都对整个网格的质量属性有自身的贡献(TriangleContrib
)。这些贡献可以独立计算,然后求和(O(N)
,其中N
是网格中三角形的数量)。
然后可以将总和转换为实际的质量属性(MassProperties
)使用MassProperties::from_contrib_sum
(O(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
:启用标准库的使用。由fma
和gltf
启用。fma
:使用 FMA 指令集 以获得更好的性能。需要使用RUSTFLAGS="-C target-cpu=native"
编译。serde
:为Inertia
和MassProperties
实现Serialize
和Deserialize
特性。gltf
:启用使用MassProperties::from_gltf
计算gltf/glb文件的质量属性。
依赖关系
~0–0.8MB
~17K SLoC