OpenSceneGraph in ActiveX by ActiveQt

OpenSceneGraph in ActiveX by ActiveQt

eryar@163.comhtml

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.app

Key Words. OpenSceneGraph, ActiveX, COM, ActiveQt框架

1.Introductionide

ActiveX是一個開放的集成平臺,爲開發人員、用戶和Web生產商提供了一個快速而簡便的在Internet 和Intranet建立程序集成和內容的方法。使用AcitveX能夠輕鬆方便地在Web頁面中插入多媒體效果、交互式對象及複雜程序。編寫的ActiveX控件能夠在不一樣的程序上運行,如Internet Explorer, Visual Basic, MFC- and ATL-based containters等等。函數

本文嘗試使用Qt的ActiveQt模塊將OpenSceneGraph封裝成ActiveX控件,並在Internet Explorer中顯示出三維模型。測試

2.ActiveQtui

習慣了用Qt封裝的對象,用着舒服。Qt的Windows商業版本和開源版本都提供了ActiveQt框架,使用這個組件咱們能夠在Qt中使用ActiveX控件,而且也能夠開發基於Qt的ActiveX控件。ActiveQt包含了兩個組件QAxContainter和QAxServer:this

v QAxContainer容許咱們使用COM對象,像使用Excel的COM對象,就能夠對Excel進行讀寫了;spa

v QAxServer能夠將咱們寫的Qt控件導出爲COM對象或者ActiveX控件。3d

使用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

 

相關文章
相關標籤/搜索