VTK 多个STL模型 输出为一个STL模型

思路:首先分别读取几个STL文件,创建Actor,设置位置、平移及旋转,创建每一个Actor对应的Mapper,绑定,最后创建render将多个Actor绑定render即可,同时显示多个STL模型。

    std::string filename ="./data/mesh1.stl";//E:\\VTKDemo\\build\\data\\data.stl
    vtkSmartPointer<vtkSTLReader> reader=vtkSmartPointer<vtkSTLReader>::New();
    reader->SetFileName(filename.c_str());
    reader->Update();
    std::string filename1 ="./data/data.stl";//E:\\VTKDemo\\build\\data\\data.stl
    vtkSmartPointer<vtkSTLReader> reader1=vtkSmartPointer<vtkSTLReader>::New();
    reader1->SetFileName(filename1.c_str());
    reader1->Update();
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    vtkSmartPointer<vtkPolyDataMapper> mapper1 = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(reader->GetOutputPort());
    mapper1->SetInputConnection(reader1->GetOutputPort());
    vtkSmartPointer<vtkTransform> pTransform = vtkSmartPointer<vtkTransform>::New();
    pTransform->PostMultiply();
    //pTransform->RotateX(90);//x轴旋转90度
    pTransform->Translate(50,0,180);
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    //actor->SetUserTransform(pTransform);
    actor->SetPosition(50,0,180);
    vtkSmartPointer<vtkActor> actor1 = vtkSmartPointer<vtkActor>::New();
    actor1->SetMapper(mapper1);
    actor1->SetPosition(0,0,0);
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderer->AddActor(actor);
    renderer->AddActor(actor1);
    renderer->SetBackground(.3, .6, .3); // Background color green
    renderWindow->Render();
     vtkSmartPointer<vtkSTLWriter> partW= vtkSmartPointer<vtkSTLWriter>::New();
    vtkSmartPointer<vtkAppendPolyData> apd= vtkSmartPointer<vtkAppendPolyData>::New();
    vtkSmartPointer<vtkActorCollection> actors=vtkSmartPointer<vtkActorCollection>::New();
    actors=renderer->GetActors();//获取当前RENDER的ACTORS
    int iSum = actors->GetNumberOfItems();//获得这个渲染器内拥有的actor的数量
    actors->InitTraversal();//初始化访问便利链表,这两句话不可颠倒,初始化后获得的actor总数就不对了
    cout<<iSum<<endl;
    for (int i = 0;i < iSum;i++)
    {
        vtkSmartPointer<vtkActor> pA = vtkSmartPointer<vtkActor>::New();
        pA = actors->GetNextActor();//遍历每一个actor
        double* pPos = pA->GetPosition();
        pA->SetPosition(pPos[0],pPos[1],pPos[2]);
        cout<<pPos[0]<<"  "<<pPos[1]<<"  "<<pPos[2]<<endl;
        /*
        if (abs(pPos[0]) < ESP && abs(pPos[1]) < ESP && abs(pPos[2]) <ESP)//有没有平移运动
        {
            vtkSmartPointer<vtkPolyDataMapper> pMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
            pMapper= (vtkPolyDataMapper*)pA->GetMapper();
            apd->AddInputData(pMapper->GetInput());
            continue;
        }
         */
        vtkSmartPointer<vtkPolyDataMapper> pMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
        pMapper= (vtkPolyDataMapper*)pA->GetMapper();
        vtkSmartPointer<vtkPolyData> pData = vtkSmartPointer<vtkPolyData>::New();
        pData=pMapper->GetInput();
        vtkSmartPointer<vtkPoints> pPoints = vtkSmartPointer<vtkPoints>::New();
        pPoints=pData->GetPoints();
        vtkIdType iSumPts=pPoints->GetNumberOfPoints();//获得三角片点集
        cout<<iSumPts<<endl;
        for (int j = 0;j < iSumPts;j++)
        {
            double tmp[3];
            pPoints->GetPoint(j,tmp);
            for(int k=0;k<3;k++)
            {
                tmp[k]+=pPos[k];
            }
            pPoints->SetPoint(j,tmp);

        }
        apd->AddInputData(pData);
        apd->Update();

    }
    //vtkSmartPointer<vtkTriangleFilter> triangleFilter = vtkSmartPointer<vtkTriangleFilter>::New();//三角片过滤器
    //triangleFilter->SetInputConnection(apd->GetOutputPort());//导入合并后的polydata
    partW->SetInputData(apd->GetOutput());//将三角化后的模型数据导入STL输出器中
    std::string filename2 ="./data/BInd.stl";//E:\\VTKDemo\\build\\data\\data.stl
    partW->SetFileName(filename2.c_str());//设置输出文件名称
    partW->SetFileTypeToBinary(); //设置输出的STL文件为二进制类型,二进制占用更小的内存
    partW->Write();//写入文件
    renderWindowInteractor->Start();
    return 0;
VTK(Visualization Toolkit)是一个强大的开源软件库,主要用于科学可视化、医学图像处理和图形应用程序开发。当你提到将两个STL(标准三角化语言)文件合并为一个,这是VTK一个应用场景之一,尤其是在处理几何模型的时候。 在VTK中,你可以使用`vtkSTLReader`来读取单个或多个STL文件,然后使用如`vtkAppendPolyData`或者`vtkMergePolyData`这样的滤波器将它们组合在一起。具体步骤可能包括: 1. 创建`vtkSTLReader`实例,并分别加载两个STL文件。 2. 如果需要对模型进行预处理(例如清理、修剪),可以使用`vtkCleanPolyData`或`vtkClipPolyData`等。 3. 使用`vtkAppendPolyData`过滤器,设置其源数据为读取到的两个`vtkPolyData`对象,将其结果输出一个新的`vtkPolyData`。 4. 最后,如果需要保存这个合并后的模型,可以创建一个`vtkSTLWriter`,设置输出文件名,然后调用其Write方法将合并后的`vtkPolyData`写入新的STL文件。 如果你想要代码示例,这里有一个简单的伪代码框架: ```python import vtk # 创建STL读者 reader1 = vtk.vtkSTLReader() reader1.SetFileName("file1.stl") reader2 = vtk.vtkSTLReader() reader2.SetFileName("file2.stl") # 合并数据 appendFilter = vtk.vtkAppendPolyData() appendFilter.AddInputConnection(reader1.GetOutputPort()) appendFilter.AddInputConnection(reader2.GetOutputPort()) merged_polydata = appendFilter.GetOutput() # 写入新文件 writer = vtk.vtkSTLWriter() writer.SetFileName("merged.stl") writer.SetInputData(merged_polydata) writer.Write() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值