OpenInventor实现三维模型的拖动
OpenInventor是SGI公司开发的基于OpenGL的面向对象三维图形软件开发包。这里不多说,相必点击进来看的都是了解的。
本文主要介绍如何实现三维模型的拖动。本文中的模型是wrl格式的模型文件,通过SoVRMLGroup类进行读取,很多三维设计软件,比如SolidWorks,catia等都可以另存为该格式的文件。当然了,也可以是由open Inventor自带的内建的模型,比如SoCylinder,SoCone等之类的。
初始化:
this->selection = new SoSelection;
this->root = new SoSeparator;
root->ref();
selection->addChild(root);
searcher = new SoSearchAction;selection->addSelectionCallback(selectionCB, this);
selection->addDeselectionCallback(deselectionCB, this);myViewer = new SoQtExaminerViewer(ui.widget);
myViewer->setSceneGraph(selection);
myViewer->setBackgroundColor(SbColor(0.7,0.6,0.92));
myViewer->viewAll();
myViewer->show();
打开模型文件,并加入到场景中
void Select_Drag::openModel()
{SoSeparator *tmpRoot = new SoSeparator;tmpRoot->ref();tmpRoot->setName("Root_tmp");SoTransform *tmpTrans = new SoTransform;tmpTrans->setName("Trans");tmpRoot->addChild(tmpTrans);QString filename = QFileDialog::getOpenFileName(this,"Open VRML file","/","VRML files(*.wrl)");if(filename != NULL){SoInput myInput;if(!myInput.openFile(filename.toStdString().data())){qDebug()<<"file read failed!";return;}SoVRMLGroup *objectModel = SoDB::readAllVRML(&myInput);objectModel->setName("VRMLModel");tmpRoot->addChild(objectModel);root->addChild(tmpRoot);myViewer->viewAll();}
}
关键部分代码
void Select_Drag::deselectionCB(void * userdata, SoPath * deselection)
{ isDragged = false;Select_Drag *s = (Select_Drag *)userdata;SoPath * transform = s->findRelatedTransform(s,deselection); assert(transform != NULL); SoTransformManip * manip = (SoTransformManip *) transform->getTail();SoTransform *tmpTrans = new SoTransform;SbVec3f pos = manip->translation.getValue(); tmpTrans->translation.setValue(pos[0],pos[1],pos[2]);manip->replaceManip(transform, tmpTrans); qDebug()<<pos[0]*1000<<" "<<pos[1]*1000<<" "<<pos[2]*1000<<"\n";
}void Select_Drag::selectionCB(void * userdata, SoPath * selection)
{ Select_Drag *s = (Select_Drag *)userdata;SoPath * transform = s->findRelatedTransform(s,selection); assert(transform != NULL); SoTransformBoxManip * manip = new SoTransformBoxManip;manip->replaceNode(transform);///增加传感器节点,实时感知模型位姿变化SoFieldSensor *mySensor = new SoFieldSensor(positionChangedCB,manip);mySensor->attach(&manip->translation);SoFieldSensor *mySensor2 = new SoFieldSensor(rotationChangedCB,manip);mySensor2->attach(&manip->rotation); isDragged = true;s->timer->start();
}SoPath *Select_Drag::findRelatedTransform(void* userdata,SoPath * pathtocube)
{ Select_Drag *s = (Select_Drag *)userdata;SoSearchAction *sear = s->searcher;sear->reset(); sear->setInterest(SoSearchAction::LAST); sear->setType(SoTransform::getClassTypeId()); sear->apply(pathtocube); return sear->getPath();
}
欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot
欢迎关注Jungle的微信公众号:Jungle笔记
OpenInventor实现三维模型的拖动相关推荐
- Altium Designer初学者入门——stm32最小系统的PCB图(接上一篇原理图绘制)
文章目录 一.PCB封装库 二.从原理图导入到PCB图 三.布局 四.布线 五.覆铜 六.丝印整理 七.电气规则检查 一.PCB封装库 PCB封装库相对原理图库的创建要更麻烦一些,我本人是安装的网上找 ...
- python机械臂仿真_VTK与Python实现机械臂三维模型可视化详解
三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...
- Cesium中级教程6 - 3D Models 三维模型
3D Models 三维模型 本教程将教您如何通过Primitive API转换.加载和使用Cesium中的三维模型.如果你是Cesium的新用户,可能需要阅读三维模型部分的(空间数据可视化教程)[h ...
- 【Unity】3.1 利用内置的3D对象创建三维模型
分类:Unity.C#.VS2015 创建日期:2016-04-02 一.基本概念 Unity已经内置了一些基本的3D对象,利用这些内置的3D对象就可以直接构建出各种3D模型(当然,复杂的三维模型还需 ...
- OpenGL三维模型+常见错误
项目文件资源链接//download.csdn.net/download/H200102/12101806 一.OpenGL导入三维模型 1.期末的图形学作业要做三维机器人,要求:可以转换视角:光照: ...
- 如何用MATLAB生成三维模型并导入PPT
大家好这里是由于隔壁小区阳了三个而被封控在家的陈同学.今天这篇鸽了两周多的文章会给出一种将MATLAB绘制的三维图像导入PPT的思路,就像下面这样. ------------------CSDN貌似插 ...
- 计算机图形学 实验二 三维模型读取与控制【OpenGL】
文章目录 实验2.1 OpenGL的控制与交互方式 一. 实验目的 二. 理论背景 三. 实验内容 1. 创建基本工程项目 2. 在子窗口中绘制图形 3. 在子窗口中通过键盘事件更换椭圆形状颜色 4. ...
- FCPX插件直接导入OBJ三维模型FCPX3D MODEL
FCPX3D MODEL for Mac是一款由Pixel Film Studios公司出品的直接导入OBJ三维模型fcpx插件,FCPX3D Model插件允许Final Cut Pro X用户在F ...
- Altium Designer三维模型的应用
Altium Designer的PCB制作,具有丰富的三维功能,可以直观的观察板子中各种器件的相互排布状态,防止产生相互干扰,同时能够将完成制作的PCB输出三维模型,用于Solidworks等三维建模 ...
最新文章
- 浅谈Java中的Set、List、Map的区别
- mysql驱动为什么自动加载_为什么JDBC中加载驱动要使用反射?
- cmake 找不到 macros_愿我们在彼此看不到的岁月里熠熠生辉
- linux上mongodb的安装与卸载
- TensorFlow笔记(11) GoolgeNet
- 微软高性能计算服务器pdf,微软高性能计算HPCserver2008技术概览.pdf
- 你知道几句?Linux之父十大名言
- 性能之巅:Linux网络性能分析工具
- BGP-13 配置BGP多路径发布
- 小程序授权登录的体验优化
- Android—构建安全的Android客户端请求,避免非法请求
- mac电脑循环次数多少算新_在Mac上处理不同事务,这些软件必不可少,个个精品...
- sketch插件 android,设计师必备的SKetch插件合集
- numpy.loadtxt() 处理csv文件的正确姿势
- 各国商圈json数据及mysql文件
- “药药切克闹”系列-基于STM32触摸屏的超级无敌智能电子密码锁(仿手机键盘26键设计,密码支持英文大写+英文小写+数字)
- 2014年网研上机题目
- 洛谷 P1914.小书童——密码
- 一个外语达人的经验(转自天涯)
- 高频电子线路 高频功率放大器