三維圖形編程
㈠ 圖形學編程
在三維繪圖蓬勃發展的過程中,計算機公司推出了大量的三維繪圖軟體包。其中SGI公司推出的OpenGL,作為一個性能優越的圖形應用程序設計界面(API)異軍突起,取得了很大的成就。它以高性能的互動式三維圖形建模能力和易於編程開發,得到了Microsoft、IBM、DEC、Sun、HP等大公司的認同。因此,OpenGL已經成為一種三維圖形開發標准,是從事三維圖形開發工作的必要工具。
1、初始化OpenGL繪圖環境
1.1 定義顏色格式和緩沖模式
OpenGL提供兩種顏色模式:RGB(RGBA)模式和顏色索引模式(調色板)。在RGBA模式下所有顏色的定義用RGB三個值來表示,有時也加上Alpha值(表示透明度)。RGB三個分量值的范圍都在0和1之間,它們在最終顏色中所佔的比例與它們的值成正比。如:(1、1、0)表示黃色,(0、0、1)表示藍色。顏色索引模式下每個象素的顏色是用顏色索引表中的某個顏色索引值表示(類似於從調色板中選取顏色)。由於三維圖形處理中要求顏色靈活,而且在陰影,光照,霧化,融合等效果處理中RGBA的效果要比顏色索引模式好,所以,在編程時大多採用RGBA模式。
OpenGL提供了雙緩存來繪制圖像。即在顯示前台緩存中的圖像同時,後台緩存繪制第二幅圖像。當後台繪制完成後,後台緩存中的圖像就顯示出來,此時原來的前台緩存開始繪制第三幅圖像,如此循環往復,以增加圖像的輸出速度。
設置窗口顯示模式函數:
void auxInitDisplayMode(
AUX_DOUBLE | // 雙緩存方式
AUX_RGBA // RGBA顏色模式
);
1.2 設置光源
OpenGL的光源大體分為三種:環境光(Ambient light),即來自於周圍環境沒有固定方向的光。漫射光(Diffuse light)來自同一個方向,照射到物體表面時在物體的各個方向上均勻發散。鏡面光(Specular light)則是來自於同一方向,也沿同一個方向反射。全局環境光是一種特殊的環境光,它不來自特於某種定光源,通常做為場景的自然光源。
指定光源函數:
void glLightfv(
Glenum light, // 光源號
Glenum pname, // 指明光源類型:
// GL_DIFFUSE 光源為漫射光光源
// GL_AMBIENT 光源為環境光光源
// GL_SPECULAR 光源為鏡面光光源
const Glfloat* params // 指向顏色向量的指針
);
設置全局環境光函數:
void glLightModelfv(
GL_LIGHT_MODEL_ AMBIENT,
const Glfloat* param // param:指向顏色向量的指針
);
起用光源函數:
void glEnable(GL_LIGHTING);
void glEnable(GL_enum cap); // cap:指明光源號
1.3 設置材質
在OpenGL中,用材料對光的三原色(紅綠藍)的反射率大小來定義材料的顏色。與光源相對應,材料的顏色,也分為環境色,漫反射色和鏡面反射色,由此決定該材料對應不同的光呈現出不同的反射率。由於人所看到物體的顏色是光源發出的光經物體反射後進入眼睛的顏色。所以,物體的顏色是光源的環境光,漫反射光和鏡面反射光與材料的環境色,漫反射色和鏡面反射色的綜合。例如:OpenGL的光源色是(LR、LG、LB),材質色為(MR、MG、MB),那麼,在忽略其他反射效果的情況下,最終進入眼睛的顏色是(LR*MR、LG*MG、LB*MB)。
材質定義函數:
void glMaterialfv(
GLenum face, // 指明在設置材質的哪個表面的顏色。
// 可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK
GLenum pname, // 與光源的pname參數相似
const float* params // 指向材質的顏色向量
);
1.4 定義投影方式
也即選擇觀察物體的角度和范圍。由於我們是三維繪圖,所以採用不同的視點和觀察范圍,就會產生不同的觀察效果。由於計算機只能顯示二維圖形,所以在表示真實世界中的三維圖形時,需將三維視景轉換成二維視景。這是產生三維立體效果的關鍵。OpenGL提供了兩種將3D圖形轉換成2D圖形的方式。正投影(Orthographic Projection)和透視投影(Perspective Projection)。其中,正投影指投影後物體的大小與視點的遠近無關,通常用於CAD設計;而透視投影則符合人的心理習慣,離視點近的物體大,離視點遠的物體小。此外,在OpenGL中還要定義投影范圍,只有在該范圍中的物體才會被投射到計算機屏幕上,投影范圍外的物體將被裁減掉。
定義投影范圍(不同的投影方式對應不同函數):
void glOrtho(
GLdouble left, GLdouble right,
// (left,bottom,near)及(right,top,far)分別給出正射投
GLdouble bottom, GLdouble top, // 影投影范圍的左下角和右上角的坐標。
GLdouble near,GLdouble far);
2、定義與Windows介面的系統函數
2.1 定義繪圖窗口的位置
// (x,y)給出窗口左上角坐標
// width及heigh給出窗口的寬高
void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);
2.2 定義繪圖窗口的標題
// STR表示窗口標題字串
void auxInitWindow(GLbyte* STR);
2.3 定義繪圖窗口改變時的窗口刷新函數
// 當窗口改變形狀時調指定的回調函數
// NAME表示回調函數名稱
void auxReshapeFunc(NAME);
2.4 定義空閑狀態的空閑狀態函數以實現動畫
// 當系統空閑時調用指定的回調函數
// NAME表示回調函數名稱
void auxIdleFunc(NAME);
2.5 定義場景繪制函數(當窗口更新或場景改變時調用)
// 當窗口需要更新或場景變化時調用
// NAME表示回調函數名稱
void auxMainLoop(NAME);
在VC編輯器下鍵入下述代碼後,保存為後綴是.cpp的C++文件。開始編譯,在「The build command requires an active project workspace」。「Would you like to create a default project workspace」? 的提示後,選擇「是(Y)」。進入「Project」菜單,選擇「Setting」項,彈出「Project Setting」對話框,選擇「Link」項,在「Libaray」欄目中加入OpenGL提供的函數庫:「opengl32.lib glu32.lib glaux.lib」。(注意:在執行程序時,Windows的system目錄下要包含opengl32.dll及glu32.dll兩個動態連接庫)。附源程序代碼:
#include "windows.h"
#include "gl/gl.h"
#include "gl/glaux.h"
#include "gl/glu.h"
#include "math.h"
void myinit()
{
glClearColor(1,1,0,0);
GLfloat ambient[]={.5,.5,.5,0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
GLfloat mat_ambient[]={.8,.8,.8,1.0};
GLfloat mat_diffuse[]={.8,.0,.8,1.0};
GLfloat mat_specular[]={1.0,.0,1.0,1.0};
GLfloat mat_shininess[]={50.0};
GLfloat light_diffuse[]={0,0,.5,1};
GLfloat light_position[]={0,0,1.0,0};
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0,GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
void CALLBACK display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
auxSolidSphere(1.0); // 繪制半徑為1.0的實體球
glFlush(); // 強制輸出圖像
auxSwapBuffers(); // 交換繪圖緩存
_sleep(100);
}
void CALLBACK Idledisplay()
{
// x,y滿足x2+y2=0.01。這樣可以使物體沿該圓軌跡運動。
static float x=-.1,y=0.0;
static BOOL mark=TRUE;
static float step=.01;
x+=step;
if(x<=.1&&x>=-.1)
{
if(step>0)
y=sqrt(.01-x*x);
else
y=-sqrt(.01-x*x);
glTranslatef(x,y,0);
}
else
{
step=0-step;
}
display();
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-3.5,3.5,-3.5*(GLfloat)w/(GLfloat)h, 3.5*(GLfloat)w/(GLfloat)h,-10,10);
else
glOrtho(-3.5*(GLfloat)w/(GLfloat)h,3.5* (GLfloat)w/(GLfloat)h,-3.5,3.5,-10,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main()
{
auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);
auxInitPosition(0,0,400,400);
auxInitWindow(" circle ");
myinit();
auxReshapeFunc(myReshape);
auxIdleFunc(Idledisplay);
auxMainLoop(display);
}
給你一個關於VC和OPENGL的網站,不錯的
http://dev.yesky.com/402/2084902.shtml
㈡ 三維圖形可視化製作技術
(一)OpenGL
OpenGL(Open Graphics Libaray)由SGI公司為其圖形工作站開發的可以獨立於窗口操作和硬體環境的圖形開發系統。其目的是將用戶從具體的硬體和操作系統中解放出來。用此系統可以不去理解這些系統的結構和指令系統,只要按規定的格式書寫應用程序就可以在任何支持該語言的硬體平台上執行。由於OpenGL的高度可重用性,已經有幾十家大公司表示接受OpenGL作為標准軟體介面,目前加入OpenGL ARB(OpenGL體系結構審查委員會)的成員有SGI公司、HP公司、MicroSoft公司、Intel公司、IBM公司、SUN公司、DEC公司、AT&T公司的Unix軟體實驗室等。在該組織的努力下,OpenGL已經成為高性能圖形和互動式視景處理的工業標准,能夠在Windows95/98、Windows NT、Windows 2K、Macos、Beos、OS/2以及Unix上應用。OpenGL的實質是作為圖形硬體的軟體介面,是一組三維的API函數。
1.OpenGL的主要功能
(1)建模。不但有簡單的點線面還提供了復雜的三維物體(球、錐等)以及復雜的曲線曲面(Bezier、Nurbs等)繪制函數。
(2)變換。主要包括基本變換(平移、旋轉等)和投影變換(平行、透視投影等)。
(3)顏色模式設置。RGBA模式、ColorIndex顏色索引。
(4)光照和材質設置。OpenGL光有輻射光、環境光、漫反射光、鏡面光;材質是用光反射率來表示的。場景中物體最終反映到人眼的顏色是光的RGB分量和材質的RGB分量疊加形成的。
(5)紋理映射。主要表達物體表面的細節。
(6)點陣圖顯示和圖像增強。圖像功能除了基本的復制和圖像像素讀寫外,還提供融合(Blending)、反走樣(Antialiasing)、霧化(Fog)等特殊的圖像處理效果。
(7)雙緩沖(Double Buffering)動畫。雙緩沖即前台緩沖和後台緩沖。後台計算場景、產生畫面,前台顯示後台已經計算好的畫面。
(8)交互技術。主要是提供三種工作模式:繪圖模式、選擇模式和反饋模式。繪圖模式完成場景的繪制,可以藉助物體的幾何參數及運動控制參數、場景的觀察參數、光照參數和材質參數、紋理參數、OpenGL函數的眾多常量控制參數、時間參數等和Windows對話框、菜單、外部設備等構成實時交互的程序系統。在選擇模式下,則可以對物體進行命名,選擇命名的物體,控制對命名的物體的繪制。而反饋模式則給程序設計提供了程序運行的信息,這些信息也可反饋給用戶,告訴用戶程序的運行狀況和監視程序的運行進程。
(9)其他。利用OpenGL還能實現深度暗示(Depth Cue)、運動模糊(Motion Blur)等特殊效果。
2.OpenGL的基本原理
OpenGL是一個硬體發生器的軟體介面,其主要目的是將二維、三維物體繪制到一個幀緩沖里,它包括幾百個圖形函數。開發者主要利用這些函數來建立三維模型和進行三維實時交互。
(1)圖元操作和指令。OpenGL能夠從多種可選擇的模式畫圖元,而且一種模式的設置一般不會影響其他模式的設置,無論發生深墨情況,指令總是被順序處理,也就是說,一個圖元必須完全畫完之後,後繼圖元才能影響幀存。
(2)圖形控制。OpenGL提供諸如變換矩陣、光照、反走樣方法、像素操作等參數來控制二維和三維圖形的繪制。它並不提供一個描述或建立復雜幾何物體的手段。OpenGL提供的是怎樣畫復雜物體的機制而非描繪復雜物體本身的面面俱到的工具。即OpenGL是過程性的而非描述性的。
(3)執行模式。OpenGL命令的解釋模式是客戶/伺服器模式的,即由客戶發布命令,命令由OpenGL伺服器(解釋器)來處理,伺服器可以運行在相同的或不同的計算機上,基於這一點,OpenGL是網路透明的。
地下水三維可視化系統開發與應用
3.OpenGL的命令語法與狀態
基於OpenGL標准開發的微機應用程序必須在32位Windows平台下,如Windows98/NT環境,運行時所需的動態連接庫為OpenGL32.DLL、Glu32.DLL。OpenGL包含100多個庫函數,這些函數按一定的格式來命名。
(1)核心函數115個,每個函數以gl開頭,這些函數是最基本的,可以運行在任何工作平台上。這些函數創建二維和三維幾何形體,設置視點,建立視覺體,設置顏色及材質,建立燈光,進行紋理映射,反走樣,處理融合,霧化場景等,它們可以接受不同的參數,因而可派生300多個函數。
(2)OpenGL實用庫函數以glu開頭,共43個。這些函數基於OpenGL核心函數,主要提供對輔助函數的支持,並且執行了核心OpenGL函數的交互,因而是比核心函數更高一層的函數,也更有通用性。可以運行在任何OpenGL工作平台上。
(3)輔助庫函數,共31個。以aux開頭,它們是一類特殊的OpenGL函數,是幫助初學者盡快進入OpenGL編程而做簡單練慣用的。因此並不能在所有平台上運行。但Windows98/NT支持它們。
(4)Windows專用庫函數,以wgl開頭。主要是連接OpenGL和Windows窗口系統的,用它們可以管理著色描述表及顯示列表,擴展功能,管理字體點陣圖等。
(5)Win32 API函數,共6個,用於處理像素格式及緩沖。
(6)OpenGL結構,共4個。
4.OpenGL圖形操作步驟
步驟1:設置像素格式:主要包括建立OpenGL繪制風格、顏色模式、顏色位數、深度位數等;
步驟2:建立模型:建立三維模型;
步驟3:舞檯布景:如何把景物放置在三維空間的適當位置,設置三維透視視覺體以觀察場景;
步驟4:效果處理:設置物體的材質(顏色、光學性能及紋理映射等)加入光照及光照條件;
步驟5:光柵化:把景物及其顏色信息轉化為可在計算機上顯示的像素信息。
(二)VRML
1.VRML簡介
VRML是英文Virtual Reality Modeling Language——虛擬現實造型語言的縮寫。其最初的名字叫Virtual Reality Makeup Language。名字是由第一屆WWW(1994,日內瓦)大會上,由Tim Berners Lee和Dave Raggett所組織的一個名為Bird-of-a-Feather(BOF)小組提出的。後來Makeup改為Modeling。VRML和HTML是緊密相連的,是HTML在3D領域的模擬和擴展。由於VRML在Internet具有良好的模擬性和交互性,因而顯示出強大的生命力。
VRML是一種3D交換格式,它定義了當今3D應用中的絕大多數常見概念,諸如變換層級、光源、視點、幾何、動畫、霧、材質屬性和紋理映射等。VRML的基本目標是確保能夠成為一種有效的3D文件交換格式。
VRML是HTML的3D模型。它把互動式三維能力帶入了萬維網,即VRML是一種可以發布3D網頁的跨平台語言。事實上,三維提供了一種更自然的體驗方式,例如游戲、工程和科學可視化、教育和建築。諸如此類的典型項目僅靠基於網頁的文本和圖像是不夠的,而需要增強交互性、動態效果連續感以及用戶的參與探索,這正是VRML的目標。
VRML提供的技術能夠把三維、二維、文本和多媒體集成為統一的整體。當把這些媒體類型和腳本描述語言(scripting language)以及網際網路的功能結合在一起時,就可能產生一種全新的互動式應用。VRML在支持經典二維桌面模型的同時,把它擴展到更廣闊的時空背景中。
VRML是賽博空間(cyber space)的基礎。賽博空間的概念是由科幻作家William Gibson提出的。雖然VRML沒有為真正的用戶模擬定義必要的網路和資料庫協議,但是應該看到VRML迅速發展的步伐。作為標准,它必須保持簡單性和可實現性,並在此前提下鼓勵前沿性的試驗和擴展。
2.VRML的基本工作原理及其特性
(1)用文本信息描述三維場景。在Internet網上傳輸,在本地機上由VRML的瀏覽器解釋生成三維場景,解釋生成的標准規范即是VRML規范。正是基於VRML的這種工作機制,才使其可能在網路應用中有很快的發展。當初VRML的設計者們考慮的也正是文本描述的信息在網路上的傳輸比圖形文件迅速,所以他們避開在網路上直接傳輸圖形文件而改用傳輸圖形文件的文本描述信息,把復雜的處理任務交給本地機從而減輕了網路的負荷。
(2)統分結合模式。VRML的訪問方式基於C/S模式,其中伺服器提供VRML文件,客戶通過網路下載希望訪問的文件,並通過本地平台的瀏覽器(Viewer)對該文件描述的VR世界進行訪問,即VRML文件包含了VR世界的邏輯結構信息,瀏覽器根據這些信息實現許多VR功能。這種由伺服器提供統一的描述信息,客戶機各自建立VR世界的訪問方式被稱為統分結合模式,也是VRML的基本概念。由於瀏覽器是本地平台提供的,從而實現了VR的平台無關性。
(3)基於ASCII碼的低帶寬可行性。VRML像HTML一樣,用ASCII文本格式來描述世界和鏈接,保證在各種平台上通用,同時也降低了數據量,從而在低帶寬的網路上也可以實現。
(4)實時3D著色引擎。傳統的VR中使用的實時3D著色引擎在VRML中得到了更好的體現。這一特性把VR的建模與實時訪問更明確地隔離開來,也是VR不同於三維建模和動畫的地方。後者預先著色,因而不能提供交互性。VRML提供了6+1個自由度,即三個方向的移動和旋轉,以及和其他3D空間的超鏈接(Anchor)。
(5)可擴充性。VRML作為一種標准,不可能滿足所有應用的需要。有的應用希望交互性更強,有的希望畫面質量更高,有的希望VR世界更復雜。這些要求往往是相互制約的,同時又受到用戶平台硬體性能的制約,因而VRML是可擴充的,即可以根據需要定義自己的對象及其屬性,並通過Java語言等方式使瀏覽器可以解釋這種對象及其行為。
(三)X3D
X3D(Extensible 3D——可擴展3D)是一個軟體標准,定義了如何在多媒體中整合基於網路傳播的交互三維內容。X3D將可以在不同的硬體設備中使用,並可用於不同的應用領域中。比如工程設計、科學可視化、多媒體再現、娛樂、教育、網頁、共享虛擬世界等方面。X3D也致力於建立一個3D圖形與多媒體的統一的交換格式。X3D是VRML的繼承。VRML(Virtual Reality Modeling Language-虛擬現實建模語言)是原來的網路3D圖形的ISO標准(ISO/IEC 14772)。X3D相對VRML有了改進,提供了以下的新特性:更先進的應用程序界面,新添的數據編碼格式,嚴格的一致性,組件化結構(用來允許模塊化的支持標準的各部分)。
1.X3D設計目標
X3D確立了以下的設計目標:
(1)分離數據編碼和運行時間結構;
(2)支持大量的數據編碼格式,包括XML(Extensible Markup Language);
(3)增加新的繪圖對象、行為對象、交互對象;
(4)給3D場景提供可選的應用程序界面(APIs);
(5)定義規格的子集「概貌(Profiles)」以適合不同的市場需要;
(6)允許在不同層次(1evels)的服務上都能實現X3D規格;
(7)盡可能添加完善規格中行為的定義或描述。
2.X3D特性
為了滿足工程設計、科學可視化、多媒體再現、娛樂、教育、網頁、共享虛擬世界等方面使用的需要,X3D添加了以下的新特性:
(1)3D圖形:多邊形化幾何體、參數化幾何體、變換層級、光照、材質、多通道/多進程紋理帖圖;
(2)2D圖形:在3D變換層級中顯示文本、2D矢量、平面圖形;
(3)動畫:計時器和插值器驅動的連續動畫;人性化動畫和變形;
(4)空間化的音頻和視頻:在場景幾何體上映射視聽源;
(5)用戶交互:基於滑鼠的選取和拖曳;鍵盤輸入;
(6)導航:攝像機;用戶在3D場景中的移動;碰撞、接近和可見性檢測;
(7)用戶定義對象:通過創建用戶定義的數據類型,可以擴展瀏覽器的功能;
(8)腳本:通過程序或腳本語言,可以動態地改變場景;
(9)網路:可以用網路上的資源組成一個單一的X3D場景;可以通過超鏈接對象連接到其他場景或網路上的其他資源;
(10)物理模擬:人性化動畫;地理化數據集;分布交互模擬(Distributed Interactive Simulation-DIS)協議整合。
(四)Java 3D
Java 3D用其自己定義的場景圖和觀察模式等技術構造了3D的上層結構,實現了在Java平台使用三維技術。Java 3D API是Sun定義的用於實現3D顯示的介面。3D技術是底層的顯示技術,Java 3D提供了基於Java的上層介面。Java 3D把OpenGL和DirectX這些底層技術包裝在Java介面中。這種全新的設計使3D技術變得不再繁瑣並且可以加入到J2SE、J2EE的整套架構,這些特性保證了Java 3D技術強大的擴展性。Java 3D建立在Java2(Java1.2)基礎之上,Java語言的簡單性使Java 3D的推廣有了可能。Java 3D是在OpenGL的基礎上發展起來的,可以說是Java語言在三維圖形領域的擴展,其實質是一組API即應用程序介面。利用Java 3D所提供的API就可以編寫出一些諸如三維動畫、遠程三維教學軟體、三維輔助設計分析和模擬軟體,以及三維游戲等。它實現了以下三維功能:
(1)生成簡單或復雜的形體(也可以調用現有的三維形體);
(2)使形體具有顏色、透明效果、貼圖;
(3)在三維環境中生成燈光、移動燈光;
(4)具有行為的處理判斷能力(鍵盤、滑鼠、定時等);
(5)生成霧、背景、聲音;
(6)使形體變形、移動、生成三維動畫;
(7)編寫非常復雜的應用程序,用於各種領域如VR(虛擬現實)。
1.Java 3D的數據結構
Java 3D的數據結構和OpenGL的數據結構一樣,採用的是場景圖的數據結構,但Java 3D根據Java語言的特點。Java 3D的場景圖是DAG(Directed-acyclic Graph),其特點是具有方向的不對稱性。Java 3D的場景圖由Java 3D的運行環境直接轉變成具有三維顯示效果的顯示內存數據,從而在計算機上顯示出三維效果,顯示內存中不斷接收Java 3D的運行最新結果,從而產生三維動畫。
2.、Java 3D(API)中的類
Java 3D是根據OpenGL的三維圖形庫及VRML的基礎上開發出來的一個API,裡麵包含了幾乎所有編寫Java互動式三維應用程序所需的最基本的類(類方法)、介面。主要存放在程序包Javax.media.j3d中,這些是Java 3D的核心類。另外,還有提供一個有助於快速編程的應用類型的包(Utility包)com.sun.j3d.utils(可或缺,主要是能大大地提高程序的編寫效率)。除了核心類和Utility包之外,還有:
(1)Java.awt(主要是定義一個顯示用的窗口);
(2)Javax.vecmath(主要是處理定義的矢量計算所用的類,今後核心類);
(3)Java 3D的類根據作用可分為Node、NodeComponent,其中Node又分為Group及Leaf兩個子類。
(五)IDL
1.IDL簡介
IDL(Interactive Data Language)是美國RSI公司(Research System Inc)的產品,它集可視、交互分析、大型商業開發為一體,為用戶提供了完善、靈活、有效的開發環境。IDL的主要特性包括:
(1)高級圖像處理、互動式二維和三維圖形技術、面向對象的編程方式、OpenGL圖形加速、跨平台圖形用戶界面工具包、可連接ODBC兼容資料庫及多種程序連接工具等。
(2)IDL是完全面向矩陣的,因此具有處理較大規模數據的能力。IDL可以讀取或輸出有格式或無格式的數據類型,支持通用文本及圖像數據,並且支持在NASA,TPT,NOAA等機構中大量使用的HDF,CDF及netCDF等科學數據格式及醫學掃描設備的標准格式DICOM格式。IDL還支持字元、位元組、16位整型、長整型、浮點、雙精度、復數等多種數據類型。能夠處理大於2Gb的數據文件。IDL採用OpenGL技術,支持OpenGL軟體或硬體加速,可加速互動式的2D及3D數據分析、圖像處理及可視化。可以實現曲面的旋轉和飛行;用多光源進行陰影或照明處理;可觀察體(Volume)內部復雜的細節;一旦創建對象後,可從各個不同的視角對對象進行可視分析。
(3)IDL具有圖像處理軟體包,例如感興趣區(ROI)分析及一整套圖像分析工具、地圖投影及轉換軟體包,宜於GIS的開發。
(4)IDL帶有數學分析和統計軟體包,提供科學計算模型。可進行曲線和曲面擬合分析、多維網格化和插值、線性和非線性系統等分析。
(5)用IDL DataMiner可快速訪問、查詢並管理與ODBC兼容的資料庫,支持Oracle,Informix,Sybase,MS SQL等資料庫。可以創建、刪除、查詢表格,執行任意的SQL命令。
(6)IDL可以通過ActiveX控制項將IDL應用開發集成到與COM兼容的環境中。用Vi-sual Basic,Visual C++等訪問IDL,還可以通過動態連接庫方式從IDL調用C,Fortran程序或從其他語言調用IDL。
(7)用IDL GUIBuilder可以開發跨平台的用戶圖形界面(GUI),用戶可以拖放式建立圖形用戶界面GUI,靈活、快速地產生應用程序的界面。
(8)IDL為用戶提供了一些可視數據分析的解決方案,早在1982年NASA的火星飛越航空器的開發就使用了IDL軟體。
2.IDL的編程方式
IDL有兩種編程方式,一是利用IDL平台的GUIBuilder進行編程,這種方式的特點是所見即所得,使用IDL自身所具有的控制項進行編程和界面設置,但使用靈活性不夠;另一種是利用IDL平台的集成開發環境的組件編程技術,這種方式的特點是較為靈活,而且功能較強,可以隨著編程者的意願進行設置。另外在IDL中有批處理文件語句,即在命令行中直接輸入命令語句來進行數據的讀入和輸出,以及進行屬性設置和處理。此外,IDL提供IDLDRAW WIDGET控制項,可進行基於COM技術的開發。
3.IDL的應用領域
由於其強大的功能和獨特的特點,IDL語言可以應用地球科學(包括氣象、水文、海洋、土壤、地質、地下水等)、醫學影像、圖像處理、GIS系統、軟體開發、大學教學、實驗室、測試技術、天文、航空航天、信號處理、防禦工程、數學統計及分析、環境工程等很多領域,IDL語言都可以得到廣泛的應用。目前應用IDL語言,已經開發出了ENVI,IMAGIS,RiverTools,醫學等成熟產品。具體的應用實例也非常多,如在2000年澳大利亞悉尼奧運會綜合預報系統、美國國家環境衛星數據和信息服務中心的厄爾尼諾現象分析等工作中得到了成功的應用。
北京市勘察設計研究院應用IDL語言,已開發了真三維地質分析系統AutoDig,能夠直接對簡單的地質數據,或其他帶層次性的數據實現科學的、完整的三維建模;同時也提供真三維顯示功能,不僅能對三維體實現任意的旋轉、放大、縮小,而且也能實現互動式的真三維切割功能。
(六)小結
三維圖形技術是隨著計算機軟硬體技術的發展而發展變化的,其鼻祖是SGI公司推出的OpenGL三維圖形庫。OpenGL是業界最為流行也是支持最廣泛的一個底層3D技術,幾乎所有的顯卡廠商都在底層實現了對OpenGL的支持和優化。OpenGL同時也定義了一系列介面用於編程實現三維應用程序,但是這些介面使用C(C++)語言實現並且很復雜。掌握針對OpenGL的編程技術需要花費大量時間精力。
Java 3D是在OpenGL的基礎上發展起來的,可以說是Java語言在三維圖形領域的擴展,其實質是一組API即應用程序介面。
Direct3D是Microsoft公司推出的三維圖形編程API,它主要應用於三維游戲的編程。眾多優秀的三維游戲都是由這個介面實現的。與OpenGL一樣,Direct3D的實現主要使用C++語言。
VRML2.0(VRML97)自1997年12月正式成為國際標准之後,在網路上得到了廣泛的應用,這是一種比BASIC,JAVASCRIPT等還要簡單的語言。現已發展為X3D。腳本化的語句可以編寫三維動畫片、三維游戲、計算機三維輔助教學。它最大的優勢在於可以嵌在網頁中顯示。
美國RSI公司(Research System Inc)研製和開發的最新可視軟體IDL(Interactive Data Language)互動式數據語言,是進行數據分析、可視化和跨平台應用開發的較佳選擇,它集可視、交互分析、大型商業開發為一體,為用戶提供了完善、靈活、有效的開發環境。三維技術的比較見表1-2。
表1-2 三維技術對比
㈢ Mastercam X2能使用三維圖形直接編程嗎
我用MastercamX 看你繪制的三維圖是實體還是曲面 如果是曲面可以直接選取並編程 若是實體你是無法選中的 先把實體轉換為曲面在編程 有些曲面加工模式是要指定切削范圍的 所以必要時你還要繪制曲面曲線
㈣ 怎麼用Visual C++6.0來實現對OpenGL三維圖形的繪制
既然問這個問題,那麼你首先應該已經學會使用opengl二維的圖形繪制了吧?三維也只是多出一個z軸坐標而已.你以前設點要設2個坐標,那麼三維則要設三個坐標.比如設一個點坐標PointA[] = { 0.5f, -sqrt(6.0f)/12, -sqrt(3.0f)/6},那麼只要使用glVertex3fv(PointA)便可在此位置畫出一個點,畫了三個點後使用TRIANGLES便可成為一個面.下面的程序是畫出一個旋轉彩色四面體
#include<gl/glut.h>
#include<math.h>
#define ColoredVertex(c,v)do{glColor3fv(c);glVertex3fv(v);}while(0);
GLfloat angle=0.0f;
void myDisplay()
{
static int list=0;
if(list==0)
{
GLfloat
PointA[]={0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},
PointB[]={-0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},
PointC[]={0.0f,-sqrt(6.0f)/12,sqrt(3.0f)/3},
PointD[]={0.0f,sqrt(6.0f)/4,0};
GLfloat
ColorR[]={1,0,0},
ColorG[]={0,1,0},
ColorB[]={0,0,1},
ColorY[]={1,1,0};
list=glGenLists(1);
glNewList(list,GL_COMPILE);
glBegin(GL_TRIANGLES);
ColoredVertex(ColorR,PointA); //ABC
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorR,PointA); //ACD
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorY,PointD);
ColoredVertex(ColorR,PointA); //ABD;
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorY,PointD);
ColoredVertex(ColorG,PointB); //BCD
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorY,PointD);
glEnd();
glEndList();
glEnable(GL_DEPTH_TEST);
}
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,1,0.5,0);
glCallList(list);
glPopMatrix();
glutSwapBuffers();
}
void myIdle()
{
angle=angle+0.5;
if(angle>=360)
angle=0.0f;
myDisplay();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(200, 200);
glutInitWindowSize(500, 500);
glutCreateWindow("旋轉四面體");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle);
glutMainLoop();
return 0;
}
㈤ 3D建模 和 編程 哪個更難
整體來說建模相對於編程要更簡單一些,但因兩者並不相同,所以無法進行詳細對比。
編程的概念很廣泛,但其本質都是為了解決人類的現實問題。通常的編程指的是給計算機編定程序,使計算機能夠完成我們需要的指令,得到相應的結果。這種人與計算機之間的交流過程就叫做編程。
三維建模可以理解為在平面里顯示三維圖形。不像現實世界裡,真實的三維空間,有真實的距離空間。計算機里只是看起來很像真實世界,因此在計算機顯示的3d圖形,便是讓人眼看上就像真的一樣。人眼有一個特性就是近大遠小,便會形成立體感。計算機屏幕是平面二維的,之所以能欣賞到真如實物般的三維圖像,是因顯示在計算機屏幕上時色彩灰度的不同而使人眼產生視覺上的錯覺,而將二維的計算機屏幕感知為三維圖像。
感興趣的點擊此處,免費學習一下
如果您有學習建模的興趣,建議您咨詢廣州中教在線教育科技有限公司。中教在線師資力量強大,擁有行業資深3D美術老師帶你從入門到精通,課程內容設置經過1年以上市場調研,企業高層參與研發,符合企業真實崗位技術需要。教授技能同時,更教授工作標准、規范和項目流程!
㈥ Java三維幾何圖形編程,求過程
openGL??????
㈦ C++編程,三維圖形變換,急!!!
就是數組操作,你先去看一下變換的基本原理,然後定義數組,進行加減乘除操作就可以了
㈧ 請問誰會這個圖形的數控編程啊及三維圖形
將俯視圖底面朝上裝夾,按照圖形建立主視圖XY坐標系
一、對於零件尺寸146X106程序
採用以下程序,對刀過程省略(Z定在),用直徑60銑刀加刀具補償30.2粗加工 再用直徑6銑刀 加刀具補償3mm精加工
G54G90G64
M3S800F800
G0X73Y92 G42T1
Z0
G1Z-6.015
Y38
G3X58Y53CR=15
G1X-58
G3X-73Y38CR=15
G1Y-38
G3X-58Y-38CR=15
G1X58
G3X73Y-58CR=10
G1Y0
G0Z50
G40
M5
M30
二、4個直徑12通孔
先用6.7鑽頭鑽通,然後用直徑12擴孔刀加工成,直徑12擴孔刀尺寸需要滿足圖紙公差,切零件加工時轉速和進給率會影響零件尺寸。採用主程序調用子程序zk,程序如下:
主程序:
G55G90G64
M3S500G95F0.5
MCALL ZK
X58Y38
X-58Y38
X-58Y-38
X58Y-38
MCALL
M5
M30
子程序:
G0Z1
G1Z-25
G0Z20
M17
三、對於直徑28通孔,給的刀具不合適,可以用直徑6.7鑽頭鑽通,然後用6mm銑刀,通過更改刀具軌跡半徑逐漸加工。6mm銑刀精加工程序如下
G56G90G64G17
M3S800F800
G0X0Y0
Z2
G1Z-30
G1X=(28.021-6)/2
G3 I=AC(0) J=AC(0)
G0X0Y0
Z50
M5
M30
四、對於五瓣花的編程,採用旋轉 ROT編程 子程序HB為一個花瓣軌跡,直徑55尺寸最終加工,用直徑6mm立銑刀加工,對於粗加工,需改大刀補即可,精加工刀補為3mm,精加工程序軌跡如下:
主程序:
G57G90G64
M3S800F800
HB
ROT Z=72
HB
ROT Z=144
HB
ROT Z=216
HB
ROT Z=288
HB
M5
M30
一個花瓣軌跡 子程序HB:
G0X0Y0
Z2
G41T1
G1Z-4.015
G1X13..665Y23.865
G2X11.957Y28.867 CR=4
G1X15.778Y38.093
G3X9.985Y48.993CR=8
G3X-9.985CR=50
G3X-15.778Y38.093CR=8
G1X-11.957Y28.867
G2X13.665Y23.865CR=4
G0Z50
M17
對於尺寸直徑55的加工:
G54G90G64G17
M3S800F800
G0X0Y0
Z2
G1Z-4.015
G1X=(55-6)/2
G3 I=AC(0) J=AC(0)
G0X0Y0
Z50
M5
M30
㈨ AutoCAD的三維圖都有哪些用途,能用於數控編程么
Autocad的好處就是能自由自在的在三維空間裏畫任可線條,你只要在(Constrained - Orbit 和 New UCS --3point)的指令內運用得法,你就輕髬健立一個3D的架,然後以DXF檔輸到 Aphacam (我在越南通常是用Aphacam來編程)或Pro/E .然後做以3D架做綱面,把刀具路經投影到網面上這祥你加工時間可以快了很多,而且刀 路經容易控制,我在越南是5軸銑床(5aixs)的編程員,
因我是越籍廣東人,所以要用中文打寫是很困難,而且我是用繁體的,如你有興趣想明白多一點請在線上以語音交談
㈩ 用c或c++編一個畫三維圖形的程序
TurboC 立方體
#include <dos.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
void DrawCube(int color);
int cx[9], cy[9];
int CubeCorners[9][4];
int CurX, CurY;
int Angle = 0;
int step = 2;
int Radius;
const double Pi = 3.14159265358979;
int main()
{
int GraphDriver;
int GraphMode;
int a, b;
GraphDriver = DETECT;
initgraph(&GraphDriver, &GraphMode, "");
Radius = 150;
CubeCorners[1][2] = 200 / 2;
CubeCorners[2][2] = 200 / 2;
CubeCorners[3][2] = -200 / 2;
CubeCorners[4][2] = -200 / 2;
CubeCorners[5][2] = 200 / 2;
CubeCorners[6][2] = 200 / 2;
CubeCorners[7][2] = -200 / 2;
CubeCorners[8][2] = -200 / 2;
DrawCube(12);
getch();
}
void DrawCube(int color)
{
int i;
for (i = 1; i <= 3; i += 2)
{
CubeCorners[i][3] = Radius * cos((Angle) * Pi / 180);
CubeCorners[i][1] = Radius * sin((Angle) * Pi / 180);
}
for (i = 2; i <= 4; i += 2)
{
CubeCorners[i][3] = Radius * cos((Angle + 2 * 45) * Pi / 180);
CubeCorners[i][1] = Radius * sin((Angle + 2 * 45) * Pi / 180);
}
for (i = 5; i <= 7; i += 2)
{
CubeCorners[i][3] = Radius * cos((Angle + 6 * 45) * Pi / 180);
CubeCorners[i][1] = Radius * sin((Angle + 6 * 45) * Pi / 180);
}
for (i = 6; i <= 8; i += 2)
{
CubeCorners[i][3] = Radius * cos((Angle + 4 * 45) * Pi / 180);
CubeCorners[i][1] = Radius * sin((Angle + 4 * 45) * Pi / 180);
}
for (i = 1; i <= 8; i++)
{
cx[i] = 300 + CubeCorners[i][1] + CubeCorners[i][3] / 8;
if (CubeCorners[i][2] > 0)
cy[i] = 200 + CubeCorners[i][2] + CubeCorners[i][3] / 8;
else if (CubeCorners[i][2] < 0)
cy[i] = 200 + CubeCorners[i][2] - CubeCorners[i][3] / 8;
else
cy[i] = 200 + CubeCorners[i][2];
}
setcolor(color);
moveto(cx[3], cy[3]);
lineto(cx[4], cy[4]);
lineto(cx[8], cy[8]);
lineto(cx[6], cy[6]);
lineto(cx[2], cy[2]);
lineto(cx[4], cy[4]);
moveto(cx[3], cy[3]);
lineto(cx[7], cy[7]);
lineto(cx[8], cy[8]);
moveto(cx[3], cy[3]);
lineto(cx[1], cy[1]);
lineto(cx[2], cy[2]);
moveto(cx[6], cy[6]);
lineto(cx[5], cy[5]);
lineto(cx[1], cy[1]);
moveto(cx[7], cy[7]);
lineto(cx[5], cy[5]);
}