Implementation Model Editor of AVEVA in OpenSceneGraph

Implementation Model Editor of AVEVA in OpenSceneGraph

eryar@163.com

摘要Abstract:本文主要对厂和海工设计软件AVEVA的交互方式进行详尽介绍,对OpenSceneGraph中的人机交互工具拖拽器进行说明,并当里头落实了范直接互动操作。对彼此建模感兴趣之读者可组成其源代码,对其落实细节进行解析。 

关键字Key Words:AVEVA, Model Editor, OpenSceneGraph, Dragger 

一、引言 Introduction

于现代的老三维辅助设计软件中,交互建模设计既化为主流。友好、高效的针对三维模型直接进行编辑或改,不仅可提高用户之工作效率,还会见吃用户留下美好记忆,即软件可以的用户体验。交互建模的周边方法来:拖曳、约束、栅格捕捉、橡皮筋方法、引力场等,拖曳就是直指向选择的模型在三维空间被拖动来改位置及自由化;约束措施就是以引的时候长约束原则,如不得不沿着某个方向进行拖,软件面临之采用有AutoCAD中的极轴捕捉功能;栅格捕捉也是一律种带约束的拉,即拖的经过被只能沿正交网格中直线的交点拖动;橡皮筋方法要用在绘制二维图形;引力场方法就是如AutoCAD中的磁吸功能。如何统筹很快、友好、方便之用户接口是现阶段诸开体系的厂家和家所联合关切的题目,它的宏图上下可能直接影响用户是否受该出品。 

正文主要针对工厂和海工设计软件AVEVA的交互方式进行详细介绍,对OpenSceneGraph中之人机交互工具拖拽器进行求证,并当里边落实了范直接互动操作。通过序实施,感觉用OpenSceneGraph来拓展编码还是坏舒心的,因为该代码规范,设计充分好。对彼此建模感兴趣的读者可结合其源代码,对该落实细节进行分析。 

亚、模型编辑器Model Editor of AVEVA

AVEVA(原CADCENTRE)是国际名牌的厂子工程信息技术公司,成立于1967年,总部要于英国剑桥;AVEVA所提供的厂子工程一体化解决方案包含了地和海洋石油天然气、电力、石化、化工、核电、造船、环保、造纸、制药、冶金、矿山等大多单行业,同时提供规范工厂工程技术咨询、技术服务同本地化可持续发展的动开发。
AVEVA是当下全球进步极抢之厂子工程信息技术公司有,1996年以英国伦敦上市,2007财年年产值超25亿美元。AVEVA在大地所有逾1600名用户,每天发生跨26,000称工程人员以行使AVEVA的解决方案。AVEVA在世界30差不多独国及地区设有超过50单常驻办事机构,在英国剑桥总部与外研发核心具有超300名叫研究及开发人员,为世界上无限特别之厂工程信息技术研究与付出组织。AVEVA的迅猛前进与该有利易用,良好的互相建模方式划分不起头,本文主要针对该相建模部分开展介绍。 

AVEVA交互建模主要是下模型编辑器Model Editor,使用Model
Editor可以只所以鼠标就得开展建模设计了。编辑选择的范如下图所示: 

ea平台365bet体育在线 1

Figure 2.1 Model Editor on a Equipment 

采用的Handle可以针对范多种艺术的编排,如轴向活动、平面移动、旋转等,如下图所示: 

ea平台365bet体育在线 2

Figure 2.2 Locator Handle of Model Editor 

2.1 移动 Movement

针对选择的型进行轴向运动还是平面移动时,可以使Model Editor的Linear and
Planar
handles。沿轴向或锁定于某某平面及拖动模型,即可以运动模型。移动是仍一定之尺寸递增的,可由活动增量(the
Movement
Increment)来安装,这样来保证拖动模型相对启位置的精度。选中handle上有轴,就好顺着这轴的趋势来移动模型,如下图所示: 

ea平台365bet体育在线 3

Figure 2.3 Linear Movement 

入选并拖动Model
Editor的平面移动handle,就可当锁定的面及动模型,如下图所示: 

ea平台365bet体育在线 4

Figure 2.4 Planar Movement 

2.2 旋转 Rotation

转是经过Model Editor的Rotation
handle来成功的。旋转是据自然的角度来递增的,可由于旋增量(the Rotation
Increment)来设置。这样就保证了盘相对于始位置的精度。选中并拖动Rotation
handle,就可以本着范进行盘了,如下图所示: 

ea平台365bet体育在线 5

Figure 2.5 Rotation 

ea平台365bet体育在线 6
ea平台365bet体育在线 7

Figure 2.6 Use Model Editor to Modify a Valve 

互建模时使用Model
Editor如齐图2.6所著,由图克,在AVEVA中针对范的运动与转非常便利。 

2.3 对齐 Alignment

通过对齐功能,可以方便地以模型对齐到点、边或冲,如下图所示: 

ea平台365bet体育在线 8

Figure 2.7 Alignment features 

经上文对AVEVA中之Model
Editor的介绍能够,在AVEVA中三维交互建模很便利,且精度高。纵观国内当下看似产品,有些还待于二维建模方式,有些依赖其他平台的相互方式,但是以易用性上发还稍有欠缺,或从不独立的文化产权。 

三、拖拽器Dragger of OpenSceneGraph

1997年,一个名Don Burns的软件工程师受雇为当下之Silicon
Graphics(SGI)公司,负责对滑翔机飞行的虚构仿真工作展开研讨。他运用这底OpenGL
Performer系统,设计了一如既往法广受好评的滑翔仿真软件,并初步尝试在Linux中使Mesa3D和3dfx
Voodoo显卡设备继续到自己的虚软件。 

1998年,Don在一个滑翔爱好者的邮件组中遇到了Robert
Osfield,也尽管是时OpenSceneGraph项目之根本领导者。当时Robert在苏格兰的油气企业做事,但针对计算机图形学和可视化技术具有深厚的趣味。志趣相投的点滴单人口挪动及了一块,开始合作对Don的虚伪软件拓展改善。Robert建议将SG作为单身的开源场景图形项目持续支付,并出于自己充当项目基本,项目的称变更呢OpenSceneGraph,简称OSG。 

现今,相当一部分胜性能的软件都用了OSG来完成复杂现象的渲染工作。大部分基于OSG的软件开发更适用于可视化设计以及工业仿真,包括地理信息体系(GIS)、计算机辅助设计(CAD)、建模和数字媒体做(DCC)及数据库开发、虚拟现实、动画、游戏跟娱乐业等。 

OpenSceneGraph引擎由同样多元图片学相关的功能模块组成,主要也图形图像应用程序的付出提供场景管理及图表渲染优化的效益。它以可移栽的ANSI
C++编写,并运用已成工业标准的OpenGL底层渲染API。OSG具备跨平台的风味,可以运作在大多数项目的操作系统及,并下抽象层的定义,使OSG的函数接口可以独立为用户的本地操作系统使用。OSG遵循开源商谈发布,其用户许可办法是一律种植修改过的GNU宽通用公共许可证(GNU
Lesser General Public License,
LGPL),称为OSGPL。OSG主要持有以下优势:快速支付,高格调,高性能,高质量代码,可扩展性,可移植性,低费用,没有文化产权问题,但是OSG目前吗在许多相差,如参考文档较少、代码风格不合并、部分功能的贯彻过于臃肿,无法使为行等,这些还有待更多之开发者和贡献者去发现及全面。 

三维用户交互是同一种植和三维环境本身特性相配合的并行动作,可一旦用户以虚拟场景中获得近的直观感受。三维世界之交互技术相当给一致种植“控制-显示”的映照,用户设备(例如鼠标、键盘、操纵杆等)向网输入控制信息,然后系统于用户输出执行结果。三维交互涉及的天职繁多,包括三维景对象的精选以及操控、三维世界中的领航漫游、改变三维景的状态,乃至时下流行的老三维交互建模等。作为同缓缓周的实时渲染引擎,OSG实现了三维景的出游及形貌被三维对象的操控这点儿种主要的老三维景交互方式,更多之互动动作虽需要我们机关钻研及落实。 

作最主要之老三维空间的人机交互手段有,场景漫游的性状是经持续变动观察者(相机)的岗位、姿态,使其相对世界之考察方位和角度拥有变化,但是世界本身倒无会见发其他改动。无论草木、建筑,还是街道上的万人空巷,构成它们的各级一个终极都无发出其他偏移,如果观察者有朝一日回到原地的语句,他眼中之满还不见面有变动。 

假若于三维体的操控则是别一样种概念,它从不更改观察者的观点和视点,而是基于用户传递的相互事件,对中选的目标进行活动、缩放和转操作,就像是戏来橡皮泥一样。被修葺过的靶子将转移原的形象,换句话说,只要不恢复至操控前之状态,那么不论从什么地方开展考察,这个目标还以保障其说到底之形容。当然,即使操控物体的概念如此,直接改动物体的终端坐标未休还是产生几吃力不捧场,最好之章程是啊而操控的体设置一个矩阵变换的父节点(MatrixTransform),通过改这个父节点的易矩阵的值,进行转移当做操控对象的子节点的表现形式—这便是osgManipulator库中拖拽器(Dragger)的实现方式。OSG内置了几种拖拽器,其操作方式与功力说明如下: 

l
TabPlaneDragger平面拖拽器:其边、顶点上且发拖延拽点,可以拓展有2D平面及的缩放; 

ea平台365bet体育在线 9

Figure 3.1 TabPlaneDragger in OpenSceneGraph 

l
TabPlaneTrackballDragger平面轨迹球拖拽器:顾名思义除了平面拖拽器的功力外,还差不多了单轨迹球拖拽功能; 

ea平台365bet体育在线 10

Figure 3.2 TabPlaneTrackballDragger in OpenSceneGraph 

l TrackballDragger轨迹球拖拽器:即旋转操纵器,没有缩放功能; 

ea平台365bet体育在线 11

Figure 3.3 TrackballDragger in OpenSceneGraph 

l Translate1DDragger一维平移拖拽器:沿一个直线进行拖拽; 

ea平台365bet体育在线 12

Figure 3.4 Translate1DDragger in OpenSceneGraph 

l Translate2DDragger二维平移拖拽器:在有平面及对范进行拖拽; 

ea平台365bet体育在线 13

Figure 3.5 Translate2DDragger in OpenSceneGraph 

l TranslateAxisDragger三维平移拖拽器:可当三独方向直达对范进行拖拽; 

ea平台365bet体育在线 14

Figure 3.6 TranslateAxisDragger in OpenSceneGraph 

l
TabBoxDragger盒式拖拽器:由六只面拖拽器构成,可当相继面上进行缩放、平移; 

ea平台365bet体育在线 15

Figure 3.7 TabBoxDragger in OpenSceneGraph 

尚时有发生任何的拖拽器可以参见其源代码: 

n ScaleAxisDragger:三维缩放拖拽器; 

n Scale2DDragger:二维缩放拖拽器; 

n Scale1DDragger一维缩放拖拽器; 

n RotateSphereDragger:旋转球拖拽器; 

n RotateCylinderDragger旋转圆柱拖拽器; 

是因为下了组合模式(CompositeDragger),可将地方的拖拽器组合成重扑朔迷离的拖拽器。如三维平称拖拽器(TranslateAxisDragger)就是包含了三独一样维拖拽器(Translate1DDragger)的三结合拖拽器。因为程序开源,所以只是根据实际用,将拖拽器进行自定义。即好定义有同AVEVA的Model
Editor完全平等的操纵器。 

季、示例程序 Example Code

而对准气象中之型进行拖拽,首先用以那个当选,然后以当选的范上打开拖拽器,对范的职务及倾向拓展编制。对象的捡主要靠场景图形的交运算来兑现。拖拽器中因故到之一个类PointerInfo表示一个音之成团。例如,使用鼠标选中待操作对象上的之一点,以及当前相机的观测矩阵和投影矩阵等,都需要就反映至者输入参数中,以便拖拽器根据实际状况展开判定连转移命令。下面为起一个运用拖拽器Dragger来操作场景中模型的实际实例,程序代码如下所示: 

