版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
多屏同時三維(3D)顯示技術(shù)研究技術(shù)報(bào)告目錄1 項(xiàng)目背景 錯誤!未定義書簽。2 項(xiàng)目研究內(nèi)容 12.1 3D顯示數(shù)據(jù)模型的選型研究 12.2 適合實(shí)現(xiàn)多屏幕3D顯示的軟件開發(fā)平臺和開發(fā)工具的選型 12.3 在單計(jì)算機(jī)上實(shí)現(xiàn)多屏幕3D控制的軟件實(shí)現(xiàn)辦法 12.4 多機(jī)多屏幕3D顯示通信合同和多點(diǎn)交互控制方略設(shè)計(jì) 13 技術(shù)路線 23.1 設(shè)計(jì)原則 23.2 技術(shù)路線 33.2.1 3D顯示數(shù)據(jù)模型的擬定 33.2.2 軟件開發(fā)平臺和開發(fā)工具的擬定 33.2.3 單機(jī)多顯系統(tǒng)硬件實(shí)現(xiàn)辦法 43.2.4 單機(jī)多顯系統(tǒng)硬件檢測實(shí)現(xiàn)辦法 43.2.5 OpenGL顯示實(shí)現(xiàn)辦法 43.2.6 單機(jī)多顯系統(tǒng)OpenGL多顯示屏顯示實(shí)現(xiàn)辦法 53.2.7 OpenGL控制實(shí)現(xiàn)3D對象平移的辦法 63.2.8 OpenGL控制實(shí)現(xiàn)3D旋轉(zhuǎn)的辦法 63.2.9 單機(jī)多顯系統(tǒng)同時控制實(shí)現(xiàn)辦法 63.2.10 單機(jī)多顯系統(tǒng)鳥瞰導(dǎo)游實(shí)現(xiàn)辦法 73.2.11 3DS文獻(xiàn)轉(zhuǎn)換實(shí)現(xiàn)辦法 83.2.12 多機(jī)多顯系統(tǒng)通信合同實(shí)現(xiàn)辦法 103.2.13 多機(jī)多顯系統(tǒng)同時控制實(shí)現(xiàn)辦法 183.2.14 多機(jī)多顯系統(tǒng)數(shù)據(jù)更新實(shí)現(xiàn)辦法 244 系統(tǒng)環(huán)境 274.1 系統(tǒng)硬件環(huán)境 274.1.1 單機(jī)多顯系統(tǒng)硬件環(huán)境 274.1.2 多機(jī)多顯系統(tǒng)硬件環(huán)境 284.2 系統(tǒng)軟件環(huán)境 285 系統(tǒng)功效設(shè)計(jì) 285.1 單計(jì)算機(jī)對多顯示屏的同時控制功效 285.2 單機(jī)多顯系統(tǒng)3D瀏覽和控制功效 295.2.1 任意方向旋轉(zhuǎn)功效 295.2.2 平移功效 295.2.3 顯示比例自動調(diào)節(jié)功效 295.2.4 放大和縮小功效 295.2.5 視角設(shè)立功效 305.2.6 背景顏色設(shè)立功效 305.2.7 繪制模式切換功效 305.2.8 鳥瞰導(dǎo)游功效 305.2.9 自動演示和測試功效 315.3 多機(jī)多顯系統(tǒng)3D瀏覽和控制功效 315.3.1 多計(jì)算機(jī)信息顯示功效 315.3.2 多計(jì)算機(jī)協(xié)同工作功效 315.3.3 任意方向旋轉(zhuǎn)功效 325.3.4 平移功效 325.3.5 顯示比例自動調(diào)節(jié)功效 325.3.6 放大和縮小功效 325.3.7 視角設(shè)立功效 335.3.8 背景顏色設(shè)立功效 335.3.9 繪制模式切換功效 335.3.10 其它計(jì)算機(jī)窗口顯示和控制功效 335.3.11 3D數(shù)據(jù)自動同時功效 346 總結(jié) 錯誤!未定義書簽。7 術(shù)語解釋 348 參考資料 錯誤!未定義書簽。項(xiàng)目研究內(nèi)容3D顯示數(shù)據(jù)模型的選型研究重要研究被顯示對象的數(shù)據(jù)表達(dá)辦法。3D模型選型方面,既要考慮到軟件實(shí)現(xiàn)的容易性和可靠性,還要考慮顯示解決的實(shí)時性。特別在網(wǎng)絡(luò)環(huán)境下,3D數(shù)據(jù)模型的選擇將直接影響到數(shù)據(jù)更新和同時顯示的性能。適合實(shí)現(xiàn)多屏幕3D顯示的軟件開發(fā)平臺和開發(fā)工具的選型本研究項(xiàng)目涉及單機(jī)和網(wǎng)絡(luò)兩種硬件平臺。單機(jī)硬件平臺中,重要研究多顯示適配器的選型和控制辦法,要考慮和所選用的軟件運(yùn)行平臺及開發(fā)工具的兼容性;網(wǎng)絡(luò)硬件平臺則選用較普遍的運(yùn)行TCP/IP合同的網(wǎng)絡(luò)。軟件技術(shù)研究方面,涉及操作系統(tǒng)的選擇,軟件開發(fā)平臺和開發(fā)工具的選擇。這些選擇必須適合3D顯示的編程和控制算法的實(shí)現(xiàn)。在單計(jì)算機(jī)上實(shí)現(xiàn)多屏幕3D控制的軟件實(shí)現(xiàn)辦法重要研究如何實(shí)現(xiàn)單計(jì)算機(jī)對多屏幕的控制辦法,涉及硬件方案和軟件控制辦法。為了達(dá)成高層次3D多屏顯示的目的,所選的硬件方案必須能夠?qū)崿F(xiàn)不同屏幕的不同控制。軟件控制算法的研究要能夠?qū)崿F(xiàn)對多顯示適配器的靈活控制,并能實(shí)現(xiàn)不同顯示之間的協(xié)調(diào)解決。多機(jī)多屏幕3D顯示通信合同和多點(diǎn)交互控制方略設(shè)計(jì)重要研究如何實(shí)現(xiàn)網(wǎng)絡(luò)上的計(jì)算機(jī)間同時協(xié)調(diào)顯示的控制方略和軟件控制算法。本部分的研究涉及通信合同的設(shè)計(jì)和多點(diǎn)交互控制方略的設(shè)計(jì)。軟件控制算法要在考慮到與所運(yùn)行的網(wǎng)絡(luò)平臺兼容的基礎(chǔ)上,更多地考慮軟件的通用性、易用性和可移植性,應(yīng)充足運(yùn)用單機(jī)多屏顯示軟件的研究成果,避免重復(fù)研究。技術(shù)路線設(shè)計(jì)原則3D顯示數(shù)據(jù)模型的選型設(shè)計(jì)原則所選用的3D顯示數(shù)據(jù)模型必須含有普遍性和易操作性。普遍性是指能夠代表多數(shù)3D軟件所采用的模型,這樣,所研制系統(tǒng)的合用范疇大,含有較高的應(yīng)用價(jià)值;易操作性是指易于進(jìn)行顯示解決,且能夠?qū)崿F(xiàn)靈活的瀏覽操作。多屏幕3D顯示的軟件開發(fā)平臺和開發(fā)工具的選型原則軟件開發(fā)(運(yùn)行)平臺要選擇兼容性好,功效和性能滿足3D實(shí)時瀏覽需求,且含有較廣泛的開發(fā)和應(yīng)用軟件的平臺。開發(fā)工具的選擇要和所選擇的3D數(shù)據(jù)模型含有較好的共容性,既能方便地使用和操作3D數(shù)據(jù)模型,又能實(shí)現(xiàn)項(xiàng)目所需要的功效并達(dá)成項(xiàng)目預(yù)定的性能。單計(jì)算機(jī)實(shí)現(xiàn)多屏幕3D控制的硬件設(shè)計(jì)原則單計(jì)算機(jī)實(shí)現(xiàn)多屏幕3D控制的硬件選擇要含有普遍性,盡量避免應(yīng)用面小的專用設(shè)備和配件,除了達(dá)成項(xiàng)目功效和性能規(guī)定外,還必須預(yù)留一定的余量,方便應(yīng)對不可預(yù)見的性能問題。所選的硬件還要考慮其兼容性、可擴(kuò)展性和性價(jià)比,應(yīng)當(dāng)選用品有發(fā)展前景和更新?lián)Q代可能性的系列通用硬件產(chǎn)品。單計(jì)算機(jī)實(shí)現(xiàn)多屏幕3D控制的軟件設(shè)計(jì)原則單計(jì)算機(jī)多屏幕3D控制軟件的設(shè)計(jì)應(yīng)含有通用性,應(yīng)避免對特定硬件含有依賴性的特殊軟件開發(fā)和設(shè)計(jì)技術(shù)的使用。應(yīng)避免底層軟件的開發(fā),盡量使用易于移植、易于擴(kuò)展的高層軟件設(shè)計(jì)技術(shù)。多機(jī)多屏幕3D顯示通信合同設(shè)計(jì)原則通信合同的設(shè)計(jì)要滿足項(xiàng)目對可靠性和實(shí)時性的規(guī)定。通信合同要基于成熟可靠的網(wǎng)絡(luò)合同,所選用的網(wǎng)絡(luò)合同必須確保數(shù)據(jù)通信能夠可靠且實(shí)時地進(jìn)行。合同數(shù)據(jù)本身應(yīng)盡量短小靈活且含有較好的擴(kuò)展性,短小靈活的合同利于進(jìn)行快速傳輸,良好的擴(kuò)展性利于進(jìn)行系統(tǒng)功效的擴(kuò)充和應(yīng)對不可預(yù)見的性能問題。多機(jī)多屏幕3D顯示多點(diǎn)交互控制方略設(shè)計(jì)原則多機(jī)多屏幕3D顯示系統(tǒng)的特點(diǎn)是多計(jì)算機(jī)系統(tǒng)和多顧客操作,多計(jì)算機(jī)協(xié)同解決和和諧的顧客操作界面及良好的操作體驗(yàn)是系統(tǒng)設(shè)計(jì)的目的。要達(dá)成系統(tǒng)的設(shè)計(jì)目的,所設(shè)計(jì)的交互控制方略首先必須避免多計(jì)算機(jī)的控制沖突,另一方面是實(shí)現(xiàn)顧客的和諧操作界面和良好的操作體驗(yàn)。最后,所設(shè)計(jì)的控制方略還要含有較好的容錯特性并實(shí)現(xiàn)系統(tǒng)的易用性和易維護(hù)性。技術(shù)路線3D顯示數(shù)據(jù)模型的擬定本項(xiàng)目最后擬定的3D顯示數(shù)據(jù)模型方案是以O(shè)penGL模型為基礎(chǔ),3DS文獻(xiàn)為數(shù)據(jù)輸入格式的方案。OpenGL是三維圖形技術(shù)的基礎(chǔ),許多專業(yè)的3D軟件,如AutoCAD和3DMax等都是以O(shè)penGL為基礎(chǔ)的。OpenGL是現(xiàn)在較為完善的三維圖形原則,它是一種與硬件無關(guān)的接口,獨(dú)立于窗口系統(tǒng)、操作系統(tǒng)和硬件系統(tǒng),能夠應(yīng)用于多個不同的硬件平臺和多個網(wǎng)絡(luò)環(huán)境。使用OpenGL能夠?qū)?D顯示進(jìn)行非常完全的控制,能夠?qū)崿F(xiàn)較高的顯示性能。軟件開發(fā)平臺和開發(fā)工具的擬定本項(xiàng)目最后選用Windows操作系統(tǒng)作為本項(xiàng)目軟件的開發(fā)和運(yùn)行平臺。由于本項(xiàng)目重要涉及圖形圖像顯示,因此首先應(yīng)選擇含有圖形界面的運(yùn)行平臺;同時又為了使本項(xiàng)目開發(fā)的應(yīng)用軟件運(yùn)行在較通用的系統(tǒng)上,因此選擇Windows操作系統(tǒng)。Windows系統(tǒng)下軟件的最佳開發(fā)工具當(dāng)屬VC++開發(fā)工具,VC++內(nèi)嵌了對OpenGL的支持,且其WinSock對TCP/IP也含有良好的支持,這使VC++不僅適合于單機(jī)多顯系統(tǒng)的開發(fā),也適合于網(wǎng)絡(luò)版的多機(jī)多顯3D同時系統(tǒng)的開發(fā),因此本項(xiàng)目的開發(fā)環(huán)境選擇的是基于Windows操作系統(tǒng)下的VC++開發(fā)環(huán)境。單機(jī)多顯系統(tǒng)硬件實(shí)現(xiàn)辦法本項(xiàng)研究的第一步是實(shí)現(xiàn)單臺計(jì)算機(jī)在Windows98系統(tǒng)上對多個顯示屏的顯示控制。通過在一臺計(jì)算機(jī)上插入兩塊完全同樣的顯示適配器,運(yùn)用Windows98對多屏顯示的支持,實(shí)現(xiàn)單臺計(jì)算機(jī)對兩個顯示屏的控制,并能夠通過VC編程,實(shí)現(xiàn)自編程序在不同顯示屏上的顯示控制,達(dá)成了自編應(yīng)用程序能夠在不同顯示屏上顯示不同內(nèi)容的目的。本項(xiàng)研究的第二步是實(shí)現(xiàn)單臺計(jì)算機(jī)在WindowsXP系統(tǒng)上對多個顯示屏的顯示控制。實(shí)現(xiàn)辦法和Windows98類似,但必須選用較新的顯示適配器才干實(shí)現(xiàn)。本項(xiàng)研究的第三步是實(shí)現(xiàn)自編應(yīng)用程序在多個顯示屏上實(shí)現(xiàn)3D顯示的支持。通過對多個顯示適配器的研究,最后擬定了PCI和AGP兩塊顯示適配器共存的方案和兩塊完全相似的PCI-E顯示適配器的方案,實(shí)現(xiàn)了在不同顯示屏上同時、同時顯示3D對象的硬件環(huán)境。單機(jī)多顯系統(tǒng)硬件檢測實(shí)現(xiàn)辦法單機(jī)多顯系統(tǒng)對多顯示屏的控制和檢測運(yùn)用了Windows操作系統(tǒng)的虛擬桌面擴(kuò)展機(jī)制。該機(jī)制將Windows的桌面定義為一種非常大的邏輯空間,與各顯示適配器相連的顯示屏都位于這個邏輯空間中的一種特定位置。通過指定主顯示屏,并運(yùn)用操作系統(tǒng)桌面擴(kuò)展功效,對各顯示屏的位置進(jìn)行設(shè)立,將其它顯示屏設(shè)立到以主顯示屏為參考的特定空間。先用函數(shù)GetSystemMetrics()得到主窗口的參數(shù),然后根據(jù)主窗口的參數(shù)和各顯示區(qū)的相對位置,通過函數(shù)MonitorFromPoint()檢測各顯示屏對應(yīng)顯示區(qū)的活動狀態(tài),對于處在活動狀態(tài)的顯示區(qū),再用函數(shù)GetMonitorInfo()得到對應(yīng)的顯示區(qū)參數(shù),從而實(shí)現(xiàn)軟件對多顯示屏的自動檢測功效。OpenGL顯示實(shí)現(xiàn)辦法OpenGL進(jìn)行3D顯示控制的辦法是:(1)進(jìn)行OpenGL的初始化解決,涉及建立所需的像素格式、得到指定設(shè)備環(huán)境的像素模式索引值并據(jù)此聲明一種像素模式等。(2)通過wglCreateContext()函數(shù)用特定視窗關(guān)聯(lián)的上下文設(shè)備環(huán)境創(chuàng)立一種OpenGL上下文設(shè)備環(huán)境。3D繪制由下面四個環(huán)節(jié)重復(fù)構(gòu)成:(3)用wglMakeCurrent(Hdc)函數(shù)將特定窗口的設(shè)備環(huán)境設(shè)立為現(xiàn)在OpenGL環(huán)境。(4)執(zhí)行OpenGL的繪制操作,該環(huán)節(jié)涉及下列子環(huán)節(jié):a.調(diào)用glPushMatrix()保存現(xiàn)在變換矩陣。b.調(diào)用glLoadIdentity()將現(xiàn)在變換矩陣設(shè)立為單位矩陣。c.調(diào)用gluLookAt()定義視角變換。d.調(diào)用glMultMatrixf()設(shè)立現(xiàn)在變換矩陣。e.對于每一種要顯示的3D對象數(shù)據(jù),調(diào)用glBegin(ViewMode)和glEnd(),按指定模式進(jìn)行3D繪制,并在這兩個函數(shù)的調(diào)用之間繪制該對象的全部面片,其中涉及調(diào)用glNormal3f()設(shè)立每一種頂點(diǎn)的法線方向、根據(jù)頂點(diǎn)數(shù)據(jù)的性質(zhì)設(shè)立紋理、顏色和材質(zhì),最后調(diào)用glVertex3f()設(shè)立該頂點(diǎn)。f.調(diào)用glPopMatrix()恢復(fù)保存的變換矩陣。(5)用SwapBuffers(wglGetCurrentDC())交換前后臺顯示緩沖區(qū)。(6)用wglMakeCurrent(NULL,NULL)釋放OpenGL上下文設(shè)備環(huán)境。單機(jī)多顯系統(tǒng)OpenGL多顯示屏顯示實(shí)現(xiàn)辦法OpenGL支持多顯示屏的辦法以下:OpenGL的繪制是面對窗口的,在上述運(yùn)用OpenGL進(jìn)行3D繪制的環(huán)節(jié)2中,為了創(chuàng)立OpenGL的上下文設(shè)備環(huán)境,必須指定一種Windows對應(yīng)的窗口,一旦為某個OpenGL設(shè)備環(huán)境指定了一種窗口,在該OpenGL設(shè)備上的繪制都將出現(xiàn)在所指定的窗口中。因此將Windows多顯示屏技術(shù)和OpenGL顯示技術(shù)結(jié)合是實(shí)現(xiàn)OpenGL對多顯示屏支持的核心。具體做法是:將Windows應(yīng)用程序的視窗作為第一種顯示窗口(主顯示屏),創(chuàng)立三個無模態(tài)對話框,并將其位置分別設(shè)立在擴(kuò)展的三個子顯示屏所在的區(qū)域。分別創(chuàng)立四個OpenGL上下文設(shè)備環(huán)境,并分別將他們的顯示窗口指定為主顯示屏和其它三個子顯示屏。用wglMakeCurrent(Hdc)函數(shù)將現(xiàn)在OpenGL繪制設(shè)備指定為特定的顯示屏并在所選定的OpenGL設(shè)備上進(jìn)行對應(yīng)顯示屏的繪制,實(shí)現(xiàn)OpenGL在不同的顯示屏上進(jìn)行不同的繪制解決。OpenGL控制實(shí)現(xiàn)3D對象平移的辦法在瀏覽方式中的平移方式狀態(tài)下,將顧客對鼠標(biāo)光標(biāo)的拖動位移按比例轉(zhuǎn)換為3D坐標(biāo)的位置移動信息(Z坐標(biāo)不變),在進(jìn)行OpenGL顯示解決時,通過調(diào)用glTranslatef(X,Y,0),變化現(xiàn)在繪制對象坐標(biāo)系原點(diǎn)的X和Y坐標(biāo),就能夠?qū)崿F(xiàn)3D顯示對象的平移功效。OpenGL控制實(shí)現(xiàn)3D旋轉(zhuǎn)的辦法控制實(shí)現(xiàn)3D對象旋轉(zhuǎn)的辦法以下:在讀入3D數(shù)據(jù)時,計(jì)算出該數(shù)據(jù)對應(yīng)3D對象的質(zhì)心,并將其作為旋轉(zhuǎn)中心。運(yùn)用虛擬球的辦法將顧客的鼠標(biāo)二維移動操作轉(zhuǎn)換為三維的旋轉(zhuǎn)向量。運(yùn)用四元數(shù)運(yùn)算將上一步得到的鼠標(biāo)旋轉(zhuǎn)向量轉(zhuǎn)換為三維旋轉(zhuǎn)矩陣。在進(jìn)行OpenGL顯示解決前,先用上述旋轉(zhuǎn)矩陣對3D數(shù)據(jù)進(jìn)行變換,再進(jìn)行顯示,就能夠得到旋轉(zhuǎn)后的3D視圖。單機(jī)多顯系統(tǒng)同時控制實(shí)現(xiàn)辦法運(yùn)用OpenGL實(shí)現(xiàn)多個3D繪制對象同時顯示的辦法是:創(chuàng)立對應(yīng)于不同顯示屏的四個窗口,創(chuàng)立四個OpenGL設(shè)備并與上述四個窗口有關(guān)聯(lián),設(shè)立這四個OpenGL設(shè)備的顯示數(shù)據(jù)為同一種3D對象,但顯示視角各不相似。接受顧客的繪制操作命令,按照顧客操作命令的性質(zhì)進(jìn)行各OpenGL設(shè)備的數(shù)據(jù)變換計(jì)算,觸發(fā)第i(i=1)個顯示屏的顯示更新。在第i個顯示屏的顯示更新解決中,選中該顯示屏對應(yīng)的OprnGL設(shè)備并在其上進(jìn)行3D繪制。繪制完畢后,觸發(fā)第i+1個顯示屏的顯示更新,直到全部的顯示屏對應(yīng)的顯示更新解決完畢為止。單機(jī)多顯系統(tǒng)鳥瞰導(dǎo)游實(shí)現(xiàn)辦法鳥瞰導(dǎo)游窗口的設(shè)立,是為了在3D對象被放大瀏覽后,主窗口只能顯示3D對象部分內(nèi)容的狀況下,為顧客批示出主窗口所顯示的內(nèi)容在整個3D對象中的具體位置。鳥瞰導(dǎo)游窗口中繪制的對象與主窗口中的為同一種3D對象,但鳥瞰導(dǎo)游窗口中繪制的對象始終都是完整的顯示。當(dāng)主窗口只顯示3D對象的某個局部內(nèi)容時,在鳥瞰導(dǎo)游窗口中用虛線框的方式標(biāo)出主窗口所顯示的部分內(nèi)容的對應(yīng)位置。鳥瞰導(dǎo)游窗口多個功效的實(shí)現(xiàn)辦法以下:(1)鳥瞰導(dǎo)游窗口的基本繪制:首先在鳥瞰導(dǎo)游窗口中按照窗口尺寸設(shè)立OpenGL視景體參數(shù),使現(xiàn)在顯示的3D對象能夠完整地在鳥瞰導(dǎo)游窗口中顯示出來;主窗口3D對象的任何繪制更新,都可用SendMessage()函數(shù)向鳥瞰導(dǎo)游窗口發(fā)送繪制更新消息;鳥瞰導(dǎo)游窗口收到主窗口的繪制更新消息后,按主窗口的視角進(jìn)行同一種3D對象的OpenGL顯示,并按現(xiàn)在區(qū)域框的參數(shù)在鳥瞰導(dǎo)游窗口中繪制一種虛線的區(qū)域框。(2)主窗口放大和縮小解決:在主窗口的鼠標(biāo)中鍵滾動消息響應(yīng)函數(shù)中,計(jì)算出主窗口視景體視點(diǎn)的新位置,按新的OpenGL剪切窗口和3D對象顯示尺寸的相對關(guān)系計(jì)算出鳥瞰導(dǎo)游窗口現(xiàn)在區(qū)域框的參數(shù);調(diào)用鳥瞰導(dǎo)游窗口的Invalidate()函數(shù),更新鳥瞰導(dǎo)游窗口的繪制。(3)主窗口平移解決:在主窗口的鼠標(biāo)拖動消息響應(yīng)函數(shù)中,計(jì)算出主窗口視景體視點(diǎn)的新位置,按新的OpenGL剪切窗口和3D對象顯示尺寸的相對關(guān)系計(jì)算出鳥瞰導(dǎo)游窗口現(xiàn)在區(qū)域框的參數(shù);調(diào)用鳥瞰導(dǎo)游窗口的Invalidate()函數(shù),更新鳥瞰導(dǎo)游窗口的繪制。(4)鳥瞰導(dǎo)游窗口導(dǎo)游平移解決:在鳥瞰導(dǎo)游窗口的鼠標(biāo)對現(xiàn)在區(qū)域框拖動消息響應(yīng)函數(shù)中,計(jì)算出鳥瞰導(dǎo)游窗口現(xiàn)在區(qū)域框相對于其3D對象的位置移動,換算為主窗口視景體視的移動位置并更新主窗口視景體視的x和y坐標(biāo);調(diào)用主窗口的Invalidate()函數(shù),更新主窗口的繪制。3DS文獻(xiàn)轉(zhuǎn)換實(shí)現(xiàn)辦法3DS文獻(xiàn)由數(shù)據(jù)塊構(gòu)成,數(shù)據(jù)塊的種類非常多,作為3D模型數(shù)據(jù),3DS文獻(xiàn)中的許多數(shù)據(jù)是本系統(tǒng)并不需要的,因此本系統(tǒng)僅對3DS文獻(xiàn)中的部分?jǐn)?shù)據(jù)進(jìn)行了讀入和轉(zhuǎn)換,其它不用的數(shù)據(jù)則跳過不讀。本系統(tǒng)軟件讀入并轉(zhuǎn)換的3DS文獻(xiàn)數(shù)據(jù)有主塊數(shù)據(jù)、版本數(shù)據(jù)、對象信息數(shù)據(jù)、材質(zhì)數(shù)據(jù)和對象數(shù)據(jù)。(1)主塊數(shù)據(jù)的讀入解決主塊數(shù)據(jù)的解決較簡樸,主塊是第一種3DS文獻(xiàn)的塊,讀入后只對塊ID進(jìn)行有效性檢查解決,如果該ID不是3DS文獻(xiàn)的主塊標(biāo)記,則放棄對該文獻(xiàn)的讀入操作;如果是3DS文獻(xiàn)的主塊標(biāo)記,則用遞歸調(diào)用的辦法繼續(xù)讀入并轉(zhuǎn)換主塊中包含的其它數(shù)據(jù)塊。(2)版本數(shù)據(jù)的讀入解決版本塊數(shù)據(jù)僅包含一種四字節(jié)長的整數(shù)版本值,讀入后的版本號保存在一種臨時的版本變量中,用以對版本號進(jìn)行檢查解決,如果版本號超出了本軟件適應(yīng)的版本,則提示一種可能出錯的信息,然后繼續(xù)讀入其它數(shù)據(jù)塊。(3)對象信息數(shù)據(jù)的讀入解決對象信息塊由一種四字節(jié)長的整數(shù)版本值和后續(xù)數(shù)據(jù)塊構(gòu)成,讀入后的對象版本號被丟棄,然后從其后的數(shù)據(jù)塊繼續(xù)讀入。(4)材質(zhì)數(shù)據(jù)的讀入解決每次讀入一種新的材質(zhì)數(shù)據(jù)塊,就在3D模型數(shù)據(jù)的材質(zhì)數(shù)據(jù)鏈表中添加一種新的材質(zhì)數(shù)據(jù),然后繼續(xù)讀入該材質(zhì)數(shù)據(jù)塊的后續(xù)數(shù)據(jù)塊并根據(jù)后續(xù)數(shù)據(jù)塊的類型進(jìn)行不同的解決。一種材質(zhì)數(shù)據(jù)塊的后續(xù)數(shù)據(jù)塊可能是材質(zhì)名稱塊、材質(zhì)顏色塊、新的材質(zhì)塊和材質(zhì)文獻(xiàn)名塊,不同材質(zhì)塊的解決辦法以下:材質(zhì)名稱塊的解決:材質(zhì)名稱塊只包含特定長度的材質(zhì)名稱字符串,對該塊的解決是讀入塊數(shù)據(jù)并保存在現(xiàn)在材質(zhì)數(shù)據(jù)鏈表的材質(zhì)名稱變量中。材質(zhì)顏色塊的解決:材質(zhì)顏色塊包含塊頭和三字節(jié)的材質(zhì)顏色,對該塊的解決是讀入塊頭,然后讀入三字節(jié)的材質(zhì)顏色并保存在現(xiàn)在材質(zhì)數(shù)據(jù)鏈表的材質(zhì)顏色變量中。新的材質(zhì)塊的解決:如果現(xiàn)在材質(zhì)塊的類型是一種材質(zhì)信息塊,則表達(dá)它是一種新的材質(zhì)數(shù)據(jù)塊,對該塊的解決辦法是遞歸調(diào)用材質(zhì)數(shù)據(jù)塊讀入解決函數(shù),讀入并解決該材質(zhì)塊數(shù)據(jù)。材質(zhì)文獻(xiàn)名塊的解決:材質(zhì)文獻(xiàn)名塊僅由特定長度的材質(zhì)文獻(xiàn)名字符串構(gòu)成,對該塊的解決辦法是讀入材質(zhì)文獻(xiàn)名并保存在現(xiàn)在材質(zhì)數(shù)據(jù)鏈表的材質(zhì)文獻(xiàn)名塊變量中。除以上材質(zhì)數(shù)據(jù)塊類型外的其它材質(zhì)數(shù)據(jù)塊都被跳過并丟棄。(5)對象數(shù)據(jù)的讀入解決每次讀入一種新的對象數(shù)據(jù)塊,就在3D模型數(shù)據(jù)的對象數(shù)據(jù)鏈表中添加一種新的對象數(shù)據(jù),然后繼續(xù)讀入該對象數(shù)據(jù)塊的后續(xù)數(shù)據(jù)塊并根據(jù)后續(xù)數(shù)據(jù)塊的類型進(jìn)行不同的解決。一種對象數(shù)據(jù)塊由該對象的名稱和后續(xù)的對象數(shù)據(jù)塊構(gòu)成,對象數(shù)據(jù)塊的解決首先讀入該對象的名稱字符串并保存在現(xiàn)在對象數(shù)據(jù)鏈表的對象名稱變量中。后續(xù)的對象數(shù)據(jù)塊可能是一種新對象數(shù)據(jù)塊、頂點(diǎn)數(shù)據(jù)塊、面片數(shù)據(jù)塊、對象的材質(zhì)名稱數(shù)據(jù)塊、對象的UV紋理坐標(biāo)數(shù)據(jù)塊。不同對象塊的解決辦法以下:新對象數(shù)據(jù)塊的解決:如果現(xiàn)在對象塊的類型是一種對象塊,則表達(dá)它是一種新的對象數(shù)據(jù)塊,對該塊的解決辦法是遞歸調(diào)用對象數(shù)據(jù)塊讀入解決函數(shù),讀入并解決該對象塊數(shù)據(jù)。頂點(diǎn)數(shù)據(jù)塊的解決:每一種頂點(diǎn)數(shù)據(jù)塊由一種兩字節(jié)的頂點(diǎn)個數(shù)和指定個數(shù)的頂點(diǎn)坐標(biāo)(三個四字節(jié)浮點(diǎn)數(shù))構(gòu)成。頂點(diǎn)數(shù)據(jù)塊的解決是先讀入頂點(diǎn)個數(shù),保存在現(xiàn)在對象數(shù)據(jù)的頂點(diǎn)個數(shù)變量中,然后為該對象的頂點(diǎn)存儲區(qū)申請指定大小的空間,再讀入全部的頂點(diǎn)數(shù)據(jù)并保存在新申請的空間中。由于OpenGL的坐標(biāo)系和3DS文獻(xiàn)的坐標(biāo)系是不同的,3DS中模型的Z軸是指向上的,而OpenGL中模型的Z軸是垂直屏幕指向顧客的,因此需要將3DS文獻(xiàn)數(shù)據(jù)全部頂點(diǎn)坐標(biāo)的y和z對換,然后將得到的z坐標(biāo)取反才干得到對的的OpenGL坐標(biāo)。面片數(shù)據(jù)塊的解決:每一種面片數(shù)據(jù)塊由一種兩字節(jié)的面片個數(shù)和指定個數(shù)的面片數(shù)據(jù)(四個兩字節(jié)整數(shù))構(gòu)成,面片數(shù)據(jù)的前三個數(shù)據(jù)是構(gòu)成該面片的頂點(diǎn)索引值,第四個數(shù)據(jù)是這些頂點(diǎn)的繪制次序碼。面片數(shù)據(jù)塊的解決是先讀入面片個數(shù),保存在現(xiàn)在對象數(shù)據(jù)的面片個數(shù)變量中,然后為該對象的面片存儲區(qū)申請指定大小的空間,再依此讀入每一種面片的三個頂點(diǎn)索引值并保存在新申請的空間中。普通狀況下,對面片的第四個數(shù)據(jù)-頂點(diǎn)繪制次序碼的解決是讀入后丟棄不用。但對于某些不規(guī)范的3DS文獻(xiàn)數(shù)據(jù),還需要根據(jù)頂點(diǎn)繪制次序碼對頂點(diǎn)索引值的次序進(jìn)行調(diào)換,否則用OpenGL繪制出的等于面片可能會失真。對象材質(zhì)名稱數(shù)據(jù)塊的解決:對象材質(zhì)名稱數(shù)據(jù)塊由以0結(jié)尾的字符串和后續(xù)數(shù)據(jù)構(gòu)成,對該塊的解決辦法是:讀入對應(yīng)的材質(zhì)名稱字符串,將它與已經(jīng)讀入并保存的全部材質(zhì)數(shù)據(jù)中的材質(zhì)名稱進(jìn)行比較,如果有匹配(相等)的材質(zhì)名稱,則將該對象的紋理標(biāo)志變量置位,并將該對象的紋理標(biāo)記設(shè)立為匹配材質(zhì)的索引值,否則將該對象的紋理標(biāo)志變量復(fù)位,并將該對象的紋理標(biāo)記設(shè)立為-1。最后跳過對象材質(zhì)名稱字符串背面的全部數(shù)據(jù)。對象UV紋理坐標(biāo)數(shù)據(jù)塊的解決:對象UV紋理坐標(biāo)數(shù)據(jù)塊由一種兩字節(jié)的紋理坐標(biāo)個數(shù)和指定個數(shù)的紋理坐標(biāo)數(shù)據(jù)(兩個四字節(jié)浮點(diǎn)數(shù))構(gòu)成。對象UV紋理坐標(biāo)數(shù)據(jù)塊的解決是先讀入紋理坐標(biāo)個數(shù),保存在現(xiàn)在對象紋理坐標(biāo)個數(shù)變量中,然后為該對象的紋理坐標(biāo)存儲區(qū)申請指定大小的空間,再一次讀入全部的紋理坐標(biāo)數(shù)據(jù)并保存在新申請的空間中。多機(jī)多顯系統(tǒng)通信合同實(shí)現(xiàn)辦法系統(tǒng)通信合同解決辦法在MFC應(yīng)用程序中,文檔類重要負(fù)責(zé)解決數(shù)據(jù),而視圖類用于顯示數(shù)據(jù)。在本程序中,文檔類CM3DDispDoc負(fù)責(zé)消息的接受和發(fā)送,以及套接字通信的初始化,視圖類CM3DDispView解釋和解決消息。CM3DDispDoc類發(fā)送和接受消息的過程以下:當(dāng)顧客進(jìn)行同時控制觸發(fā)操作或者同時控制操作時,該計(jì)算機(jī)將向聯(lián)網(wǎng)的計(jì)算機(jī)發(fā)送消息。發(fā)送消息的過程以下:(1)由于本軟件在設(shè)計(jì)合同時采用了可變長度消息的構(gòu)造,不同的操作封裝的消息是不同的。在CM3DDispView類中系統(tǒng)根據(jù)顧客的操作封裝完消息,然后調(diào)用CM3DDispDoc類的UpdateClients()函數(shù)。消息的發(fā)送放在CM3DDispDoc類中解決。(2)在UpdateClients()函數(shù)中,依次從CM3DDispDoc類保存的連接的socket鏈表m_connectionList中找到與其它計(jì)算機(jī)連接的CClientSocket對象后,調(diào)用CM3DDispDoc::SendMsg()函數(shù)發(fā)送消息。(3)SendMsg()函數(shù)發(fā)送消息的過程以下:調(diào)用該CClientSocket的SendMsg()函數(shù),SendMsg()函數(shù)再調(diào)用CMsg類的序列化函數(shù)Serialize()完畢數(shù)據(jù)的發(fā)送。接受消息的過程以下。(1)建立完連接后,如果連接的計(jì)算機(jī)有消息發(fā)送過來,則框架代碼會自動調(diào)用CClientSocket的OnReceive()函數(shù)(或者說CClientSocket的OnReceive事件被觸發(fā))。在OnReceive()函數(shù)中調(diào)用文檔類CM3DDispDoc的組員函數(shù)ProcessPendingReceive(),在文檔類中對消息進(jìn)行接受和解決。(2)ProcessPendingReceive()的解決辦法是,先定義一種局部變量CMsgmsg,再調(diào)用ReadMsg()函數(shù)接受發(fā)來的消息。每接受完一次信息,就對該信息進(jìn)行解決,解決完后析構(gòu)該msg,然后再判斷該socket與否有新的讀取數(shù)據(jù)消息。若有,再重新構(gòu)造一種CMsgmsg,如此循環(huán),直到緩沖區(qū)為空。本軟件在設(shè)計(jì)合同時采用了可變長度消息的構(gòu)造,因此,即使每次接受消息都用了同一種類CMsg的對象msg,但每次接受的消息的構(gòu)造并不相似。為了避免兩次接受的信息互相影響,一定要把msg定義成局部的,解決完該消息后即析構(gòu)該msg。(3)ReadMsg()函數(shù)接受消息的過程以下:調(diào)用該CClientSocket的ReceiveMsg()函數(shù),ReceiveMsg()函數(shù)再調(diào)用CMsg類的序列化函數(shù)Serialize()完畢數(shù)據(jù)的接受。(4)在ProcessPendingRead()函數(shù)中對ReadMsg()函數(shù)接受的消息進(jìn)行解決的過程以下:先判斷該消息與否涉及控制權(quán)請求消息,若有,則先進(jìn)行狀態(tài)轉(zhuǎn)換解決(狀態(tài)轉(zhuǎn)換解決辦法見3.2.13節(jié))。再根據(jù)消息的ID為INIT_MSG、STATE_MSG、MOVE_MSG、FILE_MSG來分別進(jìn)行對應(yīng)的初始化解決、狀態(tài)信息解決、3D模型運(yùn)動解決、數(shù)據(jù)更新解決。系統(tǒng)通信合同的構(gòu)成網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)中,合同是必不可少的,越是大型的網(wǎng)絡(luò)應(yīng)用程序,合同就越復(fù)雜。通信的雙方為了懂得對方所發(fā)送的消息的意義,就必須要商定好消息的格式以及發(fā)送的次序,這些也是合同的一種重要構(gòu)成部分。在客戶機(jī)/服務(wù)器模型中,根據(jù)不同的狀況,合同能夠是對稱的,也能夠是非對稱的。在對稱的合同中,每一方都有可能扮演主從角色;在非對稱合同中,一方被不可變化地認(rèn)為是主機(jī),而另一方則是從機(jī)。一種對稱合同的例子是Internet中用于終端仿真的Telnet,而非對稱合同的例子是Internet中的FTP。無論具體的合同是對稱的還是非對稱的,當(dāng)服務(wù)被提供時必然存在“客戶機(jī)”和“服務(wù)器”。多機(jī)多屏3D顯示系統(tǒng)的通信合同分無連接和有連接兩種。當(dāng)程序被啟動時,由于不懂得網(wǎng)絡(luò)中與否有其它計(jì)算機(jī)在運(yùn)行本軟件,必須用無連接的UDP廣播報(bào)文的形式向網(wǎng)絡(luò)中全部的計(jì)算機(jī)發(fā)送系統(tǒng)啟動消息,任何已運(yùn)行本軟件的計(jì)算機(jī)在收到系統(tǒng)啟動消息后都要與剛啟動的計(jì)算機(jī)建立連接,并回復(fù)系統(tǒng)初始化消息。一旦建立連接,后續(xù)的通信便用有連接的合同完畢。在基于連接的通信合同中,采用可變長度消息命令,將系統(tǒng)多個解決和全部3D瀏覽控制命令封裝在一種消息構(gòu)造(一種可串行化的類CMsg)中,實(shí)現(xiàn)瀏覽控制命令的可靠傳輸,這樣使合同含有較好的擴(kuò)展性,易于增加新的合同或修改某些舊的合同。如果增加新消息合同,則只要把對應(yīng)的消息項(xiàng)加入類中,并在通信的兩端進(jìn)行對應(yīng)的解釋解決即可。CMsg類中用組員變量m_wMsgID表達(dá)所發(fā)消息的ID,根據(jù)ID來擬定如何封裝消息。消息的ID有下列四種類型:●INIT_MSG初始化消息●STATE_MSG狀態(tài)消息●MOVE_MSG3D模型運(yùn)動消息●FILE_MSG 數(shù)據(jù)更新消息系統(tǒng)啟動合同當(dāng)本系統(tǒng)的軟件啟動時,本地計(jì)算機(jī)首先會給局域網(wǎng)中全部的計(jì)算機(jī)發(fā)送廣播消息。啟動合同由七個字節(jié)構(gòu)成,這些數(shù)據(jù)包含了該計(jì)算機(jī)運(yùn)行本程序的啟動時間和本軟件的啟動代碼,啟動時間涉及年、月、日、時、分和秒,啟動代碼為一種單字節(jié)的常數(shù)。局域網(wǎng)內(nèi)運(yùn)行本軟件的其它計(jì)算機(jī)收到廣播消息后,先通過啟動代碼判斷與否為運(yùn)行本軟件的計(jì)算機(jī)發(fā)送的廣播消息。若是,則與該計(jì)算機(jī)通過握手過程建立點(diǎn)對點(diǎn)的連接。兩臺計(jì)算機(jī)建立連接后,就能夠進(jìn)行面對連接的通信,首先要發(fā)送的就是系統(tǒng)初始化消息。系統(tǒng)初始化合同程序啟動后,如果局域網(wǎng)上已有計(jì)算機(jī)運(yùn)行本程序,則這些計(jì)算機(jī)會給本機(jī)發(fā)送初始化消息,消息的ID為INIT_MSG,即msg.m_wMsgID=INIT_MSG。初始化消息涉及該計(jì)算機(jī)的初始狀態(tài)信息和3DS模型的參數(shù),其由下列組員變量構(gòu)成:WORDm_wPriority;//計(jì)算機(jī)啟動的序號WORDm_wModelState;//顯示的視角CStringm_str3DSName;//打開的3DS文獻(xiàn)的文獻(xiàn)名floatm_M00,……,m_M33;//一種4×4參數(shù)矩陣floatm_newM00,……,m_newM22;//一種3×3參數(shù)矩陣floatm_xwalk;//縱向距離floatm_ywalk;//橫向距離floatm_zwalk;floatm_displayLength;//視景距離3D瀏覽控制合同.13D瀏覽控制合同概述本軟件運(yùn)行后有三種不同的狀態(tài),分別是:對等狀態(tài)、主控狀態(tài)和附屬狀態(tài)。當(dāng)某臺計(jì)算機(jī)上運(yùn)行的軟件處在這三種狀態(tài)之一時,分別將該計(jì)算機(jī)稱為對等機(jī)、主機(jī)和從機(jī)。在任一特定時刻,某臺計(jì)算機(jī)只可能處在三種狀態(tài)中的一種,且在任一特定時刻,只能有一臺計(jì)算機(jī)是主機(jī)。為了描述方便,將顧客對計(jì)算機(jī)的控制操作分為同時控制觸發(fā)操作、同時控制操作和非同時控制操作三類。同時控制觸發(fā)操作:涉及裝入3DS對象、開始對已裝入的3D對象的旋轉(zhuǎn)、平移、放縮和顯示復(fù)位等。同時控制操作:涉及對已裝入的3D對象的旋轉(zhuǎn)、平移、放縮操作。非同時控制操作:涉及設(shè)立本計(jì)算機(jī)顯示的背景顏色、變化本計(jì)算機(jī)的顯示視角等。同時控制操作是各個計(jì)算機(jī)同時同時進(jìn)行的解決。同時控制觸發(fā)操作是顧客在某臺處在對等狀態(tài)的計(jì)算機(jī)上將要進(jìn)行同時操作的操作,同時控制觸發(fā)操作將有可能使該計(jì)算機(jī)由對等機(jī)變?yōu)橹鳈C(jī);非同時操作則是某臺計(jì)算機(jī)自己進(jìn)行的操作。.23D瀏覽控制合同設(shè)計(jì)瀏覽控制合同由兩部分構(gòu)成:一是狀態(tài)消息,其ID為STATE_MSG;二是3D模型運(yùn)動消息,其ID為MOVE_MSG。(1)控制權(quán)請求消息當(dāng)顧客進(jìn)行同時控制觸發(fā)操作時,將會發(fā)出控制權(quán)請求消息。由于全部的同時瀏覽操作都會產(chǎn)生該消息,故在設(shè)計(jì)合同時,將該消息作為全部消息都包含的一部分消息,其包含下列組員變量:BOOLm_bRequest;//請求獲得控制權(quán)WORDm_wPriority;//計(jì)算機(jī)啟動的序號WORDm_wYear,m_wMonth,m_wDay,m_wHour,m_wMinute,m_wSecond;//同時控制觸發(fā)操作的時間(2)旋轉(zhuǎn)操作消息旋轉(zhuǎn)操作發(fā)送的消息ID為MOVE_MSG。當(dāng)鼠標(biāo)移動時,3D模型參數(shù)中的4×4的矩陣就會發(fā)生變化,故應(yīng)將該矩陣發(fā)送出去,該消息由下列組員變量構(gòu)成:BOOLm_bMove;//3D模型與否處在任意旋轉(zhuǎn)狀態(tài)floatm_M00,……,m_M33;//一種4×4參數(shù)矩陣(3)鼠標(biāo)左鍵松開操作消息當(dāng)松開鼠標(biāo)左鍵時,3D模型參數(shù)中的3×3的矩陣就會發(fā)生變化,故應(yīng)將該矩陣發(fā)送出去,該消息由下列組員變量構(gòu)成:BOOLm_bLButtonUp;//左鍵松開floatm_newM00,……,m_newM22;//一種3×3參數(shù)矩陣(4)平移操作消息平移操作發(fā)送的消息ID為MOVE_MSG。平移操作變化的是3D模型參數(shù)中的橫向距離和縱向距離,故消息包含下列組員變量:BOOLm_bSimpleMove;//3D模型處在平移狀態(tài)floatm_xwalk;//縱向距離floatm_ywalk;//橫向距離(5)放縮操作消息放縮操作發(fā)送的消息的ID為MOVE_MSG。放縮操作變化的是視景距離,消息包含下列組員變量:BOOLm_bMiddle;//3D模型處在放縮狀態(tài)floatm_zwalk;floatm_displayLength;//視景距離(6)打開3DS文獻(xiàn)操作消息打開3DS文獻(xiàn)消息的ID為STATE_MSG,該消息只包含要打開的3DS文獻(xiàn)的文獻(xiàn)名,其組員變量為:CStringm_str3DSName;//打開的3DS文獻(xiàn)的文獻(xiàn)名(7)恢復(fù)初始狀態(tài)操作消息恢復(fù)初始狀態(tài)消息的ID為STATE_MSG,該消息只要告知各計(jì)算機(jī)恢復(fù)初始狀態(tài)即可,各計(jì)算機(jī)收到消息后將3DS文獻(xiàn)的參數(shù)恢復(fù)初始值?;謴?fù)初始狀態(tài)消息的組員變量為:BOOLm_bInit;//恢復(fù)初始狀態(tài)(8)控制權(quán)放棄操作消息控制權(quán)放棄消息的ID為STATE_MSG,該消息只包含一種布爾型變量:BOOLm_bGiveUp;//放棄控制權(quán)(9)程序退出消息程序退出消息的ID為STATE_MSG,該消息包含一種布爾型變量:BOOLm_bClose;//退出(10)顯示視角變化消息顯示視角變化消息的ID為STATE_MSG,該消息可能是顧客更改瀏覽視角引發(fā)的,也可能是計(jì)算機(jī)啟動時自動調(diào)節(jié)的。該消息包含下列組員變量:BOOLm_bLittleWnd;//小窗口顯示的視角變化WORDm_wPriority;//計(jì)算機(jī)啟動的序號WORDm_wModelState;//顯示的視角.33D數(shù)據(jù)更新合同數(shù)據(jù)更新消息的ID為FILE_MSG,即msg.m_wMsgID=FILE_MSG。數(shù)據(jù)更新消息包含下列組員變量:CStringm_str3DSName;//傳輸?shù)?DS文獻(xiàn)的文獻(xiàn)名INTnFileMsgCode;//傳輸內(nèi)容代號傳輸內(nèi)容代號nFileMsgCode不同時,消息的構(gòu)造也不相似。nFileMsgCode有下列六種可能取值?!馬EQUIRE_FILE_NAME 1●RE_REQUIRE_FILE_NAME 2●REQUIRE_FILE_DATA 3●REQUIRE_FILE_DATA_MORE4●RE_REQUIRE_FILE_DATA5●REQUIRE_FILE_END6計(jì)算機(jī)接受到打開3DS文獻(xiàn)的消息后,如果本地沒有該3DS文獻(xiàn)且沒有對應(yīng)的臨時文獻(xiàn)(臨時文獻(xiàn)名為該3DS文獻(xiàn)名加上.TMP擴(kuò)展名),則該計(jì)算機(jī)(下列稱為接受端)會給發(fā)來打開文獻(xiàn)消息的計(jì)算機(jī)(下列稱為發(fā)送端)回復(fù)獲取文獻(xiàn)消息,獲取文獻(xiàn)消息的傳輸內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_NAME,此消息不再需要其它組員變量。如果本地沒有該3DS文獻(xiàn)但有對應(yīng)的臨時文獻(xiàn),則進(jìn)行斷點(diǎn)續(xù)傳,給發(fā)送端回復(fù)繼續(xù)請求發(fā)送數(shù)據(jù)消息,繼續(xù)請求發(fā)送數(shù)據(jù)消息的傳輸內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_DATA_MORE,此消息需要一種統(tǒng)計(jì)已接受的數(shù)據(jù)塊個數(shù)的組員變量:LONGlCurrentPos;//已接受的數(shù)據(jù)塊個數(shù)發(fā)送端接受到nFileMsgCode=REQUIRE_FILE_NAME的數(shù)據(jù)更新消息后,得到該3DS文獻(xiàn)的長度,并給接受端發(fā)送獲取文獻(xiàn)回復(fù)消息。獲取文獻(xiàn)回復(fù)消息的內(nèi)容代碼nFileMsgCode=RE_REQUIRE_FILE_NAME。另外,該消息還增加了一種寄存文獻(xiàn)長度的組員變量:LONGFileLength;//文獻(xiàn)長度接受端接受到nFileMsgCode=RE_REQUIRE_FILE_NAME的數(shù)據(jù)更新消息后,保存該3DS文獻(xiàn)的長度,并給該發(fā)送端發(fā)送請求數(shù)據(jù)發(fā)送消息。請求數(shù)據(jù)發(fā)送消息的內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_DATA。由于數(shù)據(jù)傳輸是分塊傳輸?shù)?,每塊大小為1024字節(jié),故此消息還涉及一種統(tǒng)計(jì)已接受的數(shù)據(jù)塊個數(shù)的組員變量:LONGlCurrentPos;//已接受的數(shù)據(jù)塊個數(shù)發(fā)送端接受到nFileMsgCode=REQUIRE_FILE_DATA的數(shù)據(jù)更新消息后,第一次給接受端傳輸3DS文獻(xiàn)數(shù)據(jù),傳輸數(shù)據(jù)所用的消息為發(fā)送數(shù)據(jù)消息。發(fā)送數(shù)據(jù)消息的內(nèi)容代碼nFileMsgCode=RE_REQUIRE_FILE_DATA。此消息還涉及下列組員變量:LONGlCurrentPos;//已發(fā)送的數(shù)據(jù)塊個數(shù)INTnFileEndFlag;//數(shù)據(jù)更新結(jié)束標(biāo)志BYTEFileBuff[1024];//寄存3DS文獻(xiàn)塊的數(shù)組接受端接受到nFileMsgCode=RE_REQUIRE_FILE_DATA的數(shù)據(jù)更新消息后,保存已經(jīng)收到的3DS文獻(xiàn)數(shù)據(jù),然后根據(jù)數(shù)據(jù)更新結(jié)束標(biāo)志nFileEndFlag來決定發(fā)送的數(shù)據(jù)更新消息的內(nèi)容代碼。如果數(shù)據(jù)更新結(jié)束,則打開該3DS文獻(xiàn),并發(fā)送文獻(xiàn)接受完畢消息,文獻(xiàn)接受完畢消息的內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_END,此時數(shù)據(jù)更新消息不再需要其它組員變量。如果數(shù)據(jù)更新未結(jié)束,則給發(fā)送端回復(fù)繼續(xù)請求發(fā)送數(shù)據(jù)消息。繼續(xù)請求發(fā)送數(shù)據(jù)消息的內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_DATA_MORE,此消息需要一種統(tǒng)計(jì)已接受的數(shù)據(jù)塊個數(shù)的組員變量:LONGlCurrentPos;//已接受的數(shù)據(jù)塊個數(shù)發(fā)送端接受到nFileMsgCode=REQUIRE_FILE_END的數(shù)據(jù)更新消息后,給接受端發(fā)送3D模型運(yùn)動消息,消息的ID為MOVE_MSG。數(shù)據(jù)更新結(jié)束。發(fā)送端接受到nFileMsgCode=REQUIRE_FILE_DATA_MORE的數(shù)據(jù)更新消息后,繼續(xù)給接受端傳輸3DS文獻(xiàn)數(shù)據(jù)。傳輸數(shù)據(jù)所用的消息為發(fā)送數(shù)據(jù)消息。多機(jī)多顯系統(tǒng)同時控制實(shí)現(xiàn)辦法系統(tǒng)運(yùn)行狀態(tài)設(shè)立程序運(yùn)行后有三種不同的狀態(tài),分別是:對等狀態(tài)、主控狀態(tài)和附屬狀態(tài)。當(dāng)某臺計(jì)算機(jī)上運(yùn)行的軟件處在這三種狀態(tài)之一時,分別將該計(jì)算機(jī)稱為對等機(jī)、主機(jī)和從機(jī)。在任一特定時刻,某臺計(jì)算機(jī)只可能處在三種狀態(tài)中的一種,且在任一特定時刻,只能有一臺計(jì)算機(jī)是主機(jī)。網(wǎng)絡(luò)上運(yùn)行本軟件的計(jì)算機(jī)由其唯一的IP地址互相辨別,且每臺計(jì)算機(jī)都有不同的優(yōu)先級,該優(yōu)先級是軟件運(yùn)行時根據(jù)局域網(wǎng)內(nèi)運(yùn)行該軟件的計(jì)算機(jī)的數(shù)目自動擬定的,每臺計(jì)算機(jī)的優(yōu)先級也是唯一的。軟件運(yùn)行后,不同運(yùn)行狀態(tài)的進(jìn)入和操作以下:對等狀態(tài):程序啟動后,如果網(wǎng)上運(yùn)行本程序的計(jì)算機(jī)都處在對等狀態(tài),則計(jì)算機(jī)將處在對等狀態(tài)。處在對等狀態(tài)的計(jì)算機(jī)能夠響應(yīng)本機(jī)顧客的同時控制觸發(fā)操作進(jìn)入主控狀態(tài),成為主機(jī),或響應(yīng)其它計(jì)算機(jī)的控制權(quán)請求消息而進(jìn)入附屬狀態(tài),成為從機(jī)。主控狀態(tài):在對等狀態(tài)下,如果某臺計(jì)算機(jī)的顧客先于其它計(jì)算機(jī)的顧客進(jìn)行了同時控制觸發(fā)操作,則該計(jì)算機(jī)將進(jìn)入主控狀態(tài),同時向其它計(jì)算機(jī)發(fā)送控制請求消息。處在主控狀態(tài)的計(jì)算機(jī)按顧客操作進(jìn)行同時控制解決,并將對應(yīng)的控制發(fā)送給處在附屬狀態(tài)的其它計(jì)算機(jī),從機(jī)按照接受到的同時控制命令,進(jìn)行相似的操作。如果處在主控狀態(tài)的計(jì)算機(jī)在一定時間內(nèi)沒有再接受到顧客的同時控制觸發(fā)操作,則將進(jìn)入對等狀態(tài),同時將向其它處在附屬狀態(tài)的計(jì)算機(jī)發(fā)送控制權(quán)放棄消息,收到該消息的其它計(jì)算機(jī)也將進(jìn)入對等狀態(tài)。附屬狀態(tài):在軟件啟動時,如果網(wǎng)上已有主機(jī),或在對等狀態(tài)下,收到其它計(jì)算機(jī)的控制請求消息,則該計(jì)算機(jī)將進(jìn)入附屬狀態(tài)。處在附屬狀態(tài)的計(jì)算機(jī)接受主機(jī)的同時控制命令,并按該命令進(jìn)行對應(yīng)控制解決,從機(jī)將不接受本機(jī)顧客的同時控制觸發(fā)操作,只接受本機(jī)顧客的非同時控制操作。處在附屬狀態(tài)的計(jì)算機(jī)收到主機(jī)控制權(quán)放棄信息后進(jìn)入對等狀態(tài)。系統(tǒng)狀態(tài)轉(zhuǎn)換辦法對等狀態(tài)軟件啟動時,如果局域網(wǎng)上運(yùn)行本軟件的計(jì)算機(jī)都處在對等狀態(tài),則本計(jì)算機(jī)也將處在對等狀態(tài)。在對等狀態(tài)下,如果顧客在計(jì)算機(jī)上進(jìn)行下述同時控制觸發(fā)操作,則該計(jì)算機(jī)將成為主機(jī)。同時控制觸發(fā)操作涉及下列系統(tǒng)消息:●鼠標(biāo)左鍵按下消息●鼠標(biāo)右鍵按下消息●鼠標(biāo)中鍵滑動消息●裝入3DS文獻(xiàn)的菜單消息計(jì)算機(jī)成為主機(jī)后,給局域網(wǎng)內(nèi)運(yùn)行本軟件的其它計(jì)算機(jī)發(fā)送控制權(quán)請求消息??刂茩?quán)請求消息的內(nèi)容涉及本機(jī)響應(yīng)同時控制觸發(fā)操作的時間以及本機(jī)的優(yōu)先級。其它計(jì)算機(jī)收到控制權(quán)請求消息后即由對等狀態(tài)變成從機(jī),并保存收到控制權(quán)請求消息的時間和主機(jī)的優(yōu)先級。對等狀態(tài)對多個消息的解決辦法和狀態(tài)轉(zhuǎn)換:●收到本機(jī)顧客的同時控制觸發(fā)操作。解決:本機(jī)進(jìn)入主控狀態(tài);向其它計(jì)算機(jī)發(fā)送控制權(quán)請求消息?!袷盏狡渌?jì)算機(jī)的控制權(quán)請求消息。解決:收到單個計(jì)算機(jī)的控制權(quán)請求消息時,本機(jī)進(jìn)入附屬狀態(tài),保存主機(jī)控制權(quán)請求消息的時間與主機(jī)的優(yōu)先級;同時收到多個計(jì)算機(jī)的控制權(quán)請求消息時,對這些控制權(quán)請求消息的同時控制時間和優(yōu)先級參數(shù)進(jìn)行沖突判斷,擬定主機(jī),保存主機(jī)控制權(quán)請求消息的時間與主機(jī)的優(yōu)先級;●收到其它計(jì)算機(jī)的程序啟動消息。解決:給該計(jì)算機(jī)發(fā)送控制權(quán)請求消息,本機(jī)保持對等狀態(tài)?!袷盏狡渌?jì)算機(jī)的退出消息。解決:斷開與該計(jì)算機(jī)的連接,本機(jī)保持對等狀態(tài)。主控狀態(tài)一臺計(jì)算機(jī)成為主機(jī)后,顧客就能夠在該計(jì)算機(jī)上進(jìn)行同時控制操作。在進(jìn)行同時控制操作的同時,主機(jī)通過網(wǎng)絡(luò)將控制信息發(fā)送給各從機(jī)。各從機(jī)響應(yīng)同時控制消息,并按消息進(jìn)行對應(yīng)的同時控制解決,從而實(shí)現(xiàn)同時瀏覽功效。顧客停止同時控制操作時,主機(jī)將啟動一種狀態(tài)轉(zhuǎn)換定時器開始定時。主機(jī)啟動狀態(tài)轉(zhuǎn)換定時器的系統(tǒng)消息是:●旋轉(zhuǎn)瀏覽過程中:鼠標(biāo)左鍵松開消息●平移瀏覽過程中:鼠標(biāo)左鍵松開消息●放縮瀏覽過程中:鼠標(biāo)中鍵停止滑動消息●顯示復(fù)位時:鼠標(biāo)右鍵松開消息●裝入3DS文獻(xiàn)過程中:成功打開并讀入3DS文獻(xiàn)后如果狀態(tài)轉(zhuǎn)換時間(普通為0.5秒)到,主機(jī)將退出主控狀態(tài),進(jìn)入對等狀態(tài),并給各從機(jī)發(fā)送控制權(quán)放棄信息。各從機(jī)收到控制權(quán)放棄消息后,將保存的主機(jī)控制權(quán)請求消息的時間與主機(jī)的優(yōu)先級丟棄。如果在狀態(tài)轉(zhuǎn)換定時時間內(nèi),顧客再次進(jìn)行同時控制觸發(fā)操作,則主機(jī)將狀態(tài)轉(zhuǎn)換定時器復(fù)位,進(jìn)行對應(yīng)的同時控制解決,并將控制信息發(fā)送給各從機(jī)。主機(jī)繼續(xù)保持在主控狀態(tài)。主控狀態(tài)對多個消息的解決辦法和狀態(tài)轉(zhuǎn)換:●收到本機(jī)顧客的同時控制觸發(fā)操作和同時控制操作。解決:進(jìn)行對應(yīng)的同時控制解決,向各從機(jī)發(fā)送同時控制消息、復(fù)位狀態(tài)轉(zhuǎn)換定時器。●狀態(tài)轉(zhuǎn)換定時器時間到。解決:向各從機(jī)發(fā)送控制權(quán)放棄信息,退出主控狀態(tài),進(jìn)入對等狀態(tài)?!袷盏狡渌?jì)算機(jī)的控制權(quán)請求消息。解決:將控制權(quán)請求消息的同時控制時間和優(yōu)先級參數(shù)與本主機(jī)的對應(yīng)參數(shù)進(jìn)行沖突判斷,擬定新的主機(jī)并進(jìn)行對應(yīng)的沖突解決(沖突解決辦法及解決沖突后本機(jī)的狀態(tài)轉(zhuǎn)換見后續(xù)內(nèi)容)。●收到其它計(jì)算機(jī)的程序啟動消息。解決:給該計(jì)算機(jī)發(fā)送控制權(quán)請求消息,本機(jī)保持主控狀態(tài)?!袷盏狡渌?jì)算機(jī)的退出消息。解決:斷開與該計(jì)算機(jī)的連接,本機(jī)保持主控狀態(tài)。附屬狀態(tài)某計(jì)算機(jī)啟動本軟件時,網(wǎng)絡(luò)上運(yùn)行本軟件的其它計(jì)算機(jī)都會給他發(fā)送初始化消息,如果網(wǎng)上已有主機(jī),則本機(jī)將成為從機(jī)。另外,本機(jī)還根據(jù)收到的初始化消息擬定其優(yōu)先級和顯示3D模型的視角。一臺處在對等狀態(tài)的計(jì)算機(jī)收到控制權(quán)請求消息后,也進(jìn)入附屬狀態(tài),成為從機(jī)。從機(jī)響應(yīng)主機(jī)發(fā)出的同時控制命令,控制本機(jī)進(jìn)行與主機(jī)相似的同時控制解決。從機(jī)不會響應(yīng)本機(jī)顧客的同時控制觸發(fā)操作。當(dāng)從機(jī)收到主機(jī)的控制權(quán)放棄消息時,將保存的主機(jī)控制權(quán)請求時間和主機(jī)優(yōu)先級丟棄,然后進(jìn)入對等狀態(tài)。從機(jī)能夠響應(yīng)本機(jī)顧客的非同時控制操作,并進(jìn)行對應(yīng)的解決?!袷盏奖緳C(jī)顧客的同時控制觸發(fā)操作和同時控制操作。解決:不解決,保持在附屬狀態(tài)?!袷盏狡渌?jì)算機(jī)的控制權(quán)請求消息。解決:將控制權(quán)請求消息的同時控制時間和優(yōu)先級參數(shù)與現(xiàn)在主機(jī)的對應(yīng)參數(shù)進(jìn)行沖突判斷,決定新的主機(jī)并進(jìn)行對應(yīng)的解決(沖突解決辦法見●收到其它計(jì)算機(jī)的控制權(quán)放棄消息。解決:丟棄現(xiàn)在主機(jī)控制權(quán)請求消息的時間與主機(jī)的優(yōu)先級,進(jìn)入對等狀態(tài)。●收到其它計(jì)算機(jī)的程序啟動消息。解決:給該計(jì)算機(jī)發(fā)送控制權(quán)請求消息,本機(jī)保持附屬狀態(tài)?!袷盏狡渌?jì)算機(jī)的退出消息。解決:斷開與該計(jì)算機(jī)的連接,本機(jī)保持附屬狀態(tài)。沖突檢測與解決辦法(1)與狀態(tài)轉(zhuǎn)換有關(guān)的消息不同運(yùn)行狀態(tài)下與狀態(tài)轉(zhuǎn)換有關(guān)的多個消息以下:●多個狀態(tài)下的本地同時控制觸發(fā)操作消息,涉及鼠標(biāo)左鍵按下消息、鼠標(biāo)右鍵按下消息、鼠標(biāo)中鍵滑動消息和裝入3DS文獻(xiàn)的菜單消息。該消息使處在對等狀態(tài)的計(jì)算機(jī)成為主機(jī)。●多個狀態(tài)下通過網(wǎng)絡(luò)接受的其它計(jì)算機(jī)的控制權(quán)請求消息。該消息使處在對等狀態(tài)的計(jì)算機(jī)成為從機(jī)?!裰骺貭顟B(tài)下狀態(tài)轉(zhuǎn)換定時器消息。狀態(tài)轉(zhuǎn)換定時器的時間到后,計(jì)算機(jī)將由主控狀態(tài)進(jìn)入對等狀態(tài)。●附屬狀態(tài)下通過網(wǎng)絡(luò)接受的主機(jī)發(fā)出的控制權(quán)放棄消息。該消息使計(jì)算機(jī)由從機(jī)變成對等狀態(tài)。(2)沖突來源本軟件交互控制設(shè)計(jì)的目的是:在對等狀態(tài)下,先進(jìn)行同時控制的計(jì)算機(jī)獲得控制權(quán),成為主機(jī);其它的計(jì)算機(jī)則成為從機(jī)并按主機(jī)的控制進(jìn)行同時控制解決。在對等狀態(tài)下,可能出現(xiàn)兩臺或兩臺以上的計(jì)算機(jī)同時進(jìn)行本地同時控制觸發(fā)操作,此時將出現(xiàn)沖突。按照軟件設(shè)計(jì)的規(guī)定,出現(xiàn)沖突時,應(yīng)當(dāng)按照某種規(guī)則,僅使一臺計(jì)算機(jī)成為主機(jī)。可能產(chǎn)生的沖突涉及下列兩種狀況:●在對等狀態(tài)下,幾個顧客在同一時刻開始同時控制觸發(fā)操作,則這幾臺計(jì)算機(jī)將同時成為主機(jī)并向其它計(jì)算機(jī)發(fā)送控制權(quán)請求消息。這種狀況下,無法根據(jù)控制權(quán)請求消息的先后次序擬定哪臺計(jì)算機(jī)成為主機(jī)?!裼捎诰W(wǎng)絡(luò)傳輸質(zhì)量等引發(fā)的傳輸時間延遲,可能某一臺先進(jìn)行同時控制觸發(fā)操作的計(jì)算機(jī)A的控制權(quán)請求消息達(dá)成另一臺計(jì)算機(jī)B的時間比計(jì)算機(jī)B開始同時操作的時間晚,則這兩臺計(jì)算機(jī)都會成為主機(jī)并向其它計(jì)算機(jī)發(fā)送控制權(quán)請求消息。狀態(tài)轉(zhuǎn)換解決的規(guī)則:●在軟件啟動時,為每臺計(jì)算機(jī)設(shè)立一種優(yōu)先級,在發(fā)生第一種沖突時,優(yōu)先級最高的計(jì)算機(jī)將獲得控制權(quán),成為主機(jī),其它計(jì)算機(jī)就成為從機(jī)。優(yōu)先級的擬定辦法是:先運(yùn)行本軟件的計(jì)算機(jī),含有高的優(yōu)先級;同時運(yùn)行本軟件的計(jì)算機(jī),IP地址大的計(jì)算機(jī)含有高的優(yōu)先級?!衩颗_計(jì)算機(jī)在對等狀態(tài)下收到本機(jī)顧客的同時控制觸發(fā)操作時,統(tǒng)計(jì)該時刻的時間,并在發(fā)送給其它計(jì)算機(jī)的控制權(quán)請求消息中包含該時間。某臺處在對等狀態(tài)的計(jì)算機(jī)接受到多個控制權(quán)請求消息時,或某臺主機(jī)收到其它計(jì)算機(jī)的控制權(quán)請求消息時,通過比較各控制權(quán)請求消息的時間,擬定成為主機(jī)的計(jì)算機(jī)。(3)沖突檢測與解決辦法沖突的檢測運(yùn)行本軟件的計(jì)算機(jī)所構(gòu)成的網(wǎng)絡(luò)是一種簡樸的對等網(wǎng)絡(luò),網(wǎng)絡(luò)中的計(jì)算機(jī)含有同等的網(wǎng)絡(luò)權(quán)限。產(chǎn)生沖突時,網(wǎng)絡(luò)中的每臺計(jì)算機(jī)都將收到?jīng)_突的消息,并都將按統(tǒng)一的準(zhǔn)則來解決該沖突。主機(jī)對沖突的解決:本地計(jì)算機(jī)之因此成為主機(jī),是由于它先響應(yīng)了本地顧客的同時控制觸發(fā)消息。產(chǎn)生沖突的消息是來自其它計(jì)算機(jī)的控制權(quán)請求消息。對沖突的解決是在響應(yīng)當(dāng)控制權(quán)請求消息時比較兩臺計(jì)算機(jī)觸發(fā)同時控制的時間,如果時間相似,再比較兩臺計(jì)算機(jī)的優(yōu)先級,具體的比較算法以下:記計(jì)算機(jī)響應(yīng)本地同時控制消息的時間為T1,記接受到的控制權(quán)請求消息的時間(即發(fā)送該控制權(quán)請求消息的計(jì)算機(jī)響應(yīng)本地同時控制觸發(fā)操作的時間)為T2。當(dāng)T1<T2時,認(rèn)為本地計(jì)算機(jī)觸發(fā)同時控制的時間早,本地計(jì)算機(jī)應(yīng)當(dāng)成為這次控制的主機(jī)。解決辦法是放棄控制權(quán)請求消息,本地計(jì)算機(jī)仍然是主機(jī)。當(dāng)T1>T2時,認(rèn)為發(fā)送該控制權(quán)請求消息的遠(yuǎn)程計(jì)算機(jī)響應(yīng)同時控制的時間早,遠(yuǎn)程計(jì)算機(jī)應(yīng)當(dāng)成為這次控制的主機(jī)。解決辦法是本地計(jì)算機(jī)的狀態(tài)由主機(jī)變成從機(jī),并保存遠(yuǎn)程計(jì)算機(jī)亦即新主機(jī)的信息。當(dāng)T1=T2時,認(rèn)為本地計(jì)算機(jī)響應(yīng)同時控制觸發(fā)操作的時間與發(fā)送該控制權(quán)請求消息的遠(yuǎn)程計(jì)算機(jī)響應(yīng)同時控制觸發(fā)操作的時間相似,此時,比較兩臺計(jì)算機(jī)的優(yōu)先級。如果本地計(jì)算機(jī)的優(yōu)先級高,則本地計(jì)算機(jī)應(yīng)當(dāng)成為這次控制的主機(jī),解決辦法是放棄該控制權(quán)請求消息,本地計(jì)算機(jī)仍然是主機(jī);如果遠(yuǎn)程計(jì)算機(jī)的優(yōu)先級高,則遠(yuǎn)程計(jì)算機(jī)應(yīng)當(dāng)成為這次控制的主機(jī),解決辦法是本地計(jì)算機(jī)的狀態(tài)由主機(jī)變成從機(jī),并保存遠(yuǎn)程計(jì)算機(jī)亦即新主機(jī)的信息。從機(jī)對沖突的解決:本地計(jì)算機(jī)之因此成為從機(jī),是由于他先響應(yīng)了網(wǎng)絡(luò)上某臺計(jì)算機(jī)發(fā)送的控制權(quán)請求消息。產(chǎn)生沖突的消息來源只有一種狀況:網(wǎng)絡(luò)上另一臺計(jì)算機(jī)發(fā)送的控制權(quán)請求消息。解決沖突的辦法是按照前節(jié)相似的原理比較現(xiàn)在主機(jī)和控制權(quán)請求消息的主機(jī)響應(yīng)同時控制觸發(fā)操作的時間和他們的優(yōu)先級,擬定新的主機(jī)。若比較的成果是現(xiàn)在主機(jī)還是主機(jī),則解決的辦法是本地計(jì)算機(jī)仍為現(xiàn)在主機(jī)的從機(jī),放棄收到的控制權(quán)請求信息。若比較的成果是發(fā)出控制權(quán)請求消息的主機(jī)應(yīng)當(dāng)成為主機(jī),則解決的辦法是本地計(jì)算機(jī)成為該主機(jī)的從機(jī),并用該主機(jī)的信息替代現(xiàn)在主機(jī)的信息。對等機(jī)對沖突的解決:處在對等狀態(tài)的計(jì)算機(jī)收到?jīng)_突的消息只有一種狀況:同時收到網(wǎng)絡(luò)上一臺以上的計(jì)算機(jī)同時發(fā)送的控制權(quán)請求消息。解決沖突的辦法是按照前節(jié)相似的原理比較這些控制權(quán)請求消息響應(yīng)同時控制觸發(fā)操作的時間和發(fā)送消息計(jì)算機(jī)的優(yōu)先級,擬定新的主機(jī)。多機(jī)多顯系統(tǒng)數(shù)據(jù)更新實(shí)現(xiàn)辦法數(shù)據(jù)更新合同解決概述多機(jī)多顯系統(tǒng)的計(jì)算機(jī)接受到3DS文獻(xiàn)消息后,如果本地指定數(shù)據(jù)文獻(xiàn)夾中沒有指定的3DS文獻(xiàn),則給發(fā)出3DS文獻(xiàn)消息的計(jì)算機(jī)發(fā)送獲取文獻(xiàn)消息;發(fā)送端接受到獲取文獻(xiàn)消息后,得到指定3DS文獻(xiàn)的長度消息并發(fā)送給接受端計(jì)算機(jī);接受端計(jì)算機(jī)判斷本地與否已有臨時文獻(xiàn),如果沒有則創(chuàng)立臨時文獻(xiàn)并發(fā)送第一塊文獻(xiàn)數(shù)據(jù)接受消息,如果有臨時文獻(xiàn),則發(fā)送臨時文獻(xiàn)的下一塊文獻(xiàn)數(shù)據(jù)接受消息。當(dāng)發(fā)送端計(jì)算機(jī)收到文獻(xiàn)數(shù)據(jù)接受塊消息后,則將3DS文獻(xiàn)的指定塊讀入并發(fā)送給接受端計(jì)算機(jī);接受端計(jì)算機(jī)接受并保存文獻(xiàn)數(shù)據(jù),再發(fā)出接受下一塊文獻(xiàn)數(shù)據(jù)消息,直到接受端計(jì)算機(jī)接受到最后一塊文獻(xiàn)數(shù)據(jù),此時則向發(fā)送端計(jì)算機(jī)發(fā)送文獻(xiàn)傳輸結(jié)束消息,同時將臨時文獻(xiàn)改名為3DS文獻(xiàn)。發(fā)送端計(jì)算機(jī)收到文獻(xiàn)傳輸結(jié)束消息后,向接受端計(jì)算機(jī)發(fā)送3D模型運(yùn)動更新消息,接受端計(jì)算機(jī)按運(yùn)動消息設(shè)立并顯示3D模型,數(shù)據(jù)更新過程結(jié)束。數(shù)據(jù)更新合同解決辦法計(jì)算機(jī)在收到文獻(xiàn)傳輸消息后,根據(jù)文獻(xiàn)傳輸消息代碼分別進(jìn)行獲取文獻(xiàn)消息解決、獲取文獻(xiàn)回復(fù)消息解決、請求發(fā)送數(shù)據(jù)消息解決、發(fā)送數(shù)據(jù)消息解決、繼續(xù)請求發(fā)送數(shù)據(jù)消息解決和文獻(xiàn)接受完畢消息解決。各解決的具體辦法以下:(1)獲取文獻(xiàn)消息解決本解決是3DS文獻(xiàn)發(fā)送方計(jì)算機(jī)進(jìn)行的解決。當(dāng)消息的ID為FILE_MSG且傳輸內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_NAME時,發(fā)送3DS文獻(xiàn)數(shù)據(jù)的計(jì)算機(jī)便執(zhí)行獲取文獻(xiàn)消息解決。該解決重要是得到指定3DS文獻(xiàn)的長度,并打開指定的3DS文獻(xiàn)為后續(xù)的文獻(xiàn)數(shù)據(jù)傳輸解決做準(zhǔn)備。(2)獲取文獻(xiàn)回復(fù)消息解決本解決為3DS文獻(xiàn)接受方計(jì)算機(jī)進(jìn)行的解決。當(dāng)消息的ID為FILE_MSG且傳輸內(nèi)容代碼nFileMsgCode=RE_REQUIRE_FILE_NAME時,接受3DS文獻(xiàn)的計(jì)算機(jī)將執(zhí)行獲取文獻(xiàn)回復(fù)消息解決。該解決首先保存要傳輸3DS文獻(xiàn)的長度,用以進(jìn)行文獻(xiàn)傳輸結(jié)束的判斷,接下來進(jìn)行斷點(diǎn)續(xù)傳解決:檢查本地文獻(xiàn)夾中與否存在與要傳輸?shù)?DS文獻(xiàn)同名的臨時文獻(xiàn),如果沒有臨時文獻(xiàn)或臨時文獻(xiàn)的長度不是數(shù)據(jù)塊的整倍數(shù),則創(chuàng)立新的臨時文獻(xiàn),并發(fā)送從第一塊3DS文獻(xiàn)數(shù)據(jù)開始傳輸?shù)南?;如果本地文獻(xiàn)夾中已有與要傳輸?shù)?DS文獻(xiàn)同名的臨時文獻(xiàn)且臨時文獻(xiàn)的長度是數(shù)據(jù)塊的整倍數(shù),則發(fā)送從臨時文獻(xiàn)的下一塊3DS文獻(xiàn)數(shù)據(jù)開始傳輸?shù)南ⅰ#?)請求發(fā)送數(shù)據(jù)消息解決本解決為3DS文獻(xiàn)發(fā)送方計(jì)算機(jī)進(jìn)行的解決。當(dāng)消息的ID為FILE_MSG且傳輸內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_DATA時,發(fā)送3DS文獻(xiàn)的計(jì)算機(jī)進(jìn)行請求發(fā)送數(shù)據(jù)消息的解決。該解決讀取指定的3DS文獻(xiàn)數(shù)據(jù)塊并構(gòu)成發(fā)送數(shù)據(jù)消息,發(fā)送給文獻(xiàn)接受方。如果文獻(xiàn)全部讀完,還要在消息中設(shè)立文獻(xiàn)讀取完畢標(biāo)志。(4)請求發(fā)送數(shù)據(jù)消息解決本解決為3DS文獻(xiàn)接受方計(jì)算機(jī)進(jìn)行的解決。當(dāng)消息的ID為FILE_MSG且傳輸內(nèi)容代碼nFileMsgCode=RE_REQUIRE_FILE_DATA時,接受方計(jì)算機(jī)便進(jìn)行發(fā)送數(shù)據(jù)消息解決。該解決在接受第一塊3DS文獻(xiàn)數(shù)據(jù)時將指定的3DS臨時文獻(xiàn)打開,將所接受的3DS文獻(xiàn)數(shù)據(jù)塊保存到臨時文獻(xiàn)中,如果接受到的文獻(xiàn)數(shù)據(jù)中的文獻(xiàn)傳輸結(jié)束標(biāo)志置位,則向發(fā)送3DS文獻(xiàn)的計(jì)算機(jī)發(fā)送文獻(xiàn)接受完畢消息,否則向發(fā)送3DS文獻(xiàn)的計(jì)算機(jī)發(fā)送獲取下一塊文獻(xiàn)數(shù)據(jù)的消息。(5)繼續(xù)請求發(fā)送數(shù)據(jù)消息解決本解決為3DS文獻(xiàn)發(fā)送方計(jì)算機(jī)進(jìn)行的解決。當(dāng)消息的ID為FILE_MSG且傳輸內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_DATA_MORE時,發(fā)送3DS文獻(xiàn)的計(jì)算機(jī)便進(jìn)行繼續(xù)請求發(fā)送數(shù)據(jù)消息解決。該解決讀取指定的3DS文獻(xiàn)數(shù)據(jù)塊并構(gòu)成發(fā)送數(shù)據(jù)消息,發(fā)送給文獻(xiàn)接受方。如果文獻(xiàn)全部讀完,還要在消息中設(shè)立文獻(xiàn)讀取完畢標(biāo)志。(6)文獻(xiàn)接受完畢消息解決本解決為3DS文獻(xiàn)發(fā)送方計(jì)算機(jī)進(jìn)行的解決。當(dāng)消息的ID為FILE_MSG且傳輸內(nèi)容代碼nFileMsgCode=REQUIRE_FILE_END時,發(fā)送3DS文獻(xiàn)的計(jì)算機(jī)便進(jìn)行文獻(xiàn)接受完畢消息解決。該解決將關(guān)閉已經(jīng)打開的3DS文獻(xiàn),然后向3DS文獻(xiàn)的接受方計(jì)算機(jī)發(fā)送3DS模型運(yùn)動消息。
系統(tǒng)環(huán)境系統(tǒng)硬件環(huán)境單機(jī)多顯系統(tǒng)硬件環(huán)境本項(xiàng)目的單機(jī)多顯系統(tǒng)硬件環(huán)境為一臺高性能PC計(jì)算機(jī),該計(jì)算機(jī)能夠有下列兩種配備:配備1:主板上應(yīng)當(dāng)最少有一種AGP顯示適配器插槽,一種PCI插槽,這兩個插槽上分別插一塊AGP顯示適配器和一塊PCI顯示適配器,這兩塊顯示適配器必須是同一種型號,且使用同一組芯片集,每一塊顯示適配器含有兩個獨(dú)立的顯示接口,每一種顯示接口能夠接一種顯示屏。配備2:主板上應(yīng)當(dāng)最少有一兩個PCI-E插槽,這兩個插槽上分別插一塊PCI-E顯示適配器,這兩塊顯示適配器必須是同一種型號,且使用同一組芯片集,每一塊顯示適配器含有兩個獨(dú)立的顯示接口,每一種顯示接口能夠接一種顯示屏。上述計(jì)算機(jī)所配的顯示適配器必須含有OpenGL硬件加速功效,以滿足系統(tǒng)對3D顯示速度的規(guī)定。如此配備的計(jì)算機(jī),能夠外接四個獨(dú)立的顯示屏。本項(xiàng)目單機(jī)多顯系統(tǒng)的樣機(jī)配備為:主機(jī):CPU:Intel酷睿2Q6600主板:華碩P5KPremium/WiFi-AP內(nèi)存:DDR2-8004硬盤:320G顯示適配器:XFX訊景8800GTS(T80G-GHD)顯示屏:三星931C19英寸普屏多機(jī)多顯系統(tǒng)硬件環(huán)境本項(xiàng)目的多機(jī)多顯系統(tǒng)硬件環(huán)境為若干臺高性能PC計(jì)算機(jī),計(jì)算機(jī)上的顯示適配器必須含有OpenGL硬件加速功效,這些計(jì)算機(jī)通過以太網(wǎng)連接在一起。本項(xiàng)目多機(jī)多顯系統(tǒng)的樣機(jī)配備為:主機(jī):CPU:Intel酷睿2E6320主板:微星P35Neo2-FR內(nèi)存:DDR2-6672G硬盤:250G顯示適配器:XFX訊景8600GTS(T84G-UDD完美版)顯示屏:三星931C19英寸普屏系統(tǒng)軟件環(huán)境本項(xiàng)目的單機(jī)多顯系統(tǒng)和多機(jī)多顯系統(tǒng)的軟件環(huán)境為WindowsXP或Windows操作系統(tǒng)。兩種系統(tǒng)都要對顯示適配器進(jìn)行配備,應(yīng)當(dāng)將其硬件加速功效調(diào)節(jié)到最大值。另外,單機(jī)多顯系統(tǒng)還要對顯示桌面進(jìn)行擴(kuò)展配備,首先允許將桌面擴(kuò)展到主屏外的另外三個顯示屏,然后將它們進(jìn)行排列,排列的方式是:主屏在最左邊,其它三個顯示屏依次排列在主屏的右方。系統(tǒng)功效設(shè)計(jì)單計(jì)算機(jī)對多顯示屏的同時控制功效本項(xiàng)目單機(jī)多顯系統(tǒng)規(guī)定所研制的軟件能夠在給定的硬件環(huán)境下控制四個不同的顯示屏并同時顯示同一種3D對象不同視角的3D透視圖。其軟件設(shè)計(jì)必須實(shí)現(xiàn)以下功效:一臺計(jì)算機(jī)對多個顯示屏的控制功效:通過桌面擴(kuò)展,將四個顯示屏對應(yīng)的顯示區(qū)域有序地排列在一起,程序能夠按照預(yù)定的位置檢測這些顯示屏的存在并獲取各個顯示屏的顯示信息。不同顯示屏有效信息顯示功效:系統(tǒng)能夠?qū)z測到的各顯示屏的狀態(tài)顯示在程序的狀態(tài)欄上。瀏覽的同時顯示功效:顧客操作鼠標(biāo)在主顯示視圖上進(jìn)行多個瀏覽控制,這些控制必須同時同時在其它三個顯示屏上按各自的視角設(shè)立,進(jìn)行對應(yīng)的顯示變換。單機(jī)多顯系統(tǒng)3D瀏覽和控制功效任意方向旋轉(zhuǎn)功效在程序設(shè)立為非平移模式下,顧客在主視圖上,按下鼠標(biāo)左鍵,然后拖動鼠標(biāo)光標(biāo),所顯示的3D對象便能夠按顧客操作的方向以3D對象的質(zhì)心為中心進(jìn)行旋轉(zhuǎn)。平移功效在程序設(shè)立為平移模式下,顧客在主視圖上,按下鼠標(biāo)左鍵,然后拖動鼠標(biāo)光標(biāo),所顯示的3D對象便能夠按顧客操作的方向進(jìn)行平行移動。顯示比例自動調(diào)節(jié)功效不同的3D對象數(shù)據(jù)含有不同的尺寸單位,如果按照固定的比例顯示,會出現(xiàn)某些對象太大或某些對象太小的狀況。程序應(yīng)當(dāng)含有顯示比例的自動調(diào)節(jié)功效。在系統(tǒng)讀入3D數(shù)據(jù)時,就對數(shù)據(jù)進(jìn)行歸一化解決,并調(diào)節(jié)數(shù)據(jù)的中心坐標(biāo)和視景尺寸,以實(shí)現(xiàn)任何3D數(shù)據(jù)在裝入后能以最清晰的比例全部顯示在屏幕上。放大和縮小功效為了能夠使顧客觀察3D對象不同位置的細(xì)節(jié),程序應(yīng)當(dāng)含有局部放大和整體縮小功效,這樣,顧客能夠通過平移、旋轉(zhuǎn)和放大操作,觀察到3D對象任一位置的細(xì)節(jié)。對3D對象過分的放大會使觀察點(diǎn)進(jìn)入對象內(nèi)部,造成顧客感覺顯示錯誤;相反,過分的縮小會使顯示對象消失。因此,顯示的放大和縮小功效必須有視點(diǎn)位置的限制,以避免過分的放大和縮小給顧客造成系統(tǒng)失效的錯覺。視角設(shè)立功效單機(jī)多顯系統(tǒng)的特點(diǎn)是同一種3D對象的多視角顯示,為了不引發(fā)瀏覽錯覺,除主屏顯示外,另外三個屏幕的顯示視角是相對固定的,僅主屏的視角能夠按需要進(jìn)行設(shè)立。視角的設(shè)立功效能夠?qū)⒅黠@示屏的視角設(shè)立為正視、后視、俯視、仰望、左視和右視六種視角模式。背景顏色設(shè)立功效不同的3D顯示對象含有不同的顏色,因此需要不同的背景顏色以更加好地體現(xiàn)3D對象的顯示效果。背景顏色的設(shè)立能夠?qū)?D顯示的背景顯示顏色設(shè)立為任何一種顏色,以實(shí)現(xiàn)同時顯示對象的最佳顯示效果。繪制模式切換功效OpenGL支持面和線兩種三維顯示方式,面顯示方式以3D對象的面片為顯示單元,含有多個三維效果解決,能夠較好地表達(dá)顯示對象的三維特性。線顯示方式則僅顯示3D對象面片的邊界限,不含有光照和陰影解決等功效,但能夠較好地體現(xiàn)3D對象的構(gòu)造和構(gòu)成特性。程序應(yīng)當(dāng)能夠允許顧客以兩種不同的模式顯示3D對象,因此必須含有兩種顯示模式的切換設(shè)立功效。鳥瞰導(dǎo)游功效當(dāng)顧客對顯示的3D對象進(jìn)行放大操作時,屏幕上只能顯示3D對象的某個局部視圖,此時進(jìn)行的平移或旋轉(zhuǎn)操作會使顯示畫面發(fā)生激烈的變化,給顧客造成迷失方向的感覺。鳥瞰導(dǎo)游功效是在主顯示屏幕上顯示一種小的窗口,該窗口始終顯示主視圖完整3D對象的畫面,并在小窗口中標(biāo)明現(xiàn)在主視圖的顯示區(qū)域(視景區(qū)),以提示顧客現(xiàn)在的觀察的視角和局部所在位置,起到瀏覽導(dǎo)游的功效。另外,通過在小窗口中拖動視景區(qū),還能夠起到調(diào)節(jié)主顯示屏中所顯示的3D對象位置的功效。自動演示和測試功效自動演示功效能夠起到軟件使用辦法快速入門的作用。該功效能夠自動地模擬顧客進(jìn)行重要瀏覽功效操作的效果顯示,不僅能夠讓初學(xué)者在較短的時間內(nèi)理解和學(xué)習(xí)軟件的使用,還能夠讓觀察者在較短的時間內(nèi)理解系統(tǒng)的功效。由于本系統(tǒng)軟件涉及3D對象的顯示,需要計(jì)算機(jī)含有較高的計(jì)算能力和顯示性能。為了能夠比較不同計(jì)算機(jī)在完畢本系統(tǒng)解決功效時性能上的優(yōu)劣,本系統(tǒng)專門設(shè)計(jì)了自動測試功效,該功效能夠自動計(jì)算現(xiàn)在運(yùn)行軟件的計(jì)算機(jī)完畢特定顯示解決所用的時間,方便使用者比較不同計(jì)算機(jī)用本系統(tǒng)軟件進(jìn)行3D對象顯示時的性能。多機(jī)多顯系統(tǒng)3D瀏覽和控制功效多計(jì)算機(jī)信息顯示功效多機(jī)多顯3D同時顯示系統(tǒng)由多臺通過以太網(wǎng)連接的計(jì)算機(jī)構(gòu)成。每臺計(jì)算機(jī)上除了顯示本地3D對象指定視角的三維視圖外,還
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年科研開發(fā)借款合同3篇
- 2024年物流行業(yè)派遣公司與企業(yè)貨運(yùn)勞務(wù)派遣合同3篇
- 2024民間借貸知識產(chǎn)權(quán)租賃抵押借貸合同范例3篇
- 2024年移動運(yùn)營商業(yè)務(wù)協(xié)作協(xié)議版B版
- 2024年版租賃合同標(biāo)的及權(quán)益說明
- 2024年美容行業(yè)勞務(wù)合同3篇
- 2024影視制作公司與網(wǎng)絡(luò)視頻平臺版權(quán)許可使用合同
- 2024月餅禮盒定制采購合同模板3篇
- 2024年高端設(shè)備制造技術(shù)引進(jìn)協(xié)議
- 2024年融資擔(dān)保中介合同
- Python程序設(shè)計(jì)智慧樹知到期末考試答案章節(jié)答案2024年山東財(cái)經(jīng)大學(xué)
- 財(cái)政投資評審咨詢服務(wù)預(yù)算和結(jié)算評審項(xiàng)目 投標(biāo)方案(技術(shù)方案)
- 江蘇省徐州市2022-2023學(xué)年三年級下學(xué)期語文期末考試試卷(含答案)2
- JGJ46-2005 施工現(xiàn)場臨時用電安全技術(shù)規(guī)范
- 鋁合金百葉窗施工方案
- 勞動的意義與價(jià)值第二單元學(xué)習(xí)任務(wù)高中語文必修上冊
- 天然氣管道運(yùn)輸安全培訓(xùn)
- 中考語文-排序題(30題含答案)-閱讀理解及答案
- (高清版)TDT 1013-2013 土地整治項(xiàng)目驗(yàn)收規(guī)程
- 我國農(nóng)村社會保障制度存在的問題分析及對策樣本
- 西晉的短暫統(tǒng)一和北方各族的內(nèi)遷 一等獎
評論
0/150
提交評論