1

Open Cascade 在他们当前的开发分支中有 glTF writer - RWGltf_CafWriter

我正在尝试使用它将 STP 转换为 glTF 并从这个问题得到起点 - Any Open source Libraries to Convert STEP files to glTF file format?

看起来可行,但我是 Open Cascade 技术的新手,几乎没有问题

  • 在使用 BRepMesh_IncrementalMesh 计算形状的三角剖分时,它需要线偏转和角度偏转,这些是什么,它的值应该是什么?

  • RWGltf_CafWriter 需要 TDocStd_Document 和 TDF_LabelSequence,我们如何从 Shapes 中获取这些?

谢谢你

4

1 回答 1

2

在使用 BRepMesh_IncrementalMesh 计算形状的三角剖分时,它需要线偏转和角度偏转,这些是什么,它的值应该是什么?

挠度参数定义网格质量。在特定领域/算法中,您可能应该事先知道几何形状的适用偏差(例如不超过 1 毫米)。然而,在可视化和任意 CAD 模型的上下文中,通常相对于文档的边界框定义线性偏转。

RWGltf_CafWriter 需要 TDocStd_Document 和 TDF_LabelSequence,我们如何从 Shapes 中获取这些?

TDocStd_Document是各种文件格式转换器支持的XDE 文档- 包括 STEP 和 glTF。如果那时您有一个TopoDS_Shape来自 STEP 文件,那么您可能使用了简化的 STEP 转换器STEPControl_Reader。为了保留原始文档的结构,最好使用STEPCAFControl_Reader填充 XDE 文档。

在 XDE 文档中,形状(不仅是形状)存储为标签,因此该TDF_LabelSequence集合用于传递信息,如一系列根形状(文档中的模型树根),称为自由形状:

// read / create / fill in the document
Handle(TDocStd_Document) theXdeDoc; // created in advance

STEPCAFControl_Reader aStepReader;
if (!aStepReader.ReadFile ("myStep.stp") != IFSelect_RetDone) { // parse error }
if (!aStepReader.Transfer (theXdeDoc)) { // translation error }
...
// collect document roots into temporary compound
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool (myXdeDoc->Main());

TDF_LabelSequence aRootLabels;
aShapeTool->GetFreeShapes (aRootLabels);

TopoDS_Compound aCompound;
BRep_Builder    aBuildTool;
aBuildTool.MakeCompound (aCompound);
for (TDF_LabelSequence::Iterator aRootIter (aRootLabels); aRootIter.More(); aRootIter.Next())
{
  const TDF_Label& aRootLabel = aRootIter.Value();
  TopoDS_Shape aRootShape;
  if (XCAFDoc_ShapeTool::GetShape (aRootLabel, aRootShape))
  {
    aBuildTool.Add (aCompound, aRootShape);
  }
}

// perform meshing
Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer(); // holds visualization defaults
BRepMesh_IncrementalMesh anAlgo;
anAlgo.ChangeParameters().Deflection = Prs3d::GetDeflection (aCompound, aDrawer);
anAlgo.ChangeParameters().Angle      = 20.0 * M_PI / 180.0; // 20 degrees
anAlgo.ChangeParameters().InParallel = true;
anAlgo.SetShape (aCompound);
anAlgo.Perform();
...
// write or export the document
TColStd_IndexedDataMapOfStringString aMetadata;
RWGltf_CafWriter aGltfWriter ("exported.glb", true);
// STEP reader translates into mm units by default
aGltfWriter.ChangeCoordinateSystemConverter().SetInputLengthUnit (0.001);
aGltfWriter.ChangeCoordinateSystemConverter().SetInputCoordinateSystem (RWMesh_CoordinateSystem_Zup);
if (!aGltfWriter.Perform (theXdeDoc, aMetadata, Handle(Message_ProgressIndicator)())) { // export error }

在 Draw Harness 中,转换可能如下所示(命令的源代码可以用作使用相关 OCCT 算法的工作代码的有用参考):

pload XDE OCAF VISUALIZATION MODELING
# read STEP file into XDE document
ReadStep D myStep.stp
# display the document in 3D viewer (will also compute default triangulation)
vinit
XDisplay -dispMode 1 D
vfit
# export XDE document into glTF file
WriteGltf D myGltf.glb
于 2020-07-13T09:18:27.040 回答