1.第一定义了一个拉动拖拽器的节点ModelShape: 

#pragma once

#include <osg/Group>

#include <osgManipulator/Selection>
#include <osgManipulator/CommandManager>
#include <osgManipulator/TrackballDragger>
#include <osgManipulator/TranslateAxisDragger>


class ModelShape : public osg::Group
{
public:
    ModelShape(osg::Node* shape);
    ~ModelShape(void);

    void EnableDragger(void);
    void DisableDragger(void);

private:
    osg::ref_ptr<osg::Node> mShape;
    osg::ref_ptr<osgManipulator::Dragger> mDragger;
    osg::ref_ptr<osgManipulator::Selection> mSelection;
};

好像实现代码如下所示: 

#include "ModelShape.h"

ModelShape::ModelShape(osg::Node* shape)
: mShape(shape)
, mDragger(new osgManipulator::TranslateAxisDragger())
, mSelection(new osgManipulator::Selection())
{
    float scale = shape->getBound().radius() * 1.6;
    mDragger->setMatrix(osg::Matrix::scale(scale, scale, scale) * 
        osg::Matrix::translate(shape->getBound().center()));

    mDragger->setupDefaultGeometry();

    mSelection->addChild(shape);
    addChild(mSelection);
}


ModelShape::~ModelShape(void)
{
}


void ModelShape::EnableDragger()
{
    addChild(mDragger);

    mDragger->addTransformUpdating(mSelection);
    mDragger->setHandleEvents(true);
}


void ModelShape::DisableDragger()
{
    removeChild(mDragger);

    mDragger->removeTransformUpdating(mSelection);
    mDragger->setHandleEvents(false);
}

2.当处理选择事件时,打开拖拽器,实现类似是PickHandler: 

#pragma once

#include <osgGA/GUIEventHandler>


class PickHandler : public osgGA::GUIEventHandler
{
public:
    PickHandler(void);
    ~PickHandler(void);

    virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);

protected:
    void pick(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);

private:
    float mX;
    float mY;
    bool mEnableDragger;
};

类实现代码如下所示: 

#include "PickHandler.h"
#include "ModelShape.h"

#include <osgViewer/Viewer>


PickHandler::PickHandler(void)
: mX(0.0f)
, mY(0.0f)
, mEnableDragger(true)
{

}


PickHandler::~PickHandler(void)
{
}


bool PickHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa)
{
    osgViewer::View* view = dynamic_cast<osgViewer::View*> (&aa);
    if (NULL == view)
    {
        return false;
    }

    switch (ea.getEventType())
    {
    case osgGA::GUIEventAdapter::PUSH:
        {
            mX = ea.getX();
            mY = ea.getY();
        }
        break;

    case osgGA::GUIEventAdapter::RELEASE:
        {
            if (ea.getX() == mX && ea.getY() == mY)
            {
                pick(ea, aa);
            }
        }
        break;

    case osgGA::GUIEventAdapter::KEYDOWN:
        {
            if (ea.getKey() == 'd')
            {
                mEnableDragger = !mEnableDragger;
            }
        }
        break;

    default:
        break;
    }

    return false;
}


void PickHandler::pick(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa)
{
    osgViewer::View* view = dynamic_cast<osgViewer::View*> (&aa); 

    osgUtil::LineSegmentIntersector::Intersections hits;
    if (view->computeIntersections(ea.getX(), ea.getY(), hits))
    {
        osgUtil::LineSegmentIntersector::Intersection intersection = *hits.begin();
        osg::NodePath& nodePath = intersection.nodePath;
        int nNodeSize = static_cast<int> (nodePath.size());

        if (nNodeSize > 0)
        {
            osg::Node* node = nodePath[nNodeSize - 1];
            osg::Node* grandParent = node->getParent(0)->getParent(0);

            // This method maybe not right?
            ModelShape* shape = dynamic_cast<ModelShape*> (grandParent);
            if (shape)
            {
                mEnableDragger ? shape->EnableDragger() : shape->DisableDragger();
            }

        }
    }

}

