VTK实现三视图显示及交互STL模型

2024-05-29 17:12

本文主要是介绍VTK实现三视图显示及交互STL模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VTK实现STL模型的三视图显示及交互

最近收到需求,要实现多视图显示同一个STL模型,并且控制主窗口要其他试图窗口也跟着交互,花了点时间去尝试一下,把这个效果给实现出来了,而且实现也挺简单。


效果演示

在这里插入图片描述


要点

  1. 用同一个vtkRenderer传三次给vtkRenderWindow是不行的,要创建三个vtkRenderer来显示用一个vtkActor,分别传给vtkRenderWindow才行。
  2. 用同一个vtkCamera同时控制三个vtkRenderer是不行的,因为vtkCamera的参数发生改变,会同步影响,要实现不同的视角,还是需要准备三个vtkCamera分别传给三个vtkRenderer。
  3. 既然要实现控制一个主vtkCamera,影响另外两个辅vtkCamera也要同步更新,那最直接的方法就是用回调函数。

代码实现

#include <iostream>
#include <vtkAutoInit.h>
#include <vtkSTLReader.h>
#include <vtkPLYReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkTransform.h>#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCommand.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);class vtkUpdateCamera : public vtkCommand
{
public:static vtkUpdateCamera* New(){return new vtkUpdateCamera;}void Execute(vtkObject* caller, unsigned long vtkNotUsed(event), void* callData){//获取主cameravtkRenderer* renderer = dynamic_cast<vtkRenderer*>(caller);auto camera = renderer->GetActiveCamera();//更新两个辅助camera的参数camera1->SetPosition(camera->GetPosition());camera1->SetFocalPoint(camera->GetFocalPoint());camera1->SetViewUp(camera->GetViewUp());camera1->Azimuth(90);camera1->Modified();//通过调整摄像头的viewup的旋转角度,为辅助摄像头实现上试图,左视图的朝向camera2->SetPosition(camera->GetPosition());camera2->SetFocalPoint(camera->GetFocalPoint());double* viewUp = camera->GetViewUp();double* direction = camera->GetDirectionOfProjection();double view[3];vtkMath::Cross(direction, viewUp, view);camera2->SetViewUp(view);camera2->Azimuth(-90);camera2->Modified();}void SetCamera1(vtkCamera* c){camera1 = c;}void SetCamera2(vtkCamera* c){camera2 = c;}private:vtkCamera* camera1;vtkCamera* camera2;
};int main()
{vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();reader->SetFileName("D://Bunny.stl");reader->Update();vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(reader->GetOutput());vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);double* bounds = reader->GetOutput()->GetBounds();vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();camera->SetPosition(0, bounds[2]- 200, 0);camera->SetFocalPoint(reader->GetOutput()->GetCenter());camera->SetViewUp(0, 0, 1);vtkSmartPointer<vtkCamera> camera1 = vtkSmartPointer<vtkCamera>::New();vtkSmartPointer<vtkCamera> camera2 = vtkSmartPointer<vtkCamera>::New();//为主渲染器准备更新摄像头的回调函数vtkSmartPointer<vtkUpdateCamera> callback = vtkSmartPointer<vtkUpdateCamera>::New();callback->SetCamera1(camera1);callback->SetCamera2(camera2);//---------设置主渲染器----------vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->SetActiveCamera(camera);renderer->SetBackground(1, 1, 1);renderer->SetViewport(0, 0, 0.33, 1);//为主渲染器绑定回调函数,使用AnyEvent为了使任何交互都影响两个辅助摄像头renderer->AddObserver(vtkCommand::AnyEvent, callback);//---------设置第一个辅助渲染器----------vtkSmartPointer<vtkRenderer> renderer1 = vtkSmartPointer<vtkRenderer>::New();auto actors = renderer->GetActors();actors->InitTraversal();for (int i = 0; i < actors->GetNumberOfItems(); i++){renderer1->AddActor(actors->GetNextActor());}renderer1->SetActiveCamera(camera1);renderer1->SetViewport(0.33, 0, 0.66, 1);renderer1->SetBackground(1, 1, 1);//---------设置第二个辅助渲染器----------vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New();renderer2->SetActiveCamera(camera2);renderer2->SetViewport(0.66, 0, 1, 1);renderer2->SetBackground(1, 1, 1);actors->InitTraversal();for (int i = 0; i < actors->GetNumberOfItems(); i++){renderer2->AddActor(actors->GetNextActor());}vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);renderWindow->AddRenderer(renderer1);renderWindow->AddRenderer(renderer2);renderWindow->SetSize(1200, 400);vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(renderWindow);rwi->SetInteractorStyle(style);rwi->Start();
}

这篇关于VTK实现三视图显示及交互STL模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014138

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

据阿谱尔APO Research调研显示,2023年全球髓内钉市场销售额约为4.7亿美元

根据阿谱尔 (APO Research)的统计及预测,2023年全球髓内钉市场销售额约为4.7亿美元,预计在2024-2030年预测期内将以超过3.82%的CAGR(年复合增长率)增长。 髓内钉市场是指涉及髓内钉制造、分销和销售的行业。髓内钉是一种用于整形外科手术的医疗器械,用于稳定长骨骨折,特别是股骨、胫骨和肱骨。髓内钉通常由不銹钢或钛等材料制成,并插入骨的髓管中,以在愈合过程中提供结构支

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页: