前言

想在三维界面进行用户交互,实现对模型的独立操作,两个模型是自己建的模型。

方法

使用多边形构建矩形,并拉伸成立方体,两个立方体独立操作

int MyTrackballActor()
{ vtkSmartPointer<vtkLinearExtrusionFilter> m_extrude_sheyuan = vtkSmartPointer<vtkLinearExtrusionFilter>::New();{const int num_points = 4;vtkSmartPointer<vtkUnstructuredGrid> polygonGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();vtkSmartPointer<vtkPoints> polygonPoints = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();double top_left[num_points][3] = {{ 0, 2280 - 3200, 0 },{ 0, 2280, 0 },{ -2300, 2280, 0 },{ -2300, 2280 - 3200, 0 }};double Hight = 2170.0;// 几何数据 + 拓扑数据polygonPoints->SetNumberOfPoints(num_points);polygon->GetPointIds()->SetNumberOfIds(num_points);for (int i = 0; i < num_points; ++i){polygonPoints->SetPoint(i, top_left[i]);polygon->GetPointIds()->SetId(i, i);}polygonGrid->InsertNextCell(polygon->GetCellType(), polygon->GetPointIds());polygonGrid->SetPoints(polygonPoints);vtkNew<vtkDataSetSurfaceFilter> surface_filter;surface_filter->SetInputData(polygonGrid);surface_filter->Update();vtkNew<vtkTriangleFilter> filter;filter->SetInputData(surface_filter->GetOutput());filter->Update();// Apply linear extrusion(对平面进行拉伸成3D)m_extrude_sheyuan->SetInputConnection(filter->GetOutputPort());m_extrude_sheyuan->SetExtrusionTypeToNormalExtrusion();m_extrude_sheyuan->SetVector(0, 0, 1);// 沿文字方向挤压,沿着z向上m_extrude_sheyuan->SetScaleFactor(Hight);// 设置挤压比例 //blog.csdn.net/wanyongtai/article/details/106490653m_extrude_sheyuan->Update();}vtkSmartPointer<vtkLinearExtrusionFilter> m_extrude_chuang = vtkSmartPointer<vtkLinearExtrusionFilter>::New();{//{const int num_points = 4;vtkSmartPointer<vtkUnstructuredGrid> polygonGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();vtkSmartPointer<vtkPoints> polygonPoints = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();double chuangkuan_danbian = 800;//图纸显示为935mmdouble top_left[num_points][3] = {{ 100, -1 * chuangkuan_danbian, 0 },{ 2360, -1 * chuangkuan_danbian, 0 },{ 2360, chuangkuan_danbian, 0 },{ 100, chuangkuan_danbian, 0 },};double ChangHight = 851;// 几何数据 + 拓扑数据polygonPoints->SetNumberOfPoints(num_points);polygon->GetPointIds()->SetNumberOfIds(num_points);for (int i = 0; i < num_points; ++i){polygonPoints->SetPoint(i, top_left[i]);polygon->GetPointIds()->SetId(i, i);}polygonGrid->InsertNextCell(polygon->GetCellType(), polygon->GetPointIds());polygonGrid->SetPoints(polygonPoints);vtkNew<vtkDataSetSurfaceFilter> surface_filter;surface_filter->SetInputData(polygonGrid);surface_filter->Update();vtkNew<vtkTriangleFilter> filter;filter->SetInputData(surface_filter->GetOutput());filter->Update();// Apply linear extrusion(对平面进行拉伸成3D)m_extrude_chuang->SetInputConnection(filter->GetOutputPort());m_extrude_chuang->SetExtrusionTypeToNormalExtrusion();m_extrude_chuang->SetVector(0, 0, 1);// 沿文字方向挤压,沿着z向上m_extrude_chuang->SetScaleFactor(ChangHight);// 设置挤压比例 //blog.csdn.net/wanyongtai/article/details/106490653m_extrude_chuang->Update();}vtkSmartPointer<vtkDataSetMapper> polygonMappersheyuan = vtkSmartPointer<vtkDataSetMapper>::New();polygonMappersheyuan->SetInputConnection(m_extrude_sheyuan->GetOutputPort());vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();coneActor->SetMapper(polygonMappersheyuan);vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();polygonMapper->SetInputConnection(m_extrude_chuang->GetOutputPort());vtkSmartPointer<vtkActor> coneActor2 = vtkSmartPointer<vtkActor>::New();coneActor2->SetMapper(polygonMapper);vtkSmartPointer<vtkPoints> pointsInside = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkPolyData> polyDataInside = vtkSmartPointer<vtkPolyData>::New();double point[3];vtkSmartPointer<vtkDelaunay3D> delaunay3D = vtkSmartPointer<vtkDelaunay3D>::New();delaunay3D->SetInputConnection(m_extrude_chuang->GetOutputPort());delaunay3D->Update();for (vtkIdType i = 0; i < m_extrude_chuang->GetOutput()->GetNumberOfPoints(); i++){m_extrude_chuang->GetOutput()->GetPoint(i, point);double pcoords[3];// The number of weights >= max number of nodes in each celldouble weights[4];int subId;vtkIdType cellId = delaunay3D->GetOutput()->FindCell(point, NULL, 0, .1, subId, pcoords, weights);if (cellId >= 0){std::cout << "In cell " << cellId << std::endl;std::cout << "inside" << std::endl;pointsInside->InsertNextPoint(point);}else{std::cout << "outside" << std::endl;}}polyDataInside->SetPoints(pointsInside);vtkSmartPointer<vtkVertexGlyphFilter> vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
#if VTK_MAJOR_VERSION <= 5vertexGlyphFilter->SetInputConnection(polyDataInside->GetProducerPort());
#elsevertexGlyphFilter->SetInputData(polyDataInside);
#endifvertexGlyphFilter->Update();// Mapper and actor for points insidevtkSmartPointer<vtkPolyDataMapper> pointsInsideMapper = vtkSmartPointer<vtkPolyDataMapper>::New();pointsInsideMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());vtkSmartPointer<vtkActor> pointsInsideActor = vtkSmartPointer<vtkActor>::New();pointsInsideActor->SetMapper(pointsInsideMapper);pointsInsideActor->GetProperty()->SetPointSize(6);pointsInsideActor->GetProperty()->SetColor(1, 0, 1);vtkRenderer *ren1 = vtkRenderer::New();ren1->SetBackground(0.1, 0.2, 0.4);// Finally we create the render window which will show up on the screen.// We put our renderer into the render window using AddRenderer. We also// set the size to be 300 pixels by 300.//vtkRenderWindow *renWin = vtkRenderWindow::New();renWin->AddRenderer(ren1);renWin->SetSize(900, 800);vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();iren->SetRenderWindow(renWin);vtkSmartPointer<StyleTrackballActor> style = vtkSmartPointer <StyleTrackballActor>::New();style->SetDefaultRenderer(ren1);style->ActorA = coneActor;style->ActorB = coneActor2;//vtkOBBTree * clipTree = vtkOBBTree::New();//vtkOBBTree * targetTree = vtkOBBTree::New();//targetTree->SetDataSet(targetPoly);//targetTree->BuildLocator(); //clipTree->SetDataSet(clipPoly);//clipTree->BuildLocator();使用包围盒求交 ,求交部分在OBBNodeIntersected中。NULL表示不做任何转换//clipTree->IntersectWithOBBTree(targetTree, NULL, OBBNodeIntersected, this);iren->SetInteractorStyle(style);ren1->AddActor(coneActor);ren1->AddActor(coneActor2);//ren1->AddActor(Actor1);//ren1->AddActor(Actor2);iren->Initialize();iren->Start();return 0;
} //blog.csdn.net/q610098308/article/details/108093627

效果

(05)vtk通过多边形构建矩形,并拉伸成立方体,两个立方体独立操作相关推荐

  1. Elementor入门 [05] 在 Elementor 中构建主页

    [05] 在 Elementor 中构建主页 文章来源 https://wpeyes.com 在上一课中,我们自定义了设置并构建了我们网站的布局.现在有趣的是:我们已准备好开始使用 Elementor ...

  2. VTK:多边形曲面等高线插值用法实战

    VTK:多边形曲面等高线插值用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCamera.h> ...

  3. java判断线与矩形相交_判断任意多边形与矩形的相交(线段与矩形相交或线段与线段相交)...

    任意多边形与矩形的相交,其实就是判断多条线段是否与这个矩形相交,再简单点就是判断线段是否与矩形的每一条边相交了.那现在,我们先来看看判断一条线段与矩形的其中一条线段的相交的情况(上方水平线): (图形 ...

  4. opencv 绘制轮廓边框 多边形 圆形 矩形

    如何使用opencv 绘制轮廓边框最小包裹 多边形 圆形 矩形? 函数说明: Rect boundingRect(InputArray points) points:输入信息,可以为包含点的容器(ve ...

  5. SVG、canvas、绘制线段和填充多边形、矩形、曲线的绘制和填充

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 1.了解网页中的两个绘图技术 (1)SVG (2)canvas (3)画布的尺寸和坐标 2.绘制线段和填充多 ...

  6. opencv-python-仿射变换-图片拉伸成平行四边形

    将图片拉伸成类似平行四边形这样 直接上效果图 先不着急上代码, 如果你遇到opencv报以下错误的话, cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\Ap ...

  7. 将矩形图片绘制成圆形图片

    这周的安卓作业要做一个音乐播放器, 而图片那块需要添加音乐的封面, 获取到的封面为矩形图片, 如果要像网易云一样做一个唱片风格的封面需要将矩形图片绘制成圆形图片, 在StackOverflow上查找得 ...

  8. C++设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,根据坐标能计算矩形的面积。

    C++设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,根据坐标能计算矩形的面积. 注:该题是今日做题时所遇. 要求: [输入形式] 程序参考的输入(提示&quo ...

  9. AE 超人飞天特效 地面震裂崩飞效果 。SU 可以快速建立模型。室内室外。通过将CAD 的图拖拽 拉伸成面

    今天完成 工资结算发放. 继续TX PDF AE 超人飞天特效  地面震裂崩飞效果 人中枪弹爆头效果 需要相关素材, 比如地面震裂 崩飞 的素材 枪弹 的血液飞溅的素材等 跟踪,动态模糊,快速模糊, ...

最新文章

  1. 堪称下一场工业革命 一张图看懂物联网
  2. 开源工程师:Ubuntu 应该抛弃 32 位 ISO 镜像
  3. 二、1、怎么做都好做,没flag就抓包
  4. ligerui tree mysql_LigerUi中下拉框一级树tree数据库读取代码示例!
  5. idea右键项目没有git 【解决方法】
  6. python can i use return in wiht statement?
  7. 尾气冒黑烟是什么问题_烟囱里冒得白烟、黑烟、黄烟有什么危害?
  8. ubuntu 下更新pip后发生 ImportError: cannot import name 'main'的问题解决
  9. 2017 ACM-ICPC乌鲁木齐网络赛 B. Out-out-control cars(几何)
  10. java 认证 种类_java认证:JavaSocket编程的一个秘密类
  11. 打包签名用 文件配置遇到的坑(Keystore was tampered with, or password was incorrect)
  12. Uncaught TypeError: Cannot read property ‘dispatch‘ of undefined
  13. Windows 10版本business_editions和consumer_editions的区别
  14. final review 报告
  15. 【揭秘】1024特企- 前端仔微信里都藏着什么
  16. oracle通过UTL_SMTP包发送邮件
  17. Android UI 组件开源软件(一)
  18. 后端分页查询(模糊查询)
  19. 哪些是当你成为老板才知道的道理?
  20. Qt:去掉Qt加载png图像文件时候的iccp警告

热门文章

  1. python机器学习库sklearn——参数优化(网格搜索GridSearchCV、随机搜索RandomizedSearchCV、hyperopt)
  2. c#读取图片成rgb二维数组
  3. 【python基础语法】列表的查询操作(包括切片)
  4. html5 video标签兼容性与自定义控件
  5. [转载] python3 安装完Pycurl在import pycurl时报错
  6. [转载] python解析返回结果_python:解析requests返回的response(json格式)说明
  7. 设计方案--移动端延迟300ms的原因以及解决方案
  8. zabbix监控某个进程个数时产生的issue
  9. 【C++】C++为什么要引入引用这个复合类型?
  10. POJ 2886 Who Gets the Most Candies?