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实现三维模型的拖动相关推荐

  1. Altium Designer初学者入门——stm32最小系统的PCB图(接上一篇原理图绘制)

    文章目录 一.PCB封装库 二.从原理图导入到PCB图 三.布局 四.布线 五.覆铜 六.丝印整理 七.电气规则检查 一.PCB封装库 PCB封装库相对原理图库的创建要更麻烦一些,我本人是安装的网上找 ...

  2. python机械臂仿真_VTK与Python实现机械臂三维模型可视化详解

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...

  3. Cesium中级教程6 - 3D Models 三维模型

    3D Models 三维模型 本教程将教您如何通过Primitive API转换.加载和使用Cesium中的三维模型.如果你是Cesium的新用户,可能需要阅读三维模型部分的(空间数据可视化教程)[h ...

  4. 【Unity】3.1 利用内置的3D对象创建三维模型

    分类:Unity.C#.VS2015 创建日期:2016-04-02 一.基本概念 Unity已经内置了一些基本的3D对象,利用这些内置的3D对象就可以直接构建出各种3D模型(当然,复杂的三维模型还需 ...

  5. OpenGL三维模型+常见错误

    项目文件资源链接//download.csdn.net/download/H200102/12101806 一.OpenGL导入三维模型 1.期末的图形学作业要做三维机器人,要求:可以转换视角:光照: ...

  6. 如何用MATLAB生成三维模型并导入PPT

    大家好这里是由于隔壁小区阳了三个而被封控在家的陈同学.今天这篇鸽了两周多的文章会给出一种将MATLAB绘制的三维图像导入PPT的思路,就像下面这样. ------------------CSDN貌似插 ...

  7. 计算机图形学 实验二 三维模型读取与控制【OpenGL】

    文章目录 实验2.1 OpenGL的控制与交互方式 一. 实验目的 二. 理论背景 三. 实验内容 1. 创建基本工程项目 2. 在子窗口中绘制图形 3. 在子窗口中通过键盘事件更换椭圆形状颜色 4. ...

  8. FCPX插件直接导入OBJ三维模型FCPX3D MODEL

    FCPX3D MODEL for Mac是一款由Pixel Film Studios公司出品的直接导入OBJ三维模型fcpx插件,FCPX3D Model插件允许Final Cut Pro X用户在F ...

  9. Altium Designer三维模型的应用

    Altium Designer的PCB制作,具有丰富的三维功能,可以直观的观察板子中各种器件的相互排布状态,防止产生相互干扰,同时能够将完成制作的PCB输出三维模型,用于Solidworks等三维建模 ...

最新文章

  1. HMM(隐马尔科夫)用于中文分词
  2. 附庸风雅(2006-10-20 13:39:32)(新浪)
  3. tomcat 随windows启动
  4. 汇编学习心得(二)关于字符的处理
  5. c语言知道坐标求线段长度,C语言编写程序:输入任意3线段的长度,判断组成三角形的种类...
  6. c语言选择夹答案,单片机串口通讯制作说明
  7. ios macos_设计师可以从iOS 14和macOS Big Sur中学到什么?
  8. linux兴趣小组2017面试题浅析
  9. mkisofs(genisoimage) 命令说明
  10. 牛客网—12.链表练习python解答
  11. 基于vue+node的校园交流平台
  12. Js时间相关处理函数
  13. CS231n-assignment1详解
  14. EDI X12 标准报文清单
  15. 盘点AI国际顶级会议
  16. DARPA到底是什么?一个能轻松将人类变成电子生化人的科技
  17. Python调用腾讯API实现人脸检测
  18. SCC算法求强连通分量简单讲解证明及实现
  19. 【记录】数字逻辑知识点总结
  20. 两个步骤解决 SQL Server 登录报错 通过端口 1433 连接到主机 的 TCP/IP 连接失败。 错误:“connect timed out”

热门文章

  1. PCB钻孔工艺故障及解决办法
  2. 市场占有率仅为2%,华为“寒冬”突围失败?美媒:是我们低估了
  3. android小助手,Gifty编辑小助手
  4. 图算法—Problem J
  5. android oncreate调用,Android app启动activity并调用onCreate()方法时都默默地干了什么?...
  6. U3D 2020 AssetStort(资源商店)项目导入
  7. 如何办好每周技术周刊?
  8. 我的周刊(第037期)
  9. matplotlib实现按钮以及鼠标响应事件
  10. 如何设置Minecraft,以便您的孩子可以和朋友一起在线玩