王海濤,劉美艷,郭 菊朱 峰
(1.江蘇省水利勘測設(shè)計研究院有限公司,江蘇 揚州 225009;2.安徽省招標(biāo)集團股份有限公司,安徽 合肥 230000)
隨著互聯(lián)網(wǎng)的快速發(fā)展,各行各業(yè)的資源都得到不同程度的共享,網(wǎng)絡(luò)信息化[1]逐漸成為各行業(yè)工作者的第一選擇。以網(wǎng)絡(luò)為途徑,特別是在近年用戶體驗需求和3D虛擬現(xiàn)實技術(shù)興起的條件下,對三維模型網(wǎng)頁端顯示的研究有了十分巨大的發(fā)展,呈現(xiàn)出將靜態(tài)的、不能交互的模型展示轉(zhuǎn)向動態(tài)呈現(xiàn)、實時交互的發(fā)展趨勢[2]。作為水利工作者為了使一些水電站能夠擁有一個良好的模型展示與用戶交互平臺,讓管理人員方便地瀏覽電站模型的空間三維效果,使電站資源得到更大程度的開發(fā)利用,所以有必要建立平臺使大壩模型展示在網(wǎng)頁端。
近年基于Web3D[3]技術(shù)所建立的空間模型[4]已經(jīng)被各行各業(yè)廣泛使用,VRML[5](Virtual Reality Modeling Language)技術(shù)需要在瀏覽器端安裝專門的渲染插件才能實現(xiàn)三維模型瀏覽器端的展示,且編程接口復(fù)雜。如今流行的軟件如Unity3D[6]等都需要安裝相應(yīng)的渲染插件,插件的下載安裝程序復(fù)雜繁瑣,且存在瀏覽器兼容問題[7],而WebGL技術(shù)隨著互聯(lián)網(wǎng)的發(fā)展已經(jīng)成為很多行業(yè)的選擇[8]。本文基于大壩空間模型、three.js空間動態(tài)展示技術(shù),建立起一個能直觀、逼真地再現(xiàn)并且允許用戶交互的水利工程虛擬可視化系統(tǒng),為水利工程的管理提供一個新的技術(shù)平臺。
WebGL借助于HTML5(Hyper Text Markup Language)的Canvas元素進行渲染,可以在網(wǎng)頁上創(chuàng)建三維復(fù)雜場景與模型[9],同時WebGL可以為HTML5 Canvas提供硬件3D加速渲染。Canvas元素是HTML5中最常用的元素,用于創(chuàng)建圖形和動畫,它在一定范圍內(nèi)減少了插件的使用,提高了瀏覽器運行效率[10]。
至今,基于WebGL的API已經(jīng)開發(fā)出很多框架,主要包括:Three.js、GLGE、C3DL等。使用流程大多相通,使用時都需對三維世界的基本元素進行定義。
本文采用Three.js框架進行水利大壩模型在Web瀏覽器端的三維可視化展示,共有三部分組件:場景(scene)對應(yīng)實體空間,起容納作用;相機(camera)對應(yīng)視線,起觀察瀏覽作用;渲染器(renderer)起到為不同對象渲染外觀作用。三個組件將模型渲染到網(wǎng)頁中[11]如圖1所示。

圖1 Three.js基本結(jié)構(gòu)模塊
1.2.1場景創(chuàng)建
場景對應(yīng)的是現(xiàn)實世界的空間環(huán)境,起到容納的作用,所有的物體、相機、燈光等都需要放置在場景內(nèi)部,相關(guān)代碼如下:
scene=new THREE.Scene();
1.2.2相機設(shè)置
相機主要有正交相機(OrthographicCamera)和透視相機(PerspectiveCamera),其目的是將三維空間里的物體模型映射到二維平面中,正投影中物體模型的大小與視點的距離無關(guān),透視投影中物體模型的大小與視點的距離會呈現(xiàn)出近大遠小現(xiàn)象。相關(guān)代碼如下:
camera=new THREE.PerspectiveCamera(60,window.innerWidth/window.innerHeight,1,1000);
camera.position.set(20,40,20);
1.2.3光源設(shè)置
光源對應(yīng)的是現(xiàn)實世界的各類光,如環(huán)境光、平行光、點光、半球光等,為了使物體在場景中顯示的更加真實以及模擬不同環(huán)境下物體顯示效果。代碼如下:
var ambientLight = new THREE.AmbientLight(0xeeeeee,0.8);
scene.add(ambientLight);
1.2.4渲染器設(shè)置
定義好場景中的三維模型,設(shè)置好燈光并添加好相機之后,通過調(diào)用渲染函數(shù)使存在于三維空間里的模型以二維平面的形式顯現(xiàn)出來。將渲染結(jié)果綁定到
renderer=new THREE.WebGLRenderer({antialias∶true});
renderer.localClippingEnabled = true;
document.getElementById('showModelDiv').appendChild(renderer.domElement);
2.1.1模型的創(chuàng)建
大壩三維模型中信息繁雜,最優(yōu)的處理方式是將模型及細部信息在建模軟件中建立好,導(dǎo)出成three.js能夠識別的模型文件,然后由three.js內(nèi)部實現(xiàn)網(wǎng)頁端模型的重建與顯示。本文基于三維參數(shù)化建模方法和參數(shù)化族庫創(chuàng)建方法,以revit軟件作為建模工具,建模流程如圖2所示,模型建好后導(dǎo)出成fbx格式。

