簡體   English   中英

如何使用 CSGTree 進行多個布爾運算

[英]How to use CSGTree for multiple boolean operations

我正在嘗試通過 libigl 使用Csg Tree一次執行多個布爾運算。 在鏈接的教程中,只有這一行:

// Compute result of (A ∩ B) \ ((C ∪ D) ∪ E)
igl::copyleft::cgal::CSGTree<MatrixXi> CSGTree =
  {{{VA,FA},{VB,FB},"i"},{{{VC,FC},{VD,FD},"u"},{VE,FE},"u"},"m"};

我不知道如何使用CSGTree類 API 任何人都可以通過樣板示例提供理想的幫助嗎?

根據 libigl 教程:

Libigl 在內部使用精確算術來穩健地構造中間布爾結果。 如果重新注入進一步的布爾運算,將這個結果“四舍五入”為浮點(甚至雙精度)會導致問題。 為了方便 CSG 樹操作並鼓勵調用者不要多次顯式調用 igl::copyleft::cgal::mesh_boolean,libigl 實現了一個類 igl::copyleft::cgal::CSGTree。

簡而言之 - 您可以使用mesh_boolean函數構建CSG網格,但在這種情況下,您必須明確注意中間計算的穩健性。 CSGTree類會自動為您執行此操作,因為它使用CGAL精確算法進行所有帶坐標的中間計算。 CSGTree類的另一個好處 - 您只需一行代碼即可構建多級 CSG 樹。 下面的示例顯示了如何從兩個網格構建最簡單的 CSG 樹並將其可視化:

#include <Eigen/Dense>

#include <igl/copyleft/cgal/CSGTree.h>
#include <igl/opengl/glfw/Viewer.h>
#include <igl/read_triangle_mesh.h>

int main()
{
  // ------ load mesh #1
  Eigen::MatrixXd V1;
  Eigen::MatrixXi F1;
  igl::read_triangle_mesh("data/sphere.obj", V1, F1);
  // ------ load mesh #2
  Eigen::MatrixXd V2;
  Eigen::MatrixXi F2;
  igl::read_triangle_mesh("data/xcylinder.obj", V2, F2);
  // ------ combine meshes #1 and #2
  const igl::copyleft::cgal::CSGTree t{{V1, F1}, {V2, F2}, "union"};
  // ------ plot the combined mesh
  const auto V = t.cast_V<Eigen::MatrixXd>();
  const auto F = t.F();
  igl::opengl::glfw::Viewer viewer;
  viewer.data().set_mesh(V, F);
  viewer.launch();
}

這種單行構造是可能的,因為CSGTree具有以下構造函數(以及其他構造函數):

CSGTree(const CSGTree & A, const CSGTree & B, const MeshBooleanType & type)

正如您在上面看到的 - 如有必要,可以通過cast_V模板化函數將生成的坐標數組轉換為雙精度數組 - 例如,用於可視化。 此可視化的結果如下:

SphereUnionXCylinder

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM