Mujoco - CoACD简略教程

Felix Christian Lv2

CoACD是一个凸分解工具,可以将凹模型粗略粗分解为凸几何体的并集。

一、源代码编译

安装教程

(1) 克隆代码:

1
git clone --recurse-submodules https://github.com/SarahWeiii/CoACD.git

(2) 安装依赖:

1
2
cmake >= 3.24
g++ >= 9, < 12

在我的Ubuntu22.04中,apt里的cmake包版本是3.22,不能用。用snap成功安装3.30版本。(源码安装好像也行,不过我懒得添加系统变量,就还是用snap安装了。

(3) 编译

1
2
3
cd CoACD \
&& mkdir build \
&& cd build \

​ 然后编译:

1
2
cmake .. -DCMAKE_BUILD_TYPE=Release \
&& make main -j

这里出了很多warning,但是好像不影响使用。

(4) 使用

1
./main -i PATH_OF_YOUR_MESH -o PATH_OF_OUTPUT

参数说明

  • -nm/--no-merge : 禁用合并后处理,默认为false。
  • -c/--max-convex-hull : 凸包上限,默认-1表示无限制。仅在启用合并时才有效。
  • -ex/--extrude : 沿着重叠面挤出相邻的凸包。
  • -am/--approximate-mode : 近似形状类型(“ch”表示凸包,“box”表示立方体)。
  • --seed : 随机种子,默认是random()。

说明

  1. 大多数情况下,只需调整threshold (0.01~1)即可平衡细节程度和分解成分的数量。值越高,结果越粗,值越低,结果越细。
  2. 默认参数是快速版本。可以牺牲运行时间获取更多组件数量,增加searching depth (-md)searching node (-mn)searching iteration (-mi)可以获得更好的切割策略。

二、PyPI

安装

1
pip install coacd

使用

1
2
3
4
5
import coacd

mesh = trimesh.load(input_file, force="mesh")
mesh = coacd.Mesh(mesh.vertices, mesh.faces)
parts = coacd.run_coacd(mesh) # a list of convex hulls.

参数

官方文档里没有提到详细的参数列表,通过以下指令自己查询了下:

1
2
import inspect
print(inspect.getsource(coacd.run_coacd))

查询到的参数和对应的解释如下:

  • threshold (float): 用于决定分解精度的阈值。较低的阈值意味着更精确的分解,但可能需要更多的计算资源。默认值为 0.05
  • max_convex_hull (int): 最大凸包数量。如果你希望限制生成的凸包数量,可以设置此值。例如,如果设置为 5,则最多生成 5 个凸包,默认值为 -1,表示不限制。
  • preprocess_mode (str): 预处理模式,"on" 启用,"off" 禁用,"auto" 自动选择(推荐)。预处理可能影响分解的速度和结果。
  • resolution (int): 处理网格的分辨率,值越高,结果越精确,但计算量也越大。默认值为 2000
  • mcts_nodes (int): MCTS(蒙特卡洛树搜索)中每个节点的最大数量。值越大,搜索的深度越高,可能会增加分解的准确度,但会消耗更多的计算资源。
  • mcts_iterations (int): MCTS的迭代次数,更多的迭代次数意味着更高的准确性,但会增加计算负担。
  • pca (bool): 是否使用主成分分析(PCA)来减少维度。True 表示启用,False 表示禁用。
  • merge (bool): 是否合并小的凸包。如果设置为 True,可能会减少生成的凸包数量。
  • decimate (bool): 是否在生成凸包时进行简化,减少网格面片的数量。
  • max_ch_vertex (int): 每个凸包允许的最大顶点数量。
  • extrude (bool): 是否对凸包进行拉伸。True 表示拉伸,False 表示不拉伸。
  • extrude_margin (float): 如果 extrudeTrue,设置拉伸的边距。
  • apx_mode (str): 设置近似方式,"ch" 代表使用凸包,"box" 表示使用包围盒。
  • seed (int): 随机种子,设置它可以帮助重现相同的结果。

根据参数,一个简要的包含输出的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import coacd
import trimesh
import os

input_file = "input.obj"

mesh = trimesh.load(input_file, force="mesh")
mesh = coacd.Mesh(mesh.vertices, mesh.faces)

parts = coacd.run_coacd(
mesh,
threshold=0.05, # 精度阈值,默认: 0.05
max_convex_hull=-1, # 最大凸包数量,默认: -1 (无限制)
preprocess_mode="auto", # 预处理模式,默认: "auto"
preprocess_resolution=30, # 预处理分辨率,默认: 30
resolution=2000, # 分解分辨率,默认: 2000
mcts_nodes=20, # MCTS节点数,默认: 20
mcts_iterations=150, # MCTS迭代次数,默认: 150
mcts_max_depth=3, # MCTS最大深度,默认: 3
pca=False, # 是否启用PCA降维,默认: False
merge=True, # 是否合并小凸包,默认: True
decimate=False, # 是否简化凸包,默认: False
max_ch_vertex=256, # 每个凸包的最大顶点数,默认: 256
extrude=False, # 是否拉伸凸包,默认: False
extrude_margin=0.01, # 拉伸边距,默认: 0.01
apx_mode="ch", # 近似模式,默认: "ch" (凸包)
seed=0 # 随机种子,默认: 0
)

output_dir = "./output_parts/"

if not os.path.exists(output_dir):
os.makedirs(output_dir)

for i, part in enumerate(parts):
part_mesh = trimesh.Trimesh(vertices=part[0], faces=part[1])
part_mesh.export(os.path.join(output_dir, f"part_{i}.obj"))

print(f"Exported {len(parts)} convex parts to {output_dir}")

  • 标题: Mujoco - CoACD简略教程
  • 作者: Felix Christian
  • 创建于 : 2024-09-29 20:07:05
  • 更新于 : 2024-12-16 22:18:18
  • 链接: https://felixchristian.top/2024/09/29/03-CoACD_notes/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论