青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Implementation Model Editor of AVEVA in OpenSceneGraph

eryar@163.com

摘要Abstract:本文主要對(duì)工廠和海工設(shè)計(jì)軟件AVEVA的交互方式進(jìn)行詳細(xì)介紹,對(duì)OpenSceneGraph中的人機(jī)交互工具拖拽器進(jìn)行說明,并在其中實(shí)現(xiàn)了模型直接交互操作。對(duì)交互建模感興趣的讀者可結(jié)合其源代碼,對(duì)其實(shí)現(xiàn)細(xì)節(jié)進(jìn)行分析。

關(guān)鍵字Key Words:AVEVA, Model Editor, OpenSceneGraph, Dragger

一、引言 Introduction

在當(dāng)代的三維輔助設(shè)計(jì)軟件中,交互建模設(shè)計(jì)已經(jīng)成為主流。友好、高效的對(duì)三維模型直接進(jìn)行編輯或修改,不僅可以提高用戶的工作效率,還會(huì)給用戶留下美好印象,即軟件良好的用戶體驗(yàn)。交互建模的常見方法有:拖曳、約束、柵格捕捉、橡皮筋方法、引力場(chǎng)等,拖曳就是直接對(duì)選擇的模型在三維空間中拖動(dòng)來改變位置和方向;約束方法就是在拖曳的時(shí)候添加約束條件,如只能沿某個(gè)方向進(jìn)行拖曳,軟件中的應(yīng)用有AutoCAD中的極軸捕捉功能;柵格捕捉也是一種帶約束的拖曳,即拖曳的過程中只能沿正交網(wǎng)格中直線的交點(diǎn)拖動(dòng);橡皮筋方法主要用在繪制二維圖形;引力場(chǎng)方法就像AutoCAD中的磁吸功能。如何設(shè)計(jì)高效、友好、方便的用戶接口是當(dāng)前各開發(fā)系統(tǒng)的廠家和專家所共同關(guān)心的問題,它的設(shè)計(jì)好壞可能直接影響用戶是否接受其產(chǎn)品。

