Search code examples
gltfstepopencascade

Open Cascade Write glTF Writer


Open Cascade has glTF writer in their current development branch - RWGltf_CafWriter

I am trying to convert STP to glTF using it and got starting point from this question - Any Open source Libraries to Convert STEP files to glTF file format?

It looks doable, but I am new to Open Cascade technology and have few questions

  • While calculating triangulation for shapes using BRepMesh_IncrementalMesh, it needs line deflection and angle deflection, what are these and what should be its values?

  • RWGltf_CafWriter requires TDocStd_Document and TDF_LabelSequence, how do we get these from Shapes?

Thank You


Solution

  • While calculating triangulation for shapes using BRepMesh_IncrementalMesh, it needs line deflection and angle deflection, what are these and what should be its values?

    Deflection parameters define the mesh quality. Within specific domain / algorithm, you should probably know in advance applicable deviation of your geometry (like no more than 1 mm). However, in context of visualization and arbitrary CAD model, linear deflection is usually defined relatively to the bounding box of the document.

    RWGltf_CafWriter requires TDocStd_Document and TDF_LabelSequence, how do we get these from Shapes?

    TDocStd_Document is an XDE document supported by various file format translators - including STEP and glTF. If at that point you have a single TopoDS_Shape from STEP file, then you probably used a simplified STEP translator STEPControl_Reader. To preserve the structure of original document, it is better using STEPCAFControl_Reader filling in an XDE document.

    Within XDE document, shapes (and not only shapes) are stored as Labels, so that TDF_LabelSequence collection is used to pass through the information like a sequence of root shapes (model tree roots in the document), which are called Free Shapes:

    // 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 }
    

    In Draw Harness the conversion may look like this (the source code of commands can be used as a helpful reference of working code using related OCCT algorithms):

    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