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

 

目录
相关文章
|
C# 前端开发
WPF - 图形设计器(Diagram Designer)
原文:WPF - 图形设计器(Diagram Designer)   OpenExpressApp计划中包括建模工具,计划是采用MetaEdit+模型来作为元模型,使用codeproject的《WPF Diagram Designer》一系列文章来做为设计器实现参考,本篇介绍一下codeprojcet的这四个文章,推荐给对图形设计器感兴趣的人去看看,通过WPF的模板功能和其他功能可以很方便的设计出图形编辑器。
3348 0
|
C#
用Microsoft.Solver.Foundation进行线性规划,为WPF应用添加智能
原文:用Microsoft.Solver.Foundation进行线性规划,为WPF应用添加智能   在管理信息系统的开发过程中,往往会涉及到一些线性规划数学模型,例如资源配置优化。微软的Microsoft.Solver.Foundation是一个数学库,可以很好的对线性规划问题进行求解。
1371 0
|
Windows
Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷)
原文 Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷) Windows 10 Fall Creators Update(Build 16299)添加了acrylic brush,这是一个类似于Windows 7 Aero效果的UI画笔。
1398 0
|
C#
如何将Skyline66嵌入WPF中
1.新建WPF项目; 2.添加引用 .net引用:System.Windows.Forms和WindowsFormsIntegration skyline引用:AxInterop.TerraExplorerX和TerraExplorerX 3.
1156 0
|
C# Shell 前端开发
从PRISM开始学WPF(九)交互Interaction?
原文:从PRISM开始学WPF(九)交互Interaction? 0x07交互 这是这个系列的最后一篇了,主要介绍了Prism中为我们提供几种弹窗交互的方式。 Notification通知式 Prism通过InteractionRequest 来实现弹窗交互,它是一个泛型接口,不同的类型对应不同类型的弹窗方式。
1066 0