学习VTK9笔记(三)打开stl文件

STL格式的文件,是VTK支持的各种类型的文件之一。

       STL(Stereolithography)文件,有时被称为“标准三角语言”或“标准曲面细分语言”,由3D Systems于1987年创建,并且已被广泛用作全行业3D打印机模型的标准文件。这些文件是从原生CAD文件导出的,并使用三维笛卡尔坐标系“[维基百科,”STL(文件)描述三角形单位法线和顶点(按右手规则排序)的原始非结构化三角形曲面 格式)“,2019年]。 简而言之,STL是将CAD模型近似为一组三角形,将样条(如样条曲线,p线,弧线,挤出和扫掠)转换为三角形简单和复合材料。

        需要注意以下事项:二进制/ ASCII:虽然两种格式的编码之间存在很大差异,但基本上二进制和ASCII在功能上是相似的,但需要注意的是,二进制文件往往比大多数切片软件更小,处理能力更低。 除非特别要求,否则Binary通常是首选,因为文件较小。单位:STL文件的定义不包括度量单位。 导出模型时,请注意本机CAD的单位以及打印机/切片软件的预期单位。 大多数切片软件都有单元配置,但默认情况下大多数常见部署都需要毫米(mm)。分辨率:这将是CAD软件包之间最多样化的属性,但一般来说,目标是确保最小公差/偏差小于3D打印机能够生成的最精细特征。 例如,如果3D打印机可以产生的最佳分辨率为100微米,则STL的直径,角度,镶嵌部分等的公差应在100微米以内。

#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSTLReader.h>
#include <vtkProperty.h>
#include <vtkInteractorStyleTrackballCamera.h>

#define vtkSPtr vtkSmartPointer
#define vtkSPtrNew(Var, Type) vtkSPtr<Type> Var = vtkSPtr<Type>::New();
#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
//VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
//VTK_MODULE_INIT(vtkRenderingFreeType)
#endif
using namespace std;

int main()
{
    vtkSPtrNew(reader, vtkSTLReader);	    
    reader->SetFileName(D:\\bird.stl);   // 读取STL
    reader->Update();

    vtkSPtrNew(mapper, vtkPolyDataMapper);    //渲染的多边形几何数据,派生自vtkMapper
    mapper->SetInputConnection(reader->GetOutputPort());  //管线链接,将读取的数据给mapper
    
    vtkSPtrNew(actor, vtkActor);        //派生自vtkProp类,对渲染场景中数据的可视化表达。(不太好理解,可以理解英文字面意思,就是具体显示出来的内容(演员))
                                        //vtkActor负责场景中的几何数据,vtkVolume负责场景中的体数据(有的网站上自动翻译给翻译成音量^_^)
    actor->SetMapper(mapper);
    actor->GetProperty()->SetEdgeColor(255, 241, 0);	// 显示边框颜色
//    actor->GetProperty()->SetEdgeVisibility(1);		// 显示边框
    vtkSPtrNew(ren1, vtkRenderer);       //负责管理场景渲染过程的类
    ren1->AddActor(actor);
    ren1->SetBackground(0.1, 0.2, 0.4);      //背景色

    vtkSPtrNew(renWin, vtkRenderWindow);     //vtkRenderWindow及其子类,负责管理本地计算机系统中窗口创建和渲染过程
    renWin->AddRenderer(ren1);
    vtkSPtrNew(iren, vtkRenderWindowInteractor);   //提供平台独立的响应鼠标、键盘和时钟事件的交互机制,交给vtkInteractorStyle类型去处理
    iren->SetRenderWindow(renWin);
    vtkSPtrNew(style, vtkInteractorStyleTrackballCamera);  //3D场景交互器,有多种style,可以看看其他类型。
    iren->SetInteractorStyle(style);
    renWin->SetSize(600, 600);        //设置窗口大小
    renWin->Render();
    iren->Start();
    return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用VTK实现一个STL文件切片的体绘制结果,你可以使用`vtkPolyData`和`vtkCutter`。下面是一个简单的示例代码: ```cpp #include <vtkSmartPointer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> #include <vtkSTLReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkPlane.h> #include <vtkCutter.h> int main(int argc, char* argv[]) { // 创建STL读取器 vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New(); reader->SetFileName("path/to/stl/file"); reader->Update(); // 创建切割平面 vtkSmartPointer<vtkPlane> plane = vtkSmartPointer<vtkPlane>::New(); plane->SetOrigin(0, 0, 0); plane->SetNormal(1, 0, 0); // 设置切割平面的法向量 // 创建切割器 vtkSmartPointer<vtkCutter> cutter = vtkSmartPointer<vtkCutter>::New(); cutter->SetInputConnection(reader->GetOutputPort()); cutter->SetCutFunction(plane); cutter->GenerateValues(1, 0, 0); // 设置切割值 // 创建多边形数据映射器 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cutter->GetOutputPort()); // 创建演员 vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 创建渲染器和渲染窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 创建交互器并启动渲染循环 vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); interactor->Initialize(); interactor->Start(); return 0; } ``` 在上面的示例代码中,我们首先创建了一个`vtkSTLReader`对象,用于读取STL文件的数据。然后,我们创建了一个`vtkPlane`对象来定义切割平面,设置其原点和法向量。 接下来,我们创建了一个`vtkCutter`对象,并将读取器的输出连接到切割器的输入端口。通过`SetCutFunction()`方法,我们将切割平面设置为切割器的切割函数。使用`GenerateValues()`方法,我们生成了一个切割值。 然后,我们创建了一个`vtkPolyDataMapper`对象,并将切割器的输出连接到映射器的输入端口。 最后,我们创建了一个`vtkActor`对象,并将映射器设置为演员的映射器。然后,我们创建了一个`vtkRenderer`对象,并将演员添加到渲染器中。最后,我们创建了一个`vtkRenderWindow`对象,并将渲染器添加到渲染窗口中。 通过创建一个`vtkRenderWindowInteractor`对象,并将其与渲染窗口关联起来,可以启动渲染循环,显示STL文件切片的体绘制结果。 请将代码中的"path/to/stl/file"替换为您自己的STL文件路径。此外,您还可以根据需要调整切割平面的位置和方向。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值