3.当主函数吃确立场景: 

/*
*    Copyright (c) 2013 eryar All Rights Reserved.
*
*           File : Main.cpp
*         Author : eryar@163.com
*           Date : 2013-12-28 17:00
*        Version : 1.0v
*
*    Description : Use dragger to manipulate shape objects.
*                  press key 'd' for enable or disable the dragger.
*
*      Key Words : OpenSceneGraph, Dragger
*                  
*/

#include <osgDB/ReadFile>
#include <osgGA/StateSetManipulator>

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>


#include "ModelShape.h"
#include "PickHandler.h"


#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgViewerd.lib")
#pragma comment(lib, "osgManipulatord.lib")


int main(void)
{
    osgViewer::Viewer viewer;

    osg::ref_ptr<osg::Group> root = new osg::Group();

    // build the scene with boxes and gliders.
    for (int i = 1; i < 10; ++i)
    {
        for (int j = 1; j < 10; ++j)
        {
            osg::ref_ptr<osg::MatrixTransform> box = new osg::MatrixTransform();
            osg::ref_ptr<osg::MatrixTransform> glider = new osg::MatrixTransform();

            box->setMatrix(osg::Matrix::translate(i * 6.0, j * 6.0, 0.0));
            glider->setMatrix(osg::Matrix::translate(i * 2.5, j * 2.5, 6.0));

            box->addChild(new ModelShape(osgDB::readNodeFile("box.stl")));
            glider->addChild(new ModelShape(osgDB::readNodeFile("glider.osg")));

            root->addChild(box);
            root->addChild(glider);
        }
    }

    viewer.setSceneData(root.get());

    viewer.addEventHandler(new osgViewer::StatsHandler());
    viewer.addEventHandler(new osgViewer::WindowSizeHandler());
    viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));

    // add pick event handler to add dragger on the shape.
    viewer.addEventHandler(new PickHandler());

    return viewer.run();
}

程序用方法也选择而拖拽的模型,选中后呢模型打开拖拽器,使用拖拽器对范进行拖拽就足以改模型ea平台365bet体育在线的职了。在键盘上按照下‘d’可以打开/关闭拖拽器,默认为打开。当装也关门时,再选中带有拖拽器的模子后,将会见倒闭拖拽器。程序运行效果使下图所示: 

ea平台365bet体育在线 16

Figure 3.8  Use TranslateAxisDragger to dragger box 

ea平台365bet体育在线 17

Figure 3.9 Use TranslateAxisDragger to dragger glider 

ea平台365bet体育在线 18

Figure 3.10 Use TranslateAxisDragger in OpenSceneGraph 

五、结论 Conclusion

通过序实施表明,OpenSceneGraph中之人机交互的点子尚是大便利的,并提供了几乎种拖拽器来控制模型。并且拖拽器采用了组合模式,便于扩展,即因用户实际需要整合产生重新复杂或者重复兼具个性之拖拽器。 

由此可见,使用OpenSceneGraph来对范进行展示和操作非常有益,且是开源程序,方便程序调试,还未设有文化产权的题目。因为OpenSceneGraph主要是用以虚拟仿真,还提供了众伪效果,如烟、火焰、粒子效果(雨、雪、爆炸)、动画等,如果当建模设计之经过遭到合适补充加有成效,是未是杀cool? 

六、参考资料 References

  1. AVEVA,Graphical Model Manipulation Guide 

  2. Donald Hearn,M. Pauline Baker,Computer Graphics with
    OpenGL,电子工业出版社 

  3. 何援军,计算机图形学,机械工业出版社 

  4. 王锐,钱学雷,OpenSceneGraph三维渲染引擎计划和执行,清华大学出版社 

5.
肖鹏,刘更代,徐明亮,OpenSceneGraph三维渲染引擎编程指南,清华大学出版社 

 

PDF Version: Implementation Model Editor of AVEVA in
OpenSceneGraph

发表评论

电子邮件地址不会被公开。 必填项已用*标注