Open Cascade Write glTF Writer - PullRequest
       108

Open Cascade Write glTF Writer

0 голосов
/ 11 июля 2020

Open Cascade имеет писатель glTF в их текущей ветке разработки - RWGltf_CafWriter

Я пытаюсь преобразовать STP в glTF, используя его, и получил отправную точку из этого вопроса - Любые библиотеки с открытым исходным кодом для преобразования файлов STEP в формат файла glTF?

Это выглядит выполнимым, но я новичок в технологии Open Cascade и у меня мало вопросов

  • При расчете триангуляции для фигур с помощью BRepMesh_IncrementalMe sh, ему нужны отклонение линии и отклонение угла, что это такое и какими должны быть его значения?

  • RWGltf_CafWriter требует TDocStd_Document и TDF_LabelSequence, как мы можем получить их из Shapes?

Спасибо

1 Ответ

0 голосов
/ 13 июля 2020

При расчете триангуляции для форм с помощью BRepMesh_IncrementalMe sh требуется отклонение линии и отклонение угла, что это такое и какими должны быть его значения?

Параметры отклонения определяют качество sh. В пределах указанного c домена / алгоритма вы, вероятно, должны заранее знать допустимое отклонение вашей геометрии (например, не более 1 мм). Однако в контексте визуализации и произвольной модели САПР линейное отклонение обычно определяется относительно ограничивающей рамки документа.

RWGltf_CafWriter требует TDocStd_Document и TDF_LabelSequence, как мы можем получить их из фигур?

TDocStd_Document - это XDE-документ , поддерживаемый различными трансляторами форматов файлов, включая STEP и glTF. Если на этом этапе у вас есть один TopoDS_Shape из файла STEP, то вы, вероятно, использовали упрощенный переводчик STEP STEPControl_Reader. Чтобы сохранить структуру исходного документа, лучше использовать STEPCAFControl_Reader заполнение документа XDE.

В документе XDE фигуры (и не только фигуры) хранятся как метки, так что коллекция TDF_LabelSequence используется для передачи информации, такой как последовательность root фигур (корни дерева модели в документе), которые называются произвольными формами:

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