圖2 建模流程圖
將模型按照建筑物類型劃分,確定出模型的各子模型,將子模型繼續(xù)拆分為構(gòu)件;運用revit的參數(shù)化建模,開發(fā)構(gòu)件模型,建立構(gòu)件庫;通過構(gòu)件裝配,生成子模型,進而建立模型模版庫,最后組裝成整體模型。
2.1.2模型的導(dǎo)入
模型的導(dǎo)入需借助加載器,這就涉及到三維模型的導(dǎo)入及處理問題[13],不同格式的模型對應(yīng)不同的加載器,常用的幾種不同的加載器見表1。

表1 加載器
本文采用Revit三維建模軟件制作三維模型,模型以.fbx格式導(dǎo)出,并對模型的位置、大小、紋理、顏色進行修改,流程如圖3所示。

圖3 模型修改流程圖
2.2.1界面組件控制器
引入dat.gui.js,快速創(chuàng)建界面組件的相關(guān)控制流程如圖4所示。

圖4 界面組件創(chuàng)建
代碼如下:
gui=new dat.GUI();
gui.add(params,'planeConstantX',-40,40).step(0.001).name('planeX Constant').onChange(function(value){
clipPlanes[0].constant = value;renderer.render(scene,camera); })
2.2.2模型查看控制器(controls)
引入OrbitControls.js,實現(xiàn)對模型的交互,如旋轉(zhuǎn),縮放,移動等,代碼如下:
controls = new THREE.OrbitControls(camera,renderer.domElement);
controls.update();
2.2.3模型內(nèi)部與詳細信息查看
用戶通過點擊模型的任何部位以觀察該部位的詳細信息,具體實現(xiàn)流程如圖5所示。
代碼如下:
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
function showInfo(event){
$('#infoTable tbody').empty();
raycaster.setFromCamera(mouse,camera);
for(let index = 0; index < loadedObject.length; index++){
const element = loadedObject[index];
if(element.type=='Mesh'){
var intersects = raycaster.intersectObject(element);
for(let index = 0; index < intersects.length; index++){
const element = intersects[index];
for(const key in element){
if(element.hasOwnProperty(key)){
const subElement = element[key];
var table = '
$('#infoTable tbody').append(table);} }} }}
此外,壩體模型內(nèi)部布置有監(jiān)測儀器模型,用戶通過界面組件控制器對壩體模型進行切割以便觀察。
以江蘇某工程為例,將實際的水利工程簡化成BIM模型。由于工程是重力壩,各壩段之間相似性很高,因此可以建立基本參數(shù)化族。壩段整體為擋水壩段,無泄水壩段,因此參數(shù)化族僅需要創(chuàng)建一個。
3.1.1參數(shù)化建族
大壩模型每個壩段存在著相似,因此可以建立參數(shù)化壩段族,將大壩的高度、頂部寬度、底部寬度、壩段寬度、上下游折坡點高度、坡率、廊道的底部高程、廊道高度、廊道寬度、廊道距離上游面距離、廊道個數(shù)等參數(shù),參數(shù)化形成模板壩段,之后整體模型多次加載壩段族并確定位置坐標(biāo)即可。具體過程如圖 6所示。
除了壩段模型外,監(jiān)測儀器按照不同監(jiān)測類型分別建立相應(yīng)的族文件,按照實際布置于大壩的位置引入到模型中即可。
3.1.2整體模型組建
參數(shù)化族創(chuàng)建好后需要載入項目,組合生成整體模型,流程如下:
(1)壩體基本族庫創(chuàng)建好后,新建項目文件。
(2)根據(jù)實際水利工程的橫剖面圖在建筑立面中繪制相應(yīng)的標(biāo)高。
(3)根據(jù)平面布置圖中各建筑結(jié)構(gòu)的位置繪制相對應(yīng)的參照平面。
(4)按順序依次載入建好的模型,以繪制好的標(biāo)高和參照平面為基準(zhǔn),完成模型的定位放置,最終完成所有模型的組裝。

圖6 參數(shù)化操作流程圖
將創(chuàng)建好的模型以.fbx格式導(dǎo)出,three.js可以加載帶材質(zhì)的模型也可以加載不帶材質(zhì)的模型,這取決于用戶需求。本工程不涉及大壩材質(zhì)的詳細展示,僅用相應(yīng)顏色進行渲染,使之與實際壩體相符,操作流程如圖 7所示。

圖7 格式轉(zhuǎn)換圖
模型格式轉(zhuǎn)換完成后,開始創(chuàng)建相應(yīng)代碼將BIM模型導(dǎo)入網(wǎng)頁端并顯示。實現(xiàn)模型旋轉(zhuǎn),平移,縮放,透視,模型剖切等功能如圖 8所示。

圖8 模型展示圖
本文基于WebGL技術(shù),采用Three.js框架實現(xiàn)了水利大壩三維模型在客戶端Web瀏覽器的可視化展示與信息查看。通過調(diào)用不同模型加載器,導(dǎo)入外部三維模型;利用Three.js自帶的場景、相機、渲染器等基本功能模塊,實現(xiàn)了大壩三維模型在網(wǎng)頁端的顯示;通過模型控制器模塊使用戶能夠輕松完成交互,實現(xiàn)模型的平移、縮放、旋轉(zhuǎn)功能;利用界面組件控制器實現(xiàn)了壩體內(nèi)部細部構(gòu)造及其詳細信息在Web瀏覽器的查詢?yōu)g覽。本文的研究成果可應(yīng)用于水利工程信息化可視平臺開發(fā),為可視平臺的三維模型展示提供一種技術(shù)手段。