本文主要對(duì)工廠和海工設(shè)計(jì)軟件AVEVA的交互方式進(jìn)行詳細(xì)介紹,對(duì)OpenSceneGraph中的人機(jī)交互工具拖拽器進(jìn)行說明,并在其中實(shí)現(xiàn)了模型直接交互操作。通過程序?qū)嵺`,感覺使用OpenSceneGraph來進(jìn)行編碼還是很舒服的,因?yàn)槠浯a規(guī)范,設(shè)計(jì)很好。對(duì)交互建模感興趣的讀者可結(jié)合其源代碼,對(duì)其實(shí)現(xiàn)細(xì)節(jié)進(jìn)行分析。

二、模型編輯器Model Editor of AVEVA

AVEVA(原CADCENTRE)是國(guó)際著名的工廠工程信息技術(shù)企業(yè),成立于1967年,總部設(shè)在英國(guó)劍橋;AVEVA所提供的工廠工程一體化解決方案涵蓋了陸地和海洋石油天然氣、電力、石化、化工、核電、造船、環(huán)保、造紙、制藥、冶金、礦山等多個(gè)行業(yè),同時(shí)提供專業(yè)工廠工程技術(shù)咨詢、技術(shù)服務(wù)和本地化可持續(xù)發(fā)展的應(yīng)用開發(fā)。 AVEVA是目前全球發(fā)展最快的工廠工程信息技術(shù)企業(yè)之一,1996年在英國(guó)倫敦上市,2007財(cái)年年產(chǎn)值超過25億美元。AVEVA在全球擁有超過1600名用戶,每天有超過26,000名工程人員在使用AVEVA的解決方案。AVEVA在世界30多個(gè)國(guó)家和地區(qū)設(shè)有超過50個(gè)常駐辦事機(jī)構(gòu),在英國(guó)劍橋總部及其他研發(fā)中心擁有超過300名研究和開發(fā)人員,為世界上最大的工廠工程信息技術(shù)研究和開發(fā)團(tuán)隊(duì)。AVEVA的快速發(fā)展與其方便易用,良好的交互建模方式分不開,本文主要對(duì)其交互建模部分進(jìn)行介紹。

AVEVA交互建模主要是使用模型編輯器Model Editor,使用Model Editor可以只用鼠標(biāo)就可以進(jìn)行建模設(shè)計(jì)了。編輯選擇的模型如下圖所示:

wps_clip_image-19277

Figure 2.1 Model Editor on a Equipment

使用的Handle可以對(duì)模型多種方式的編輯,如軸向移動(dòng)、平面移動(dòng)、旋轉(zhuǎn)等,如下圖所示:

wps_clip_image-19280

Figure 2.2 Locator Handle of Model Editor

2.1 移動(dòng) Movement

對(duì)選擇的模型進(jìn)行軸向移動(dòng)或平面移動(dòng)時(shí),可以使用Model Editor的Linear and Planar handles。沿軸向或鎖定在某個(gè)平面上拖動(dòng)模型,即可以移動(dòng)模型。移動(dòng)是按一定的長(zhǎng)度遞增的,可由移動(dòng)增量(the Movement Increment)來設(shè)置,這樣來確保拖動(dòng)模型相對(duì)初始位置的精度。選中handle上某個(gè)軸,就可以沿這個(gè)軸的方向來移動(dòng)模型,如下圖所示:

wps_clip_image-3474

Figure 2.3 Linear Movement

選中并拖動(dòng)Model Editor的平面移動(dòng)handle,就可以在鎖定的平面上移動(dòng)模型,如下圖所示:

wps_clip_image-107

Figure 2.4 Planar Movement

2.2 旋轉(zhuǎn) Rotation

旋轉(zhuǎn)是通過Model Editor的Rotation handle來完成的。旋轉(zhuǎn)是按一定的角度來遞增的,可由旋轉(zhuǎn)增量(the Rotation Increment)來設(shè)置。這樣就確保了旋轉(zhuǎn)相對(duì)于初始位置的精度。選中并拖動(dòng)Rotation handle,就可以對(duì)模型進(jìn)行旋轉(zhuǎn)了,如下圖所示:

wps_clip_image-693

Figure 2.5 Rotation

wps_clip_image-5192 wps_clip_image-23407

Figure 2.6 Use Model Editor to Modify a Valve

交互建模時(shí)使用Model Editor如上圖2.6所示,由圖可知,在AVEVA中對(duì)模型的移動(dòng)和旋轉(zhuǎn)非常方便。

2.3 對(duì)齊 Alignment

通過對(duì)齊功能,可以方便地將模型對(duì)齊到點(diǎn)、邊或面,如下圖所示:

wps_clip_image-710

Figure 2.7 Alignment features

通過上文對(duì)AVEVA中的Model Editor的介紹可知,在AVEVA中三維交互建模很方便,且精度高。縱觀國(guó)內(nèi)目前類似產(chǎn)品,有些還停留在二維建模方式,有些借助于其他平臺(tái)的交互方法,但是在易用性上感覺都稍有不足,或沒有自主的知識(shí)產(chǎn)權(quán)。

三、拖拽器Dragger of OpenSceneGraph

1997年,一個(gè)名叫Don Burns的軟件工程師受雇于當(dāng)時(shí)的Silicon Graphics(SGI)公司,負(fù)責(zé)針對(duì)滑翔機(jī)飛行的虛擬仿真工作進(jìn)行研究。他使用當(dāng)時(shí)的OpenGL Performer系統(tǒng),設(shè)計(jì)了一套廣受好評(píng)的滑翔仿真軟件,并開始嘗試在Linux中使用Mesa3D和3dfx Voodoo顯卡設(shè)備繼續(xù)完善自己的仿真軟件。

1998年,Don在一個(gè)滑翔愛好者的郵件組中遇到了Robert Osfield,也就是目前OpenSceneGraph項(xiàng)目的主要負(fù)責(zé)人。當(dāng)時(shí)Robert在蘇格蘭的油氣公司工作,但對(duì)計(jì)算機(jī)圖形學(xué)和可視化技術(shù)有著濃厚的興趣。志趣相投的兩個(gè)人走到了一起,開始合作對(duì)Don的仿真軟件進(jìn)行改善。Robert建議將SG作為獨(dú)立的開源場(chǎng)景圖形項(xiàng)目繼續(xù)開發(fā),并由自己擔(dān)任項(xiàng)目主導(dǎo),項(xiàng)目的名稱改為OpenSceneGraph,簡(jiǎn)稱OSG。

如今,相當(dāng)一部分高性能的軟件已經(jīng)使用了OSG來完成復(fù)雜場(chǎng)景的渲染工作。大部分基于OSG的軟件開發(fā)更適用于可視化設(shè)計(jì)和工業(yè)仿真,包括地理信息系統(tǒng)(GIS)、計(jì)算機(jī)輔助設(shè)計(jì)(CAD)、建模和數(shù)字媒體創(chuàng)作(DCC)及數(shù)據(jù)庫開發(fā)、虛擬現(xiàn)實(shí)、動(dòng)畫、游戲和娛樂業(yè)等。

OpenSceneGraph引擎由一系列圖形學(xué)相關(guān)的功能模塊組成,主要為圖形圖像應(yīng)用程序的開發(fā)提供場(chǎng)景管理和圖形渲染優(yōu)化的功能。它使用可移植的ANSI C++編寫,并使用已成為工業(yè)標(biāo)準(zhǔn)的OpenGL底層渲染API。OSG具備跨平臺(tái)的特性,可以運(yùn)行在大多數(shù)類型的操作系統(tǒng)上,并使用抽象層的概念,使OSG的函數(shù)接口可以獨(dú)立于用戶的本地操作系統(tǒng)使用。OSG遵循開源協(xié)議發(fā)布,其用戶許可方式是一種修改過的GNU寬通用公共許可證(GNU Lesser General Public License, LGPL),稱為OSGPL。OSG主要具備以下優(yōu)勢(shì):快速開發(fā),高品質(zhì),高性能,高質(zhì)量代碼,可擴(kuò)展性,可移植性,低費(fèi)用,沒有知識(shí)產(chǎn)權(quán)問題,但是OSG目前也存在諸多不足,如參考文檔較少、代碼風(fēng)格不統(tǒng)一、部分功能的實(shí)現(xiàn)過于臃腫,無法應(yīng)用于實(shí)踐等,這些都有待更多的開發(fā)者和貢獻(xiàn)者去發(fā)現(xiàn)和完善。

三維用戶交互是一種與三維環(huán)境本身特性相匹配的交互動(dòng)作,可使用戶在虛擬場(chǎng)景中獲得身臨其境的直觀感受。三維世界的交互技術(shù)相當(dāng)于一種“控制-顯示”的映射,用戶設(shè)備(例如鼠標(biāo)、鍵盤、操縱桿等)向系統(tǒng)輸入控制信息,然后系統(tǒng)向用戶輸出執(zhí)行結(jié)果。三維交互涉及的任務(wù)繁多,包括三維場(chǎng)景對(duì)象的選擇和操控、三維世界中的導(dǎo)航漫游、改變?nèi)S場(chǎng)景的狀態(tài),乃至?xí)r下流行的三維交互建模等。作為一款全面的實(shí)時(shí)渲染引擎,OSG實(shí)現(xiàn)了三維場(chǎng)景的漫游及場(chǎng)景中三維對(duì)象的操控這兩種主要的三維場(chǎng)景交互方式,更多的交互動(dòng)作則需要我們自行研究和實(shí)現(xiàn)。

作為重要的三維空間的人機(jī)交互手段之一,場(chǎng)景漫游的特點(diǎn)是通過不斷改變觀察者(相機(jī))的位置、姿態(tài),使其相對(duì)世界的觀察方位和角度有所變化,但是世界本身卻不會(huì)發(fā)生任何改變。無論草木、建筑,還是街道上的車水馬龍,構(gòu)成它們的每一個(gè)頂點(diǎn)都沒有發(fā)生任何偏移,如果觀察者有朝一日回到原地的話,他眼中的一切都不會(huì)發(fā)生改變。

而對(duì)于三維物體的操控則是另一種概念,它沒有改變觀察者的視角和視點(diǎn),而是根據(jù)用戶傳遞的交互事件,對(duì)選中的對(duì)象進(jìn)行平移、縮放和旋轉(zhuǎn)操作,就像是玩弄橡皮泥一樣。被修整過的對(duì)象將改變?cè)械男螒B(tài),換句話說,只要不恢復(fù)到操控前的狀態(tài),那么無論從什么地方進(jìn)行觀察,這個(gè)對(duì)象都將維持它最終的模樣。當(dāng)然,即使操控物體的定義如此,直接修改物體的頂點(diǎn)坐標(biāo)未免還是有些費(fèi)力不討好,最好的方式是為要操控的物體設(shè)置一個(gè)矩陣變換的父節(jié)點(diǎn)(MatrixTransform),通過改變這個(gè)父節(jié)點(diǎn)的變換矩陣的值,進(jìn)行改變作為操控對(duì)象的子節(jié)點(diǎn)的表現(xiàn)形式—這就是osgManipulator庫中拖拽器(Dragger)的實(shí)現(xiàn)方式。OSG內(nèi)置了幾種拖拽器,其操作方式和效果說明如下:

l TabPlaneDragger平面拖拽器:其邊、頂點(diǎn)上都有拖拽點(diǎn),可以進(jìn)行某個(gè)2D平面上的縮放;

wps_clip_image-1294

Figure 3.1 TabPlaneDragger in OpenSceneGraph

l TabPlaneTrackballDragger平面軌跡球拖拽器:顧名思義除了平面拖拽器的功能外,還多了個(gè)軌跡球拖拽功能;

wps_clip_image-2369

Figure 3.2 TabPlaneTrackballDragger in OpenSceneGraph

l TrackballDragger軌跡球拖拽器:即旋轉(zhuǎn)操縱器,沒有縮放功能;

wps_clip_image-16308

Figure 3.3 TrackballDragger in OpenSceneGraph

l Translate1DDragger一維平移拖拽器:沿一個(gè)直線進(jìn)行拖拽;

wps_clip_image-26274

Figure 3.4 Translate1DDragger in OpenSceneGraph

l Translate2DDragger二維平移拖拽器:在某個(gè)平面上對(duì)模型進(jìn)行拖拽;

wps_clip_image-6327

Figure 3.5 Translate2DDragger in OpenSceneGraph

l TranslateAxisDragger三維平移拖拽器:可在三個(gè)方向上對(duì)模型進(jìn)行拖拽;

wps_clip_image-15562

Figure 3.6 TranslateAxisDragger in OpenSceneGraph

l TabBoxDragger盒式拖拽器:由六個(gè)平面拖拽器構(gòu)成,可在各個(gè)面上進(jìn)行縮放、平移;

wps_clip_image-21705

Figure 3.7 TabBoxDragger in OpenSceneGraph

還有其他的拖拽器可以參考其源代碼:

n ScaleAxisDragger:三維縮放拖拽器;

n Scale2DDragger:二維縮放拖拽器;

n Scale1DDragger一維縮放拖拽器;

n RotateSphereDragger:旋轉(zhuǎn)球拖拽器;

n RotateCylinderDragger旋轉(zhuǎn)圓柱拖拽器;

由于使用了組合模式(CompositeDragger),可將上面的拖拽器組合成更復(fù)雜的拖拽器。如三維平稱拖拽器(TranslateAxisDragger)就是包含了三個(gè)一維拖拽器(Translate1DDragger)的組合拖拽器。因?yàn)槌绦蜷_源,所以可根據(jù)實(shí)際需要,將拖拽器進(jìn)行自定義。即可以定義出和AVEVA的Model Editor完全一樣的操縱器。

四、示例程序 Example Code

要對(duì)場(chǎng)景中的模型進(jìn)行拖拽,首先需要將其選中,然后在選中的模型上打開拖拽器,對(duì)模型的位置和方向進(jìn)行編輯。對(duì)象的拾取主要依靠場(chǎng)景圖形的交運(yùn)算來實(shí)現(xiàn)。拖拽器中用到的一個(gè)類PointerInfo表示一個(gè)信息的集合。例如,使用鼠標(biāo)選中待操作對(duì)象上的某個(gè)點(diǎn),以及當(dāng)前相機(jī)的觀察矩陣和投影矩陣等,都需要及時(shí)反映到這個(gè)輸入?yún)?shù)中,以便拖拽器根據(jù)實(shí)際情況進(jìn)行判斷并生成命令。下面給出一個(gè)使用拖拽器Dragger來操作場(chǎng)景中模型的具體實(shí)例,程序代碼如下所示:

1.首先定義了一個(gè)帶拖拽器的節(jié)點(diǎn)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;
};

類實(shí)現(xiàn)代碼如下所示:

 

#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.在處理選擇事件時(shí),打開拖拽器,實(shí)現(xiàn)類是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;
};

類實(shí)現(xiàn)代碼如下所示:

 


#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.在主函數(shù)中建立場(chǎng)景:

 

/*
*    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.00.0));
            glider
->setMatrix(osg::Matrix::translate(i * 2.5, j * 2.56.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();
}

程序使用方法為選擇要拖拽的模型,選中后為模型打開拖拽器,使用拖拽器對(duì)模型進(jìn)行拖拽就可以修改模型的位置了。在鍵盤上按下‘d’可以打開/關(guān)閉拖拽器,默認(rèn)為打開。當(dāng)設(shè)置為關(guān)閉時(shí),再選中帶有拖拽器的模型后,將會(huì)關(guān)閉拖拽器。程序運(yùn)行效果如下圖所示:

wps_clip_image-9879

Figure 3.8  Use TranslateAxisDragger to drag box

wps_clip_image-12412

Figure 3.9 Use TranslateAxisDragger to drag glider

wps_clip_image-28372

Figure 3.10 Use TranslateAxisDragger in OpenSceneGraph

五、結(jié)論 Conclusion

通過程序?qū)嵺`表明,OpenSceneGraph中的人機(jī)交互的方式還是很方便的,并提供了幾種拖拽器來操縱模型。并且拖拽器采用了組合模式,便于擴(kuò)展,即根據(jù)用戶實(shí)際需要組合出更復(fù)雜或更具個(gè)性的拖拽器。

