OpenSceneGraph in ActiveX by ActiveQt

简介: OpenSceneGraph in ActiveX by ActiveQt eryar@163.com Abstract. Qt’s ActiveX and COM support allows Qt for Windows developers to access and use Activ...

OpenSceneGraph in ActiveX by ActiveQt

eryar@163.com

Abstract. Qt’s ActiveX and COM support allows Qt for Windows developers to access and use ActiveX controls and COM objects provided by any ActiveX server in their Qt applications. Make their Qt application available as COM servers, with any number of Qt objects and widgets as COM objects and ActiveX controls. Make OpenSceneGraph to ActiveX controls then you can use it in other place, like IE.

Key Words. OpenSceneGraph, ActiveX, COM, ActiveQt

1.Introduction

ActiveX是一个开放的集成平台,为开发人员、用户和Web生产商提供了一个快速而简便的在Internet 和Intranet创建程序集成和内容的方法。使用AcitveX可以轻松方便地在Web页面中插入多媒体效果、交互式对象及复杂程序。编写的ActiveX控件可以在不同的程序上运行,如Internet Explorer, Visual Basic, MFC- and ATL-based containters等等。

本文尝试使用Qt的ActiveQt模块将OpenSceneGraph封装成ActiveX控件,并在Internet Explorer中显示出三维模型。

2.ActiveQt

习惯了用Qt封装的对象,用着舒服。Qt的Windows商业版本和开源版本都提供了ActiveQt框架,使用这个组件我们可以在Qt中使用ActiveX控件,并且也可以开发基于Qt的ActiveX控件。ActiveQt包含了两个组件QAxContainter和QAxServer:

v QAxContainer允许我们使用COM对象,像使用Excel的COM对象,就可以对Excel进行读写了;

v QAxServer可以将我们写的Qt控件导出为COM对象或者ActiveX控件。

使用ActiveQt来编写ActiveX控件还是要简单很多的。

3.OpenSceneGraph

OpenSceneGraph是对OpenGL面向对象的封装,使用OpenSceneGraph可以方便地对三维场景进行处理,可以用于三维可视化,仿真等领域。因为也是纯C++开发,所以产生了将OpenSceneGraph编写成ActiveX控件的想法,这样就可以在Web上来操作三维场景了。

4.Example

首先在Visual Studio中创建一个ActiveQt Server项目,如下图所示:

wpsDE63.tmp

接下来使用osgQt模块来在Qt中使用OpenSceneGraph,只需要增加一个初始化函数,代码如下所示:

void osgActiveX::init()
{
    osgQt::initQtWindowingSystem();

    myRootNode =  new osg::PositionAttitudeTransform();

    myRootNode->addChild(osgDB::readNodeFile("d:/test.stl"));

    myViewer =  new osgViewer::Viewer();
    myViewer->addEventHandler( new osgGA::StateSetManipulator(myViewer->getCamera()->getOrCreateStateSet()));
    myViewer->addEventHandler( new osgViewer::StatsHandler());
    myViewer->setCameraManipulator( new osgGA::TrackballManipulator());
    myViewer->setSceneData(myRootNode);

    osgQt::setViewer(myViewer);

    myOsgWidget =  new osgQt::GLWidget( this);
    myGraphicsContext =  new osgQt::GraphicsWindowQt(myOsgWidget);

    myViewer->getCamera()->setViewport(0, 0, myOsgWidget->width(), myOsgWidget->height());
    myViewer->getCamera()->setProjectionMatrixAsPerspective( 30.0f, static_cast< double>(myOsgWidget->width())/static_cast< double>(myOsgWidget->height()), 1.0f, 10000.0f );
    myViewer->getCamera()->setGraphicsContext(myGraphicsContext);

    setCentralWidget(myOsgWidget);
}

编译生成一个ActiveX控件后,再写一个HTML文件来测试生成的结果,其中HTML文件中的主要内容如下:

< object  ID ="OsgActiveX"  CLASSID ="CLSID:450B2B35-9AC6-4FCD-A883-2ACF0FA19A16" >
    [Object not available! Did you forget to build and register the server?]
</ object >

其中CLASSID就是用QAXFACTORY_DEFAULT宏定义注册时的GUID。程序运行结果如下图所示:

wpsDE64.tmp

5.Conclusion

使用ActiveQt将OpenSceneGraph封装成ActiveX控件,这样的控件就可以在多个程序中使用,如IE,Visual Basic等等。

等熟练理解ActiveQt后,可以对OSG的ActiveX控件进行扩展,使其有更强大的三维交互功能。

6.References

1. Qt’s ActiveX Framework

2. https://zh.wikipedia.org/wiki/ActiveX

 

目录
相关文章
|
10月前
|
数据采集 人工智能 安全
通过 AI 师傅(AI-Shifu.com)学通义灵码--小白篇
作为一名零编程经验的产品经理,我通过“AI-Shifu”和“通义灵码”体验了编程的乐趣。从安装Python库到完成文档加密与解密、网页爬虫等小实践,每个环节都充满了挑战和成就感。这些工具不仅降低了学习门槛,还激发了我的学习热情,让我对未来教育和产研合作充满期待。
QT+OpenGL 摄像机
OpenGL本身没有摄像机的定义,但是我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉。
352 0
|
Java 测试技术 C++
【JAVA学习之路 | 进阶篇】File类及常用方法
【JAVA学习之路 | 进阶篇】File类及常用方法
|
JavaScript 前端开发
如何在vue项目中优雅地使用SVG
如何在vue项目中优雅地使用SVG
368 1
|
存储
使用SwiftUI搭建一个风筝摇摆动画,实现放风筝的梦想~
在本章中,你将学会使用SwiftUI创建一个风筝摇摆动画。
485 0
使用SwiftUI搭建一个风筝摇摆动画,实现放风筝的梦想~
|
存储 算法
递归算法设计技术
实验目的 实验内容 实验过程 程序清单 复杂度分析 运行结果
178 0
|
JavaScript 前端开发
JavaScript——防抖&节流
防抖和节流是防止高频率触发的事件
195 0
|
中间件
node-08-转发请求-中间件
1.客户端直接写 网易或者天气等第三方接口会报跨域 2.所以需要客户端向服务端发请求,来获取数据 3. 服务端根据客户端的请求去获取天气,新闻,等接口 然后把数据给客户端
215 16
|
JavaScript
【mpvue】radio-group 标签组设置默认选择checked: 'true',选择了单选按钮的非默认选项,再点击其他的选择,单选按钮又会变成默认的选项
1、问题举例描述: radio-group 标签组设置默认选择checked: ‘true’,选择了单选按钮的非默认选项(场外),再点击其他的选择(手续费率),单选按钮又会变成默认的选项(场内) 默认状态如下:
630 0
【mpvue】radio-group 标签组设置默认选择checked: 'true',选择了单选按钮的非默认选项,再点击其他的选择,单选按钮又会变成默认的选项
|
存储 缓存 前端开发
微服务与领域驱动设计,架构实践总结
如果软件系统存在持续的迭代周期,那么其中业务、技术、架构的复杂性都会直线拉升,其相应的开发难度也会提高,随之而来的压力会持续在开发和测试之间来回横跳。
514 0
微服务与领域驱动设计,架构实践总结