365bet手机app下载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可以只有所以鼠标就好拓展建模设计了。编辑选择的模型如下图所示: 

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在一个滑翔爱好者的邮件组中遇到了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面上的缩放; 

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? 

六、参考资料 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

发表评论

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