由此可見,使用OpenSceneGraph來對(duì)模型進(jìn)行顯示與操作很方便,且是開源程序,方便程序調(diào)試,還不存在知識(shí)產(chǎn)權(quán)的問題。因?yàn)镺penSceneGraph主要是用于虛擬仿真,還提供了很多仿真效果,如煙霧、火焰、粒子效果(雨、雪、爆炸)、動(dòng)畫等,如果在建模設(shè)計(jì)的過程中適量添加部分效果,是不是很cool?

六、參考資料 References

1. AVEVA,Graphical Model Manipulation Guide

2. Donald Hearn,M. Pauline Baker,Computer Graphics with OpenGL,電子工業(yè)出版社

3. 何援軍,計(jì)算機(jī)圖形學(xué),機(jī)械工業(yè)出版社

4. 王銳,錢學(xué)雷,OpenSceneGraph三維渲染引擎設(shè)計(jì)與實(shí)踐,清華大學(xué)出版社

5. 肖鵬,劉更代,徐明亮,OpenSceneGraph三維渲染引擎編程指南,清華大學(xué)出版社

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合国产激情另类一区| 欧美精品1区2区3区| 午夜精品理论片| 亚洲精品欧美日韩| 伊大人香蕉综合8在线视| 亚洲一区二区三区精品动漫| 99成人在线| 亚洲影院污污.| 一区二区三区国产精华| 一本久久a久久免费精品不卡| 一区二区三区视频在线播放| 一本色道精品久久一区二区三区| 日韩视频在线播放| 中文在线一区| 欧美一级电影久久| 久久精品最新地址| 久久婷婷国产综合精品青草| 免费观看一区| 欧美三级黄美女| 国产精品午夜电影| 在线成人h网| 亚洲国产婷婷| 亚洲性人人天天夜夜摸| 欧美寡妇偷汉性猛交| 国产午夜精品全部视频在线播放| 欧美手机在线视频| 国产精品老牛| 国内精品视频在线播放| 亚洲成人在线观看视频| 99综合精品| 亚洲欧美视频在线观看视频| 亚洲精选视频免费看| 久久久久久夜精品精品免费| 裸体歌舞表演一区二区| 久久久久一区二区三区| 一区二区三区高清不卡| 久久精品一区| 国产精品国产三级国产普通话蜜臀 | 99人久久精品视频最新地址| 一区二区成人精品| 亚洲香蕉成视频在线观看 | 欧美jjzz| 亚洲在线视频一区| 欧美激情精品久久久久久变态| 国产手机视频一区二区| 国产精品99久久久久久久女警| 性色av香蕉一区二区| 欧美成人69av| 性欧美超级视频| 欧美亚洲成人免费| 亚洲国产婷婷| 久久在线免费| 亚洲欧美成人一区二区三区| 欧美精品电影| 亚洲激情av| 欧美成人情趣视频| 久久精精品视频| 国产精品免费电影| 亚洲综合电影| 一区二区三区免费看| 欧美日韩一区综合| 亚洲精品小视频| 欧美国产精品人人做人人爱| 久久久国产午夜精品| 国产亚洲一区二区三区在线播放| 性色av一区二区怡红| 一区二区三区欧美| 欧美日韩免费视频| 一区二区三区日韩欧美精品| 欧美电影在线观看| 国产精品视频免费观看www| 欧美日韩国产在线看| 91久久久久久| 欧美大片一区二区三区| 久久久久久久久一区二区| 国产欧美日本| 久久精品91久久久久久再现| 亚洲尤物影院| 黄色成人av网| 久久精品官网| 久久久久久久一区二区| 亚洲国产精品成人一区二区 | 亚洲视频 欧洲视频| 老司机午夜免费精品视频| 狠狠色丁香婷婷综合影院| 久久精品水蜜桃av综合天堂| 久久久99爱| 99视频精品全国免费| 亚洲精品女av网站| 久热这里只精品99re8久| 亚洲精品激情| 这里只有精品视频在线| 国产精品人成在线观看免费| 亚洲精品乱码久久久久| 亚洲第一主播视频| 欧美片第一页| 亚洲综合好骚| 久久国产主播| 亚洲视频高清| 久久精品盗摄| 一区二区三区福利| 亚洲一区三区电影在线观看| 国产亚洲精品美女| 亚洲国产二区| 国产三级欧美三级| 亚洲经典在线| 国产日韩成人精品| 亚洲激情网站免费观看| 国产一区深夜福利| 日韩视频免费在线观看| 国产日韩综合| 99精品99| 亚洲黑丝在线| 久久人91精品久久久久久不卡 | 久久久精品一区| 欧美激情一区二区在线 | 黄网站免费久久| 日韩视频免费观看高清在线视频| 国模套图日韩精品一区二区| 日韩视频免费| 亚洲精品免费观看| 亚洲欧美中文另类| 午夜精品国产精品大乳美女| 欧美激情一区二区三区| 国产女优一区| 亚洲视频播放| 久久亚洲欧洲| 亚洲国产精品ⅴa在线观看 | 亚洲一区二区视频在线观看| 亚洲网站视频| 激情文学一区| 欧美激情一区二区在线| 国产午夜精品久久久| 一级日韩一区在线观看| 国产精品卡一卡二卡三| 91久久精品美女高潮| 国产伪娘ts一区 | 久久成人资源| 亚洲自拍偷拍色片视频| 欧美日韩国产高清视频| 欧美激情精品久久久久久免费印度 | 国产精品九九| 99国产精品国产精品久久| 夜夜爽99久久国产综合精品女不卡 | 在线午夜精品自拍| 一区二区三区精品在线| 欧美日韩视频在线观看一区二区三区| 欧美黄色小视频| 亚洲日本aⅴ片在线观看香蕉| 欧美91大片| 亚洲人成人77777线观看| 一区二区三区四区五区在线| 免费精品99久久国产综合精品| 麻豆精品一区二区av白丝在线| 极品少妇一区二区三区精品视频| 久久久精品日韩欧美| 亚洲电影中文字幕| 亚洲美洲欧洲综合国产一区| 欧美日本一区二区视频在线观看| 一卡二卡3卡四卡高清精品视频 | av成人激情| 欧美中文在线免费| 国产一区二区av| 久久综合国产精品| 亚洲二区免费| 亚洲一区二区三区免费视频 | 欧美一区二区三区免费大片| 欧美大片免费观看| 亚洲免费精品| 国产精品国产自产拍高清av王其| 午夜精品一区二区三区四区| 一区二区三区四区五区精品| 国产精品国产三级国产aⅴ浪潮| 午夜精品www| 欧美激情按摩| 亚洲免费影视| 国产一区二区在线观看免费播放 | 一区二区三区四区在线| 亚洲综合国产| 国产精品毛片大码女人| 欧美在线观看天堂一区二区三区| 亚洲精品系列| 国产欧美一区二区精品忘忧草| 亚洲高清色综合| 西西裸体人体做爰大胆久久久| 日韩五码在线| 亚洲欧洲视频在线| 欧美高清视频在线播放| 国产一区二区三区日韩欧美| 中日韩美女免费视频网址在线观看 | 欧美成人69| 国产在线高清精品| 亚洲免费影视| 欧美一区二视频在线免费观看| 欧美精品一区二区在线播放| 亚洲毛片网站| 亚洲午夜国产一区99re久久| 国产精品亚洲网站| 中文亚洲欧美| 亚洲二区视频在线|