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年在U.K.伦敦(London)上市,2007财年年产值抢先25亿日币。AVEVA在全球拥有超过1600名用户,每一天有超越26,000名工程人士在采纳AVEVA的化解方案。AVEVA在世界30多个国家和所在设有超越50个常驻办事机构,在大英帝国澳大利亚国立总部及其它研发要旨具有领先300名琢磨和开发人士,为世界上最大的工厂工程新闻技术商讨和支付组织。AVEVA的飞跃发展与其便民易用,优良的互相建模情势分不开,本文重要对其交互建模部分举行介绍。 

AVEVA交互建模重假诺使用模型编辑器Model Editor,使用Model
Editor可以只用鼠标就可以展开建模设计了。编辑拔取的模子如下图所示: 

365bet手机app下载 1

Figure 2.1 Model Editor on a Equipment 

应用的Handle可以对模型多种艺术的编制,如轴向运动、平面移动、旋转等,如下图所示: 

365bet手机app下载 2

Figure 2.2 Locator Handle of Model Editor 

2.1 移动 Movement

对选取的模型举办轴向移动或平面移动时,可以应用Model Editor的Linear and
Planar
handles。沿轴向或锁定在某个平面上拖动模型,即能够运动模型。移动是按一定的长短递增的,可由活动增量(the
Movement
Increment)来设置,这样来确保拖动模型相对开始地方的精度。选中handle上某个轴,就可以沿这多少个轴的可行性来移动模型,如下图所示: 

365bet手机app下载 3

Figure 2.3 Linear Movement 

入选并拖动Model
Editor的平面移动handle,就足以在锁定的平面上运动模型,如下图所示: 

365bet手机app下载 4

Figure 2.4 Planar Movement 

2.2 旋转 Rotation

旋转是通过Model Editor的Rotation
handle来完成的。旋转是按一定的角度来递增的,可由旋转增量(the Rotation
Increment)来设置。那样就保险了旋转相对于起首地方的精度。选中并拖动Rotation
handle,就足以对模型举办旋转了,如下图所示: 

365bet手机app下载 5

Figure 2.5 Rotation 

365bet手机app下载 6
365bet手机app下载 7

Figure 2.6 Use Model Editor to Modify a Valve 

交互建模时使用Model
Editor如上图2.6所示,由图可以,在AVEVA中对模型的移位和旋转非常有利于。 

2.3 对齐 Alignment

通过对齐功用,可以便宜地将模型对齐到点、边或面,如下图所示: 

365bet手机app下载 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在一个滑翔爱好者的邮件组中遭受了RobertOsfield,也就是当前OpenSceneGraph项指标第一领导者。当时罗Bert在苏格兰的油气公司做事,但对电脑图形学和可视化技术具有深刻的兴趣。志趣相投的两人走到了伙同,最先合作对Don的虚伪软件举行改良。罗Bert(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平面上的缩放; 

365bet手机app下载 9

Figure 3.1 TabPlaneDragger in OpenSceneGraph 

l
TabPlaneTrackballDragger平面轨迹球拖拽器:顾名思义除了平面拖拽器的功效外,还多了个轨迹球拖拽效率; 

365bet手机app下载 10

Figure 3.2 TabPlaneTrackballDragger in OpenSceneGraph 

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

365bet手机app下载 11

Figure 3.3 TrackballDragger in OpenSceneGraph 

l Translate1DDragger一维平移拖拽器:沿一个直线举办拖拽; 

365bet手机app下载 12

Figure 3.4 Translate1DDragger in OpenSceneGraph 

l Translate2DDragger二维平移拖拽器:在某个平面上对模型举办拖拽; 

365bet手机app下载 13

Figure 3.5 Translate2DDragger in OpenSceneGraph 

l TranslateAxisDragger三维平移拖拽器:可在多少个趋势上对模型举行拖拽; 

365bet手机app下载 14

Figure 3.6 TranslateAxisDragger in OpenSceneGraph 

l
TabBoxDragger盒式拖拽器:由五个平面拖拽器构成,可在各样面上举行缩放、平移; 

365bet手机app下载 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();
}

程序行使办法为挑选要拖拽的模子,选中后为模型打开拖拽器,使用拖拽器对模型举办拖拽就可以修改模型的岗位了。在键盘上按下‘d’可以打开/关闭拖拽器,默认为打开。当设置为关闭时,再选中带有拖拽器的模子后,将会倒闭拖拽器。程序运行效果如下图所示: 

365bet手机app下载 16

Figure 3.8  Use TranslateAxisDragger to dragger box 

365bet手机app下载 17

Figure 3.9 Use TranslateAxisDragger to dragger glider 

365bet手机app下载 18

Figure 3.10 Use TranslateAxisDragger in OpenSceneGraph 

五、结论 Conclusion

因而程序实施注解,OpenSceneGraph中的人机交互的措施仍旧很有益于的,并提供了两种拖拽器来控制模型。并且拖拽器采纳了组合格局,便于扩张,即基于用户实际需要整合出更复杂或更具个性的拖拽器。 

有鉴于此,使用OpenSceneGraph来对模型举行呈现与操作很便利,且是开源程序,方便程序调试,还不设有文化产权的题目。因为OpenSceneGraph重即使用来虚拟仿真,还提供了过多冒牌效果,如烟雾、火焰、粒子效果(雨、雪、爆炸)、动画等,要是在建模设计的长河中十分添加部分功用,是不是很cool? 

365bet手机app下载,六、参考资料 References

  1. AVEVA,Graphical Model Manipulation Guide 

  2. Donald Hearn,M. 保罗(Paul)ine Baker,Computer Graphics with
    OpenGL,电子工业出版社 

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

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

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

 

PDF Version: Implementation Model Editor of AVEVA in
OpenSceneGraph

发表评论

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