㈠ 如何在Web上直接瀏覽大規模OSGB格式傾斜模型(二):轉換OSGB
歡迎關注公號【 三維網格3D 】,第一時間獲取最新文章
上一篇( 如何在Web上直接瀏覽大規模OSGB格式傾斜模型(一):解析OSGB )已經貼出了解析結果,讓我們對OSGB傾斜模型文件內部結構有了比較清晰的認識,本篇我們將解析結果轉成three.js對象,並實現單個模型的顯示。
為什麼轉成three.js對象
從解析結果看,Osg對象的節點關系用three.js對象表達更容易,轉換結果可以直接用three.js顯示,通過我們團隊的Cesium和three.js融合方案,可以輕松將成果用於Cesium開發的項目,既可以單獨使用,又可以擁有GIS能力。
需要轉換的Osg類型
解析得到的Osg對象,Type屬性指示對象的類型,我們只是要轉換傾斜攝影模型文件的Osg對象,而不是做一個通用的轉換工具,所以先將類型做一下分類,只轉換目前所用測試數據(100多G的測試數據)已知的類型。
PS:我們團隊內部使用的版本,經過一年多的應用和改進,支持了更多類型的轉換,填了許多坑,而且支持osgb、osgt、osg、osgjs四種格式文件,載入速度和健壯性都得到保障。歡迎咨詢~
節點類
osg::Node
osg::Geode
osg::Group
osg::LOD
osg::PagedLOD
osg::MatrixTransform
幾何類
osg::Geometry
osg::OsgArray
材質類
osg::StateSet
osg::Material
osg::StateAttribute
osg::Texture
osg::Texture2D
osg::Image
節點類主要考慮osg::MatrixTransform,因為這個節點主要的信息就是變換參數,會影響模型的位置、旋轉、縮放等。
接下來我們著重介紹轉換幾何和材質這兩類,LOD和PagedLOD參數不多,而且都是調度相關的,我們放在下一篇一起介紹。
轉換幾何對象
幾何數據存儲在Osg::Geometry,包含索引屬性PrimitiveSetList、位置坐標屬性VertexArray、紋理坐標屬性TexCoordArray。我們將其轉換為THREE.BufferGeometry。
varbufferGeometry=newTHREE.BufferGeometry();
頂點屬性轉換
頂點屬性值是一個二維數組,我們直接調用flat方法,轉為一維數組即可。
varpositions=newFloat32Array(osgGeometry.VertexArray.flat());
varuvs=newFloat32Array(osgGeometry.TexCoordArray.flat());
bufferGeometry.setAttribute('position',newTHREE.BufferAttribute(positions,3));
bufferGeometry.setAttribute('uv',newTHREE.BufferAttribute(uvs,2));
索引轉換
索引類型有兩種,有value指定,這里我們只對索引類型為4的情況(即繪圖最小單元為四邊形)進行特殊處理,其餘的默認最小繪制單元為三角形。
varprimitiveSet=osgGeometry.PrimitiveSetList[0]
varindices=primitiveSet.data;
if(primitiveSet.value==4) {
letnewIndices=[];
for(leti=0; i<indices.length; i+=4) {
leti0=indices[i],
i1=indices[i+1],
i2=indices[i+2],
i3=indices[i+3];
newIndices.push(
i0, i1, i3,
i1, i2, i3
);
}
indices=newIndices;
}
bufferGeometry.setIndex(indices);
轉換材質對象
傾斜攝影模型的材質最重要的就是貼圖,作為原理介紹,我們不處理其他材質參數,直取貼圖即可,當然工程應用上我們還是需要處理一些情況,保證其可用、可靠、健壯。
材質對象存儲在Osg::Geometry的StateSet屬性,該屬性類型為Osg::StateSet,而我們要的貼圖存儲在Osg::StateSet的TextureAttributeList屬性,一般就一張圖。
傾斜模型已經包含了光影信息,為此我們將材質轉為THREE.MeshBasicMaterial。
varmaterial=newTHREE.MeshBasicMaterial({
side:THREE.DoubleSide
});
處理貼圖
貼圖一般是jpg或者png格式,我們這里只處理這兩種格式。需要注意的是圖片數據為Uint8Array類型,我們需要先轉為Blob,然後通過URL.createObjectURL創建url,最後使用THREE.TextureLoader載入。
varosgStateSet=osgGeometry.StateSet;
varosgImage=osgStateSet.TextureAttributeList[0].value.StateAttribute.Image
varfileName=osgImage.Name;
constisJPEG=fileName.search(/\.jpe?g($|\?)/i)>0
constisPNG=fileName.search(/\.png($|\?)/i)>0
if(!isPNG&&!isJPEG)return;
varmimeType=isPNG?'image/png':'image/jpeg';
varimageUri=newBlob([osgImage.Data], { type:mimeType });
imageUri=URL.createObjectURL(imageUri)
vartexture=newTHREE.TextureLoader().load(imageUri, ()=>{
texture.needsUpdate=true
})
創建網格
最後,使用轉換好的幾何體和材質創建模型網格。這里要注意,傾斜攝影模型是z軸朝上(z-up),而three.js渲染是y軸朝上(y-up),所以還需將網格繞x軸旋轉y-90°才得到正常的渲染效果。
varmesh=newTHREE.Mesh(geometry, material);
mesh.rotation.x=-Math.PI/2
轉換結果
顯示效果
額,看起來並沒有那麼好看~畢竟這是單個瓦片最不清晰的那層,簡化到不能看了。
下一篇,我們將主要介紹如果實現PagedLOD,來載入大規模傾斜攝影模型,敬請期待
歡迎關注公號【 三維網格3D 】,第一時間獲取最新文章
㈡ 關於WebGL的基本現狀
WebGL(全寫Web Graphics Library)是一種3D繪圖協議,這種繪圖技術標准允許把JavaScript和OpenGL ES 2.0結合在一起,通過增加OpenGL ES 2.0的一個JavaScript綁定,WebGL可以為HTML5 Canvas提供硬體3D加速渲染,這樣Web開發人員就可以藉助系統顯卡來在瀏覽器里更流暢地展示3D場景和模型了,還能創建復雜的導航和數據視覺化。
顯然,WebGL技術標准免去了開發網頁專用渲染插件的麻煩,可被用於創建具有復雜3D結構的網站頁面,甚至可以用來設計3D網頁游戲等。
WebGL 的最大優勢就是能通過網頁做到快速傳播,用酷炫的圖形體驗達到營銷宣傳等目的。
WebGL基本現狀
WebGL 1.0 基本有98%的設備支持率,而 WebGL 2.0 有大概49%的設備支持率,並逐步在上升。
其中 WebGL 2.0 的重要特性有
WebAssembly方面:許多 C3D 引擎都開始涉及這塊領域。比如 oryol,一個輕量級的 C 框架。其中物理模擬的部分通過 Webassembly 的方式去做,在 web 上做了個布料模擬的 demo。當然 Unity 和 Unreal 也都推出了自己基於 Webassembly 的 demo:
Unity:兩個 demo,分別為:tank,webgl_linear。
Unreal:EpicZenGarden。
研發描述:在 WebGL 實現 OpenGL ES 3.1 的功能,主要是 Compute Shader!
研發狀態:
對於 OpenGL 和 D3D 後端 Compute Shader 都基本完成,通過在 Chrome 中設置 flag enable-webgl2-compute-context 可以使用。
基於 Compute Shader 的 Tensorflow.js 基本可以運行。
研發計劃:
在今年末實現所有 Compute Shader 的特性。
在 Emscripten 中支持 WebGL 2.0。
將 Native dEQP ES 3.1 的樣例移植到Web端。
根據需求實現 OpenGL ES 3.1的其他特性
WebGL 研發中的新特性
英特爾的先進網路科技團隊對 WebGL 的生態系統做出了許多貢獻,因此新特性部分主要由他們來展示。
WebGL 2.0 Compute
常見的Web開發軟體
基於 WEBGL 的 3D:three.js , osgjs
其中 three.js 最火爆,是純JS包osg 還有對應的 C++ 跟 .NET 包, OSGJS 並不是 OSG 的重點;
專注於 WEB 3D GIS 的 WEBGL:osmstreet、openwebglobe、readymap這個是做 3D 城市規劃的;
基於 IE ACTIVEX OCX 的 3D:unity3D , 很火, 做WEB游戲,做 anroid 游戲, IE CHORME 都可以google earth 學習成本低;
基於 AS3 的 3D:Away3d、FLASH 正在走下坡;
下方
運營:weikashouji
㈢ 常見的Web3D開發軟體工具
你可以先去【繪學霸】網站找「3d建模」板塊的【免費】視頻教程-【點擊進入】完整入門到精通視頻教程列表: www.huixueba.net/web/AppWebClient/AllCourseAndResourcePage?type=1&tagid=307&zdhhr-11y04r-1732515186659462987
想要系統的學習可以考慮報一個網路直播課,推薦CGWANG的網路課。老師講得細,上完還可以回看,還有同類型錄播課可以免費學(贈送終身VIP)。
自製能力相對較弱的話,建議還是去好點的培訓機構,實力和規模在國內排名前幾的大機構,推薦行業龍頭:王氏教育。
王氏教育全國直營校區面授課程試聽【復制後面鏈接在瀏覽器也可打開】: www.huixueba.com.cn/school/3dmodel?type=2&zdhhr-11y04r-1732515186659462987
在「3d建模」領域的培訓機構里,【王氏教育】是國內的老大,且沒有加盟分校,都是總部直營的連鎖校區。跟很多其它同類型大機構不一樣的是:王氏教育每個校區都是實體面授,老師是手把手教,而且有專門的班主任從早盯到晚,爆肝式的學習模式,提升會很快,特別適合基礎差的學生。
大家可以先把【繪學霸】APP下載到自己手機,方便碎片時間學習——繪學霸APP下載: www.huixueba.com.cn/Scripts/download.html