楊淑德 翟曉慶 華順剛
(1 大連理工大學(xué)機(jī)械工程學(xué)院 2 山東理工大學(xué)機(jī)械工程學(xué)院)
?
裝箱布局三維可視化控件開發(fā)*
楊淑德21翟曉慶22華順剛21
(1 大連理工大學(xué)機(jī)械工程學(xué)院2 山東理工大學(xué)機(jī)械工程學(xué)院)
摘要:結(jié)合 OpenGL和ActiveX技術(shù),研究了三維裝箱的可視化問(wèn)題,在Visual Studio環(huán)境下,進(jìn)行面向裝箱布局的三維顯示控件開發(fā)。通過(guò)接口方法獲得貨物配載信息,實(shí)現(xiàn)貨物配載結(jié)果的可視化;為了觀察集裝箱內(nèi)貨物布局,根據(jù)用戶觀察方向與箱壁平面法線方向,判別集裝箱箱壁平面是否繪制。以線框形式顯示貨物,便于查看整體重心和集裝箱幾何中心的位置,從而判斷配載方案的穩(wěn)定性。控件測(cè)試表明,該控件可以根據(jù)配載貨物的特征信息和位置信息,實(shí)現(xiàn)貨物配載整體效果顯示、貨物擺放方式和堆碼層數(shù)顯示、重心顯示和貨物高亮顯示等功能,直觀地展示裝箱配載結(jié)果,便于用戶調(diào)用、觀察、驗(yàn)證和修改裝箱布局方案。
關(guān)鍵詞:ActiveX控件; 裝箱布局; OpenGL; 可視化
1引言
隨著物流業(yè)的快速發(fā)展,物流技術(shù)的應(yīng)用和研究受到越來(lái)越多的重視。產(chǎn)品的配送效率成為影響物流成本和競(jìng)爭(zhēng)力的重要因素。集裝箱配載優(yōu)化布局作為物流配送過(guò)程中的一個(gè)關(guān)鍵性技術(shù), 對(duì)提高
配送業(yè)務(wù)的自動(dòng)化水平,提高配送業(yè)務(wù)的工作效率和規(guī)范業(yè)務(wù)流程等方面都有重要意義[1]。
國(guó)內(nèi)外諸多學(xué)者對(duì)裝箱布局問(wèn)題開展了研究,提出了利用遺傳算法、啟發(fā)式算法和模擬退火算法等進(jìn)行配載的解決方案[2-3]。通過(guò)配載算法對(duì)貨物進(jìn)行布局,快速地設(shè)計(jì)集裝箱裝箱方案,達(dá)到對(duì)集裝箱空間和載重能力的更好利用。裝箱布局結(jié)果的三維可視化可以直觀的顯示貨物的放置情況,有利于設(shè)計(jì)人員驗(yàn)證配載結(jié)果的正確性,便于指導(dǎo)裝箱工人完成裝箱任務(wù)。與現(xiàn)有的多種配載算法相比,對(duì)裝載結(jié)果的可視化研究較為欠缺。Bortfeldt[4]對(duì)啟發(fā)式算法改進(jìn)后沒(méi)有給出直觀的裝箱效果圖,沒(méi)有提供細(xì)節(jié)的顯示。Chien[5]結(jié)合三維裁剪提出配載算法并實(shí)現(xiàn)裝載結(jié)果的顯示,但是只繪制了集裝箱和貨物的輪廓,不容易區(qū)分外形尺寸相近的貨物。郭貝貝[6]開發(fā)的裝箱可視化系統(tǒng)可以顯示貨物給定角度的放置情況和某類貨物的放置情況,無(wú)法全方位的觀察貨物的放置情況。桂思怡等[7]開發(fā)的立體裝箱可視化系統(tǒng)雖然可以實(shí)現(xiàn)手動(dòng)編輯,但是該系統(tǒng)是基于特定算法開發(fā)的。
基于此,本研究對(duì)圖形繪制顯示代碼進(jìn)行封裝,開發(fā)裝箱布局三維可視化控件,便于用戶調(diào)用。用Visual Studio MFC 開發(fā)ActiveX控件,根據(jù)配載優(yōu)化結(jié)果,利用圖形應(yīng)用程序接口OpenGL,根據(jù)視線方向選擇性繪制集裝箱箱壁,完成貨物不同視角觀察結(jié)果的繪制,顯示整體重心和集裝箱幾何中心,高亮顯示用戶查詢的某一托盤單元或貨物。
2OpenGL和ActiveX技術(shù)
OpenGL是獨(dú)立于硬件設(shè)備、窗口系統(tǒng)和操作系統(tǒng)的開放式三維圖形庫(kù),是圖形硬件的軟件接口。具有高度的可移植性和很快的渲染速度。在涉及圖形圖像顯示及處理的應(yīng)用程序開發(fā)中得到了廣泛應(yīng)用[8]。在三維實(shí)體建模、物體坐標(biāo)變換以及紋理貼圖等方面具有強(qiáng)大功能。
組件對(duì)象模型(COM)是關(guān)于如何建立組件以及如何通過(guò)組件構(gòu)建應(yīng)用程序的一個(gè)規(guī)范。在軟件項(xiàng)目中,開發(fā)人員使用COM能快速地定制出新的應(yīng)用程序,從而實(shí)現(xiàn)并行開發(fā)和真正意義上的軟件復(fù)用。ActiveX是基于COM技術(shù)基礎(chǔ),實(shí)現(xiàn)對(duì)象鏈接與嵌入的技術(shù)集,包括ActiveX控件、ActiveX文檔和ActiveX腳本。其中ActiveX控件是最基本和最重要的,程序員可以在Basic、C#、C++以及Java等程序中調(diào)用ActiveX控件進(jìn)行應(yīng)用程序或web頁(yè)面開發(fā)。由于ActiveX控件結(jié)合了OLE功能而能在任何控件容器中正確工作,使其能夠?yàn)楦鞣N不同的編程語(yǔ)言系統(tǒng)和開發(fā)工具所兼容。Visual C++提供了兩種ActiveX控件的開發(fā)工具M(jìn)FC和ATL。其中MFC封裝了OLE復(fù)雜的接口的特性,包括窗口對(duì)象特性和方法、屬性及事件等,無(wú)需深入了解COM對(duì)象原理和機(jī)制,開發(fā)過(guò)程中只需關(guān)注控件本身設(shè)計(jì)[9-10]。
3裝箱布局三維可視化控件接口
接口是控件與外部程序進(jìn)行通信的協(xié)議。外部程序通過(guò)接口提供的屬性和方法來(lái)傳送消息給控件??丶膶傩砸话阌糜诿枋隹丶耐庥^??丶姆椒ㄊ强丶?nèi)部的實(shí)現(xiàn)函數(shù),從控件對(duì)象的外部調(diào)用對(duì)象的方法完成特定功能[9]。本文在可視化控件內(nèi)部編寫接口實(shí)現(xiàn)函數(shù),外部程序通過(guò)調(diào)用控件方法將配載結(jié)果數(shù)據(jù)傳遞到控件內(nèi)部的。
裝箱配載結(jié)果數(shù)據(jù)由集裝箱和一定數(shù)量貨物的特征信息、位置信息組成。結(jié)合裝箱的實(shí)際情況,本文中認(rèn)為長(zhǎng)方體類貨物為規(guī)則形狀貨物,其他形狀貨物均為不規(guī)則貨物。體積大的規(guī)則貨物可以直接裝載,體積小較為零碎的規(guī)則貨物可以利用托盤進(jìn)行裝載;不規(guī)則形狀貨物,用長(zhǎng)方體紙箱或者木箱進(jìn)行包裝后裝載。假設(shè)集裝箱箱體、托盤和打包后的貨物密度均勻,建立描述集裝箱、托盤和貨物信息的數(shù)據(jù)結(jié)構(gòu)體。
本研究設(shè)計(jì)了若干結(jié)構(gòu)體用于存放描述集裝箱、托盤和貨物的位置、外形和顏色的數(shù)據(jù)。用于描述集裝箱的CONTAINER結(jié)構(gòu)體中包括表示集裝箱長(zhǎng)寬高、集裝箱角件長(zhǎng)寬高、角件中心的XYZ坐標(biāo)等數(shù)據(jù)成員;用于描述貨物和托盤的CARGO結(jié)構(gòu)體中包括表示貨物(或者托盤)中心XYZ坐標(biāo)、貨物(或者托盤)長(zhǎng)寬高和貨物(或者托盤)顏色的數(shù)據(jù)成員;用于描述整體重心和集裝箱幾何中心的SPHERE結(jié)構(gòu)體中包括表示球心XYZ坐標(biāo)、球體半徑和球體顏色的數(shù)據(jù)成員。
在Visual C++中,VARIANT 是一個(gè)支持跨語(yǔ)言訪問(wèn)的結(jié)構(gòu)體[11]。該結(jié)構(gòu)體包括vt和union兩個(gè)域,其中vt指定union域中的數(shù)據(jù)類型。SAFEARRAY是Visual C++中的一種結(jié)構(gòu)體,成員數(shù)據(jù)包括數(shù)組成員和說(shuō)明數(shù)組的維數(shù)、長(zhǎng)度、邊界、元素類型等信息的成員。
SAFEARRAY變量一般用于VARIANT中數(shù)組型參數(shù)的傳遞。VARIANT類型變量的成員vt = VT_ARRAY時(shí),可以使用union域中的成員parray,使其指向存有數(shù)組數(shù)據(jù)的SAFEARRAY指針??梢岳肁PI函數(shù)SafeArrayCreate (VARTYPE v, unsigned int cDims, SAFE- ARRRAYBOUND FAR* rgsabound )在堆上創(chuàng)建一維數(shù)組和二維數(shù)組。其中,v指定SAFEARRAY中數(shù)組的數(shù)據(jù)類型;cDims指定SAFEARRAY中數(shù)組的維數(shù);rgsabound指向描述SAFEARRAY中數(shù)組邊界的矢量。
本研究控件方法獲取的數(shù)據(jù)中包含結(jié)構(gòu)體數(shù)組,不能作為ActiveX控件方法的參數(shù)。同時(shí)為保證用戶可以跨語(yǔ)言調(diào)用控件,因此需要將存放集裝箱、托盤和貨物的數(shù)據(jù)的結(jié)構(gòu)體數(shù)組通過(guò)SAFEARRAY變量封裝到VARIANT變量中。繪制圖形所需的數(shù)據(jù)就存儲(chǔ)在SAFEARRAY數(shù)組數(shù)據(jù)成員pvData指針指向的內(nèi)存中。
利用Visual Studio 2010創(chuàng)建MFC ActiveX 控件工程。在自動(dòng)生成的_DGLActiveX類中中添加控件接口方法函數(shù)Display (VARIANT &Sphere, VARIANT &CargoSolid, VARI- ANT&CargoMesh, VARIANT &Contain,VARIANT_BOOL isShowSphere, VARIANT_BOOL MeshAndFill, LONG CargoMeshAmount, LONG CargoSolidAmount)。
其中,方法函數(shù)中各參數(shù)的含義如下:Sphere中存放整體重心和集裝箱幾何中心的數(shù)據(jù);CargoSolid中存放需要以實(shí)體顯示的貨物數(shù)據(jù);CargoMesh中存放需要以線框形式顯示的貨物的數(shù)據(jù);Contain中存放集裝箱的數(shù)據(jù);isShowSphere用來(lái)表示是否需要顯示整體重心和集裝箱的幾何中心;MeshAndFill表示貨物的顯示模式;CargoMeshAmount存放需要以線框形式顯示的貨物數(shù)量;CargoSolidAmount存放需要以實(shí)體顯示的貨物數(shù)量。
在控件中,調(diào)用SafeArrayCreate函數(shù)創(chuàng)建SAFEARRAY指針作為中間變量,使其指向接口方法中VARIANT類型參數(shù)的union中的parray數(shù)據(jù)成員。在CGLActiveX控件工程的CGLActiveXCtrl類定義中,聲明SAFEARRAY類型的全局指針變量pArraySp、pArrayCon、pArrayMesh和pArraySolid,在控件方法函數(shù)中調(diào)用SafeArrayCreate函數(shù)在堆上為它們分配存儲(chǔ)空間。將Sphere、Contain、CargoMesh和CargoSolid的成員parray分別賦值給上述四個(gè)SAFEARRAY指針變量。
控件方法函數(shù)中創(chuàng)建安全數(shù)組并賦值的代碼如下:
pArraySp = SafeArrayCreate(VT_I4,2, BoundSp);
//創(chuàng)建存儲(chǔ)重心數(shù)據(jù)的二維數(shù)組
pArraySp = Sphere.parray;
pArrayCon = SafeArrayCreate(VT_I4,1,BoundCon);
//創(chuàng)建存儲(chǔ)箱體數(shù)據(jù)的一維數(shù)組
pArrayCon = Contain.parray;
pArraySolid = SafeArrayCreate(VT_I4,2, BoundSolid);
//創(chuàng)建存儲(chǔ)實(shí)體貨物數(shù)據(jù)的二維數(shù)組
pArraySolid = CargoSolid.parray;
pArrayMesh = SafeArrayCreate(VT_I4,2, BoundMesh);
//創(chuàng)建存儲(chǔ)邊框貨物數(shù)據(jù)的二維數(shù)組
pArrayMesh = CargoMesh.parray;
4基于OpenGL的裝箱布局圖形繪制
OpenGL繪制幾何圖元的方法有立即模式、顯示列表和緩沖區(qū)對(duì)象。其中,立即模式是指定完圖元之后將所有數(shù)據(jù)發(fā)往渲染管線后立即被渲染。一次一個(gè)頂點(diǎn)地指定幾何對(duì)象,或者使用頂點(diǎn)數(shù)組,一次性的繪制大量圖元。顯示列表模式是利用預(yù)編譯的命令列表的渲染模式。把繪圖命令和數(shù)據(jù)先進(jìn)行預(yù)處理,然后保存起來(lái),以后調(diào)用的時(shí)候可以快速地拷貝到命令緩沖區(qū)然后執(zhí)行。緩沖區(qū)對(duì)象多用于紋理貼圖與動(dòng)畫制作中[8]。
顯示列表中不能存入傳遞參數(shù)或返回值的函數(shù)。索引頂點(diǎn)數(shù)組的頂點(diǎn)變換工作量也比立即模式和顯示列表少得多。在有較大平滑表面的模型或靜態(tài)圖形中,索引頂點(diǎn)數(shù)組的效率高于顯示列表[12]。
本研究中繪圖命令中包含返回值的函數(shù),同時(shí)繪制的是表面光滑的靜態(tài)圖形,因此采用立即模式,使用索引頂點(diǎn)數(shù)組方式,完成幾何圖元繪制。
4.1OpenGL繪圖環(huán)境設(shè)置
OpenGL采用渲染上下文Render Context (RC) 的繪圖方式,繪圖前需要設(shè)置渲染環(huán)境[13-15]。為了獲得模型更全面的信息,需要對(duì)三維模型進(jìn)行幾何變換。幾何變換包括模型變換和視點(diǎn)變換。模型變換時(shí),固定觀察點(diǎn)的位置和方向,在觀察范圍內(nèi)對(duì)模型進(jìn)行旋轉(zhuǎn)、平移和縮放操作,獲得不同的觀察效果圖。視點(diǎn)變換是改變觀察點(diǎn)的位置和方向后對(duì)模型進(jìn)行觀察,而不對(duì)模型進(jìn)行變換。模型變換需要調(diào)用GL庫(kù)中的glTranslate函數(shù)和glScale函數(shù)配合使用完成。視點(diǎn)變換利用GLU函數(shù)庫(kù)中的gluLookAt函數(shù)設(shè)置觀察點(diǎn)的位置坐標(biāo)、被觀察點(diǎn)的位置坐標(biāo)和向上方向的向量完成。模型變換矩陣和視點(diǎn)變換矩陣共同構(gòu)成模型視景矩陣。
本研究在控件工程自動(dòng)生成的CGLActiveXCtrl類中添加設(shè)置OpenGL像素格式和渲染環(huán)境的成員函數(shù),完成像素格式和渲染環(huán)境RC設(shè)置。通過(guò)視點(diǎn)變換指定觀察點(diǎn)的位置和方向,根據(jù)觀察點(diǎn)的位置和方向,選擇性繪制集裝箱的各個(gè)平面,通過(guò)模型變換在適當(dāng)位置繪制出指定尺寸的貨物。通過(guò)視點(diǎn)變換和模型變換相結(jié)合實(shí)現(xiàn)集裝箱裝載的三維可視化,控件的繪圖流程如圖1所示。
圖1 ActiveX控件繪圖流程圖
4.2集裝箱面的顯示
OpenGL對(duì)三角形圖元和四邊形圖元均提供了加速處理。集裝箱和貨物均為長(zhǎng)方體,因此本研究采用四邊形圖元繪制集裝箱箱壁。為了觀察集裝箱內(nèi)貨物的放置情況,選擇性繪制箱壁,采用填充圖完成需要顯示箱壁的繪制。
如圖2(a)所示長(zhǎng)方體代表集裝箱,給定8個(gè)頂點(diǎn)A(xa,ya,za)、B(xb,yb,zb) 、C(xc,yc,zc) 、D(xd,yd,zd) 、O(xo,yo,zo) 、E(xe,ye,ze) 、F(xf,yf,zf) 、G(xgyg,zg) 的坐標(biāo)。矢量ɑ所示的方向代表視線方向。根據(jù)每個(gè)箱壁平面的三個(gè)頂點(diǎn),計(jì)算對(duì)應(yīng)箱壁的外法線方向。
以平面ABCD為例,根據(jù)點(diǎn)A、B、C坐標(biāo)計(jì)算外法線方向
(1)
給定觀察的視線方向a,計(jì)算視線方向與外法線夾角θ余弦
(2)
若cosθ,表示該平面為集裝箱的背面(遠(yuǎn)離觀察者),應(yīng)繪制平面;若cosθ≤ 0,不繪制該平面,便于觀察內(nèi)部貨物。如圖2(a)所示視點(diǎn)位置和方向,通過(guò)公式(1)和(2)對(duì)集裝箱的六個(gè)平面分別進(jìn)行判斷,只需繪制平面AOGD、平面ABEO和平面OEFG,箱體繪制結(jié)果示意圖如圖2(b)所示。
圖2 箱體繪制示意圖
為改善箱體的空間立體感,采用與填充面不同的顏色繪制箱體輪廓。箱體輪廓線與箱體填充面的邊界具有相同的深度值,發(fā)生像素重疊。由于在渲染環(huán)境設(shè)置中打開了深度檢測(cè)功能,后繪制的輪廓線無(wú)法遮擋前面繪制的圖形導(dǎo)致在重疊區(qū)域發(fā)生像素閃爍。在OpenGL渲染環(huán)境設(shè)置函數(shù)中啟用多邊形深度偏移量,并調(diào)用glPolygonOffset函數(shù)在深度緩存區(qū)中對(duì)多邊形的深度進(jìn)行修正,解決填充面和邊框同時(shí)顯示區(qū)域的像素閃爍問(wèn)題,從而得到清晰立體的集裝箱箱體圖。進(jìn)行視點(diǎn)變換通過(guò)改變gluLookAt的參數(shù)改變觀察點(diǎn)的位置和方向,繪制不同的箱壁平面,繪制效果如圖3所示。在后續(xù)的貨物實(shí)體繪制工作中,采用與此相同的方式實(shí)現(xiàn)貨物不同視角觀察結(jié)果的圖形繪制。
圖3 不同視角觀察箱壁繪制效果圖
4.3貨物實(shí)體顯示
根據(jù)貨物的配載計(jì)算結(jié)果,利用OpenGL圖形庫(kù)在ActiveX控件上完成貨物三維實(shí)體顯示,實(shí)現(xiàn)了貨物在集裝箱內(nèi)的布局情況的可視化和裝箱過(guò)程的透明化。
OpenGL在顯示物體的空間中定義一個(gè)始終固定不變的世界坐標(biāo)系和一個(gè)以物體的中心為坐標(biāo)原點(diǎn)的局部坐標(biāo)系。物體的旋轉(zhuǎn)或平移等操作都是圍繞局部坐標(biāo)系進(jìn)行的。當(dāng)物體模型進(jìn)行旋轉(zhuǎn)或平移等操作時(shí),局部坐標(biāo)系也執(zhí)行相應(yīng)的旋轉(zhuǎn)或平移操作。對(duì)物體模型進(jìn)行縮放則局部坐標(biāo)系也進(jìn)行相應(yīng)的縮放[8]。先將局部坐標(biāo)系移動(dòng)到貨物中心位置處,然后再對(duì)各個(gè)坐標(biāo)軸進(jìn)行縮放,保證在目標(biāo)位置將貨物繪出。
OpenGL創(chuàng)建三維實(shí)體對(duì)象時(shí),利用提供的點(diǎn)、線、面等基本圖元在三維空間進(jìn)行組合而實(shí)現(xiàn)。OpenGL的GLUT工具包中提供了圓錐體、四面體、正方體等三維實(shí)體對(duì)象,因此可以直接調(diào)用GLUT工具包中的函數(shù)繪制三維實(shí)體。利用glutSolidCube函數(shù)繪制正方體,通過(guò)一系列的移動(dòng)和拉伸命令在任意位置繪制任意尺寸的長(zhǎng)方體。
以表1所示貨物的裝載為例,完成全部貨物在集裝箱內(nèi)放置情況的顯示。
表1 裝載任務(wù)信息列表
不同種類的貨物以不同RGB值描述的顏色來(lái)表示,承載不同貨物的托盤不予區(qū)分采用相同顏色繪制。調(diào)用glColor3f設(shè)置貨物實(shí)體顏色,調(diào)用glTranslatef將坐標(biāo)系移動(dòng)到指定位置,調(diào)用glScalef對(duì)XYZ坐標(biāo)方向尺寸進(jìn)行縮放。調(diào)用glutSolidCube繪制指定位置的實(shí)體貨物。此時(shí)繪制的三維實(shí)體均用當(dāng)前繪圖色以填充面形式繪出。
在一次繪圖過(guò)程中可能要繪制許多的長(zhǎng)方體模型,利用托盤裝載的貨物也需要體現(xiàn)在一個(gè)托盤上貨物的放置情況。為了顯示裝載細(xì)節(jié),區(qū)分同類貨物的不同個(gè)體,清晰展示配載貨物的行數(shù)、列數(shù)、層數(shù),因此需要在繪制的實(shí)體模型基礎(chǔ)上對(duì)每個(gè)貨物繪制黑色邊框來(lái)區(qū)分不同貨物單體。將繪圖色指定為黑色,然后使用glutWireCube命令繪制貨物邊框。繪制的線框圖與實(shí)體圖尺寸和位置均相同,兩者具有相同的深度偏移量,發(fā)生像素重疊,在OpenGL渲染環(huán)境設(shè)置函數(shù)中設(shè)置多邊形深度偏移量消除像素閃爍。如圖4所示為表1給定任務(wù)的用兩個(gè)集裝箱裝載結(jié)果圖,用兩個(gè)集裝箱完成裝載的放置結(jié)果實(shí)體圖。其中C1、C2、C3、C4、C5、C6所指的小長(zhǎng)方體表示該類貨物的一個(gè)單元體。在裝載結(jié)果中可以根據(jù)需要高亮顯示集裝箱中任意一個(gè)托盤單元或者任意單個(gè)貨物,如圖5所示。
圖4 裝配結(jié)果
圖5 裝載貨物高亮顯示
4.4整體重心和集裝箱幾何中心的顯示
集裝箱的裝載貨物時(shí)要滿足運(yùn)輸穩(wěn)定性約束,要求配載完成后整體的重心盡量接近于集裝箱的幾何中心。為了觀察配載完成后的箱體幾何中心和綜合重心之間的位置關(guān)系,可以繪制貨物的輪廓。兩者的位置關(guān)系通過(guò)在相應(yīng)位置處繪制球體示意,貨物輪廓的顏色與實(shí)體顏色一致以區(qū)分不同種類的貨物。
將整體重心和集裝箱幾何中心的數(shù)據(jù)分別讀取到SPHERE結(jié)構(gòu)體變量MultiCenter和GeoCenter中。使用glLineWidth函數(shù)和glColor3f函數(shù)設(shè)置線條寬度和當(dāng)前繪圖顏色。調(diào)用GLUT工具包函數(shù)glutWireCube完成貨物輪廓的繪制。整體重心和集裝箱幾何中心以實(shí)體的形式通過(guò)glutSolidSphere函數(shù)完成顯示。程序默認(rèn)的初始輸出結(jié)果是三維實(shí)體狀態(tài),此時(shí)不進(jìn)行重心繪制。在顯示模式下拉列表中將當(dāng)前模式設(shè)置為重心顯示,繪制貨物輪廓、整體重心和集裝箱幾何中心,圖6所示為整體重心和集裝箱幾何中心不重合情況的顯示效果圖。圖中A點(diǎn)為集裝箱幾何中心,B點(diǎn)為整體重心。
圖6 顯示整體重心和集裝箱幾何中心
4.5裝箱布局可視化控件測(cè)試
將控件工程拷貝到貨物配載解決方案目錄下,打開貨物配載解決方案。在解決方案管理器中配載解決方案上右鍵選擇add->existing project,完成控件工程的添加。在add existing project對(duì)話框中選擇貨物配載解決方案目錄下的控件工程,將控件工程添加到貨物配載解決方案中。在需要調(diào)用控件的項(xiàng)目中添加控件工程的引用,這樣就可以在工程中使用該控件了。
對(duì)表1所示任務(wù)進(jìn)行優(yōu)化配載后,第一個(gè)集裝箱的輸出結(jié)果如圖7所示。
圖7 程序運(yùn)行結(jié)果圖
5結(jié)語(yǔ)
本研究在Visual Studio2010環(huán)境下,用MFC實(shí)現(xiàn)了基于OpenGL的三維圖形顯示ActiveX控件開發(fā)。該控件圍繞裝箱布局三維可視化進(jìn)行開發(fā),讀取并顯示裝箱布局結(jié)果??梢愿鶕?jù)用戶需要高亮顯示部分貨物或者從不同角度觀察集裝箱內(nèi)貨物的布局情況,使裝箱配載方案變得清晰直觀。本研究對(duì)裝箱布局優(yōu)化的顯示模塊進(jìn)行封裝,在需要進(jìn)行三維顯示的地方只需調(diào)用控件即可,降低了程序的復(fù)雜度,便于程序的升級(jí)維護(hù)??梢灾庇^地查看幾何中心和綜合重心的位置關(guān)系,便于配載設(shè)計(jì)人員對(duì)裝箱配載結(jié)果的穩(wěn)定性進(jìn)行初步判斷。
參 考 文 獻(xiàn)
[1]薛蓮. 同一規(guī)格貨物集裝箱裝載問(wèn)題研究及其在物流行業(yè)的應(yīng)用[D]. 天津: 天津大學(xué), 2008.
[2]翟鈺. 三維裝箱問(wèn)題的混合遺傳算法[D].上海: 上海交通大學(xué), 2007.
[3]趙鐘榮. 基于改進(jìn)遺傳算法的集裝箱裝載優(yōu)化方法研究[D].上海: 上海交通大學(xué), 2010.
[4]BORTFELDT A,MACK D. A Heuristic for the Three-dimensional Strip Packing Problem[J].European Journal of Operational Research,2007,183(3):1267- 1279.
[5]CHIEN C F,DENG J F.A Container Packing Support System for Determining and Visualizing Container Packing Patterns[J].Decision Support Systems,2004,37(1):23-34.
[6]郭貝貝. 復(fù)雜集裝箱裝載問(wèn)題研究及可視化實(shí)現(xiàn)[D].大連:大連海事大學(xué), 2009.
[7]桂思怡. 基于DirectX的立體裝箱系統(tǒng)3D可視化技術(shù)研究[D]. 大連: 大連海事大學(xué), 2014.
[8]WRIGHT R S,LIPCHAK B,HAEMEL N.OpenGL超級(jí)寶典[M].張琪, 付飛, 譯. 4版. 北京: 人民郵電出版社, 2010:18-409.
[9]孫鑫, 余安萍. VC++深入詳解[M]. 北京: 電子工業(yè)出版社, 2006: 660-699.
[10]KRUGLINSKI D,WINGO S,SHEPHERD G.Programming Visual C++6.0技術(shù)內(nèi)幕[M]. 希望圖書創(chuàng)作室,譯. 5版. 北京: 北京希望電子出版社, 2002:550-666.
[11]MICROSOFT. Development Tools and Languages[EB/OL]. https://msdn.microsoft.com/en-us/library/aa187916.aspx, [2015-06-22].
[12]曹洪軍, 原英. 利用OpenGL實(shí)現(xiàn)三維繪圖[J]. 內(nèi)蒙古農(nóng)業(yè)大學(xué)學(xué)報(bào)(自然科學(xué)版), 2002,23(3):98-102.
[13]匡天君,滕遠(yuǎn)道,王乘等.基于MFC和OpenGL三維圖形的開發(fā)[J]. 微計(jì)算機(jī)信息:測(cè)控儀表自動(dòng)化, 2004, 20(6):115-116,119.
[14]萬(wàn)浩.基于OpenGL的虛擬儀器三維控件設(shè)計(jì)[D].武漢: 華中科技大學(xué), 2008.
[15]黃常標(biāo), 江開勇, 林俊義. 基于OpenGL視景體的三維CAD模型交互顯示研究[J]. 機(jī)械設(shè)計(jì)與制造, 2011,10:74-76.
Development of the 3D Visualization Control for Containers' Loading Layout
Yang Shude1Zhai Xiaoqing2Hua Shungang1
(1 School of Mechanical Engineering Dalian University of Technology 2 School of Machinery Engineering Shandong University of Technology)
Abstract:3D visualization of the container loading layout is researched by using ActiveX and OpenGL in this paper. A visualization control is developed based on cargoes' shape and location under Visual Studio environment. The stowage data is obtained using the interface function to render the cargoes in the container. In order to observe the cargoes conveniently, surfaces of the container near observer are not rendered according to the relationship between the eye-gaze direction and the normal of surface. The gravity of cargoes is displayed and then we can predict the stability of entire container. The test results show that the control facilitates users to display the cargoes' layout involving placement mode, stack number, gravity center, as well as validate and modify the stowage scheme.
Key words:activeX control; container loading layout; OpenGL; visualization
DOI:10.3963/j.issn.1000-8969.2016.02.003
收稿日期:2015-09-23
基金項(xiàng)目:國(guó)家部委科研項(xiàng)目(104010103)
楊淑德: 116024, 遼寧省大連市甘井子區(qū)凌工路2號(hào)