12、VTK用X、Z平面去切割一个圆锥

红色是留下的部分,透明蓝色是切去的部分

cpp 复制代码
#include "MainWindow.h"

#include <QApplication>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
#include <vtkClipPolyData.h>
#include <vtkPlane.h>
#include <vtkAxesActor.h>

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)

int main(int argc, char *argv[])
{
    double h = 1.0f;

    auto cone = vtkSmartPointer<vtkConeSource>::New();
    cone->SetRadius(0.3);
    cone->SetHeight(h);
    cone->SetResolution(100);
    cone->SetDirection(0, 1, 0);

    auto plane = vtkSmartPointer<vtkPlane>::New();
    plane->SetNormal(0, 1, 0); // 希望用X、Z平面去切割,则法向量是Y轴方向
    plane->SetOrigin(0, 0, 0); // 平面过原点

    auto clip = vtkSmartPointer<vtkClipPolyData>::New();
    clip->SetInputConnection(cone->GetOutputPort());
    clip->SetClipFunction(plane);
    clip->SetValue(0);
    clip->GenerateClippedOutputOn(); // 生成切去部分
    clip->Update();

    auto mapperRemain = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapperRemain->SetInputConnection(clip->GetOutputPort()); // 切割留下的部分

    auto actorRemain = vtkSmartPointer<vtkActor>::New();
    actorRemain->SetMapper(mapperRemain);
    actorRemain->GetProperty()->SetColor(1, 0, 0);


    auto mapperClip = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapperClip->SetInputConnection(clip->GetClippedOutputPort()); // 切去的部分

    auto actorClip = vtkSmartPointer<vtkActor>::New();
    actorClip->SetMapper(mapperClip);
    actorClip->GetProperty()->SetColor(0, 0, 1);
    actorClip->GetProperty()->SetOpacity(0.3);


    auto actorAxes = vtkSmartPointer<vtkAxesActor>::New();

    auto render = vtkSmartPointer<vtkRenderer>::New();
    render->SetBackground(0.1, 0.2, 0.3);
    render->AddActor(actorRemain);
    render->AddActor(actorClip);
    render->AddActor(actorAxes);

    render->GetActiveCamera()->SetFocalPoint(0, 0, 0);
    render->GetActiveCamera()->SetPosition(1, 5, 5);

    auto wd = vtkSmartPointer<vtkRenderWindow>::New();
    wd->AddRenderer(render);

    auto interator = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    wd->SetInteractor(interator);
    wd->SetSize(800, 600);
    wd->SetPosition(200, 200);

    wd->Render();
    interator->Start();

    return 0;
}
相关推荐
天人合一peng8 小时前
Catia数控加工平面铣削
平面
Suprman1 天前
从 B/S 到 Electron:平面排版套料系统桌面版开发实战
javascript·平面·electron·排序算法
把我格子衫拿来5 天前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
把我格子衫拿来5 天前
VTK 与 Qt 的 CMake 工程怎么组织?模块、工具链与二进制兼容排错
c++·qt·vtk·cmake·工程实践
把我格子衫拿来5 天前
鼠标点到哪里才算选中?Qt 与 VTK 的拾取坐标、DPI 与体素定位
python·qt·vtk·坐标变换·三维交互
qq_284274055 天前
间歇运动机构与机械设计概论:棘轮与槽轮机构运动系数、零件失效与强度刚度准则、结构工艺性清根及标准件(含考点)
笔记·学习·平面·自动化·制造
把我格子衫拿来5 天前
VTK 体绘制入门到排错:传递函数、采样距离与透明度的关系
python·vtk·可视化·医学影像·体绘制
Earth explosion6 天前
企业级Agent:MCP正在成为新的控制平面
大数据·平面
chaoyuanl7 天前
从平面到包裹:超元力飞行影院如何构建“人在景中、身随景动”的感知闭环
人工智能·科技·平面·xr·vr·娱乐
思茂信息8 天前
CST技术案例:加载正弦曲线的平面螺旋天线仿真研究
算法·平面·emc·cst·电磁仿真·仿真辐射