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等三维建模 ...
最新文章
- HMM(隐马尔科夫)用于中文分词
- 附庸风雅(2006-10-20 13:39:32)(新浪)
- tomcat 随windows启动
- 汇编学习心得(二)关于字符的处理
- c语言知道坐标求线段长度,C语言编写程序:输入任意3线段的长度,判断组成三角形的种类...
- c语言选择夹答案,单片机串口通讯制作说明
- ios macos_设计师可以从iOS 14和macOS Big Sur中学到什么?
- linux兴趣小组2017面试题浅析
- mkisofs(genisoimage) 命令说明
- 牛客网—12.链表练习python解答
- 基于vue+node的校园交流平台
- Js时间相关处理函数
- CS231n-assignment1详解
- EDI X12 标准报文清单
- 盘点AI国际顶级会议
- DARPA到底是什么?一个能轻松将人类变成电子生化人的科技
- Python调用腾讯API实现人脸检测
- SCC算法求强连通分量简单讲解证明及实现
- 【记录】数字逻辑知识点总结
- 两个步骤解决 SQL Server 登录报错 通过端口 1433 连接到主机 的 TCP/IP 连接失败。 错误:“connect timed out”
热门文章
- PCB钻孔工艺故障及解决办法
- 市场占有率仅为2%,华为“寒冬”突围失败?美媒:是我们低估了
- android小助手,Gifty编辑小助手
- 图算法—Problem J
- android oncreate调用,Android app启动activity并调用onCreate()方法时都默默地干了什么?...
- U3D 2020 AssetStort(资源商店)项目导入
- 如何办好每周技术周刊?
- 我的周刊(第037期)
- matplotlib实现按钮以及鼠标响应事件
- 如何设置Minecraft,以便您的孩子可以和朋友一起在线玩