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. 浅谈Java中的Set、List、Map的区别
  2. mysql驱动为什么自动加载_为什么JDBC中加载驱动要使用反射?
  3. cmake 找不到 macros_愿我们在彼此看不到的岁月里熠熠生辉
  4. linux上mongodb的安装与卸载
  5. TensorFlow笔记(11) GoolgeNet
  6. 微软高性能计算服务器pdf,微软高性能计算HPCserver2008技术概览.pdf
  7. 你知道几句?Linux之父十大名言
  8. 性能之巅:Linux网络性能分析工具
  9. BGP-13 配置BGP多路径发布
  10. 小程序授权登录的体验优化
  11. Android—构建安全的Android客户端请求,避免非法请求
  12. mac电脑循环次数多少算新_在Mac上处理不同事务,这些软件必不可少,个个精品...
  13. sketch插件 android,设计师必备的SKetch插件合集
  14. numpy.loadtxt() 处理csv文件的正确姿势
  15. 各国商圈json数据及mysql文件
  16. “药药切克闹”系列-基于STM32触摸屏的超级无敌智能电子密码锁(仿手机键盘26键设计,密码支持英文大写+英文小写+数字)
  17. 2014年网研上机题目
  18. 洛谷 P1914.小书童——密码
  19. 一个外语达人的经验(转自天涯)
  20. 高频电子线路 高频功率放大器

热门文章

  1. 最新报告,华为第一!
  2. hdu 2058 解题报告 - The sum problem
  3. java中三角形面积和周长_java实现三角形面积和周长的计算
  4. 如何制作一个简单的短视频 app
  5. 什么让人快乐?美最新研究显示惊人答案
  6. 通过 Java 代码获取 JVM 参数
  7. php日志使用monolog
  8. python绘图教程_Python绘图教程
  9. 【动态规划】Problem 4 聪明伶俐的香穗子
  10. vue之 watch 监听数据变化 watch的使用、watch监听数据加载完成后执行、watch不触发、不生效的解决办法及原理