玩轉HTML5 下 WebGL 的 3D 模型交並補

2020-12-22 CSDN

CSG 構造實體幾何這個概念在工業水利水電施工上、遊戲上已經有很多人使用了,最簡單的實體表示叫作體元,通常是形狀簡單的物體,如立方體、圓柱體、稜柱、稜錐、球體、圓錐等。根據每個軟體包的不同這些體元也有所不同,在一些軟體包中可以使用彎曲的物體進行 CSG 處理,在另外一些軟體包中則不支持這些功能。構造物體就是將體元根據集合論的布爾邏輯組合在一起,這些運算包括:併集、交集以及補集。我們一般可以用 CSG 來將簡單的模型合在一起生成複雜的模型,這樣在構造模型的時候會省很多力。

HT 中的 ht.CSGNode 圖元類型就是參考 CSG 封裝的一個函數,ht.CSGNode 繼承於 ht.Node,當 style 的 shape3d 屬性為空時顯示為六面體效果,CSGNode如果通過 setHost 吸附到 宿主 CSGNode 或 CSGShape 後,宿主 CSGNode 或 CSGShape 可與吸附的CSGNode圖元進行CSG的組合建模。詳情請參考 HT for Web 建模手冊 CSGNode 章節。這裡我用 CSG 的概念寫了一個例子,讓大家能更好地理解這個概念。

本例 Demo 地址:http://hightopo.com/guide/guide/plugin/modeling/examples/example_bookshelf.html

先來看下效果圖:

從上面效果圖可以看到,我們將界面分為三個部分,這三個部分先是右邊部分上下分割,然後將整個界面左右分割,HT 用封裝好的 ht.widget.SplitView 進行界面的分割,然後將分割組件添加進底層 div 中:

dm = new ht.DataModel();// 數據模型 treeView = new ht.widget.TreeView(dm); //樹組件 gv1 = new ht.graph3d.Graph3dView(dm); //3D 組件 gv2 = new ht.graph3d.Graph3dView(dm); splitView = new ht.widget.SplitView(gv1, gv2, 'v', 0.6);//分割組件 mainSplit = new ht.widget.SplitView(treeView, splitView, 'h', 0.27); view = mainSplit.getView(); view.className = 'main'; document.body.appendChild(view); window.addEventListener('resize', function (e) { mainSplit.invalidate(); }, false);

上面代碼是一種非常常見的在 HTML 中添加 HT 組件的方法,詳情可參考 HT for Web 入門手冊組件章節。這種方法進行添加 HT 組件有一個需要注意的點,因為 HT 一般都以設置 position 為 absolute 的絕對定位方式,必須設置 left、right、top、bottom 等等基礎 css 樣式,像這樣:

.main { margin: 0px; padding: 0px; position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px; }

所以為了最外層組件加載填充滿窗口的方便性,HT 的所有組件都有 addToDOM 函數,其思想邏輯如下,其中 iv 是 invalidate 的縮寫:

addToDOM = function(){ var self = this, view = self.getView(), style = view.style; document.body.appendChild(view); style.left = '0'; style.right = '0'; style.top = '0'; style.bottom = '0'; window.addEventListener('resize', function () { self.iv(); }, false); }

以後我們在代碼中就可以直接調用 addToDOM 函數,而不用寫一大堆代碼了,上面代碼用 addToDOM 取代之後的代碼如下,而且不用描繪 css 樣式:

dm = new ht.DataModel();// 數據模型

treeView = new ht.widget.TreeView(dm); //樹組件

gv1 = new ht.graph3d.Graph3dView(dm); //3D 組件

gv2 = new ht.graph3d.Graph3dView(dm);

splitView = new ht.widget.SplitView(gv1, gv2, 『v』, 0.6);//分割組件

mainSplit = new ht.widget.SplitView(treeView, splitView, 『h』, 0.27);

mainSplit.addToDOM();

界面分配好之後我們就要對其添加內容了,界面的左邊部分是 HT 封裝的樹組件,我在之前的文章寫到過,樹組件是一個非常方便的繪製樹形關係的組件,開發人員能夠輕鬆地從數據模型 DataModel 中獲取數據和節點之間的關係放到樹上,只需要在樹組件聲明的過程中,將對應的數據模型 DataModel 放進樹組件的參數即可,當然我們還擴展了很多跟樹組件有關的函數,非常方便實用,這裡我們只用了 expandAll 函數,將所有對象展開:

treeView = new ht.widget.TreeView(dm); //樹組件 treeView.expandAll();

右邊部分上下分為兩部分,都是 3D 場景,就是設置顯示有點不同,其他完全相同,上面的 3D 場景重載了 getVisibleFunc 函數,如果元素的 showMe 屬性為 true,則可視;如果節點為 ht.CSGNode 類型並且節點的 getHost 函數的參數為空,則不可視;其他情況均可視:

gv1.setVisibleFunc(function(data){ if(data.showMe){ return true; } if(data instanceof ht.CSGNode && data.getHost()){ return false; } return true; });

我們先向 3D 場景中添加元素對象,我們先解釋中間的書架,對兩邊的書架有缺的再進行補充。首先我們添加了一個 ht.CSGNode 節點 shelf,作為書架的主節點,其他的節點都是依附於這個節點的,對這個節點設置了位置、大小、名稱以及六個面的顏色,然後添加進數據模型 DataModel:

var shelf = new ht.CSGNode(); shelf.s3(500, 400, 120); shelf.p3(0, 200, 0); shelf.setName('shelf1'); shelf.s({ 'all.color': '#E5BB77' }); dm.add(shelf);

接著向這個 shelf 中添加 10 個節點,做書架的格子效果,並設置依附關係和父子關係添加進數據模型中:

for(var i=0; i<2; i++){ for(var j=0; j<5; j++){ var clipNode = new ht.CSGNode(); clipNode.setHost(shelf); clipNode.s3(80, 100, 120); clipNode.p3(-200+j*100, 340-i*120, 20); clipNode.setName('substract-'+i+'-'+j); clipNode.s('batch', 'tt'); clipNode.setParent(shelf); dm.add(clipNode); } }

為了讓書架變得更美觀一點,我們在書架的上下左右都加上了 ht.CSGNode,最後為了更加具象化,我們還添加了一本書,實現方式也差不多,都非常簡單:

var book = new ht.Node(); book.setName('CSS3: The Missing Manual'); book.s3(60, 80, 8); book.p3(-100, 210, 20); book.r3(-Math.PI/6, Math.PI/5, 0); book.setIcon('book'); book.s({ 'front.image': 'book', 'back.color': 'white', 'left.color': 'white', 'all.color': 'gray' }); book.setHost(shelf); book.setParent(shelf); dm.add(book);

接著左邊的書架也是類似的構建方法,有一點不同的是,這邊有一個 ht.CSGBox 類型,繼承於 ht.CSGNode,其除具備父類 CSGNode 的挖空等功能外,還可對六個面進行旋轉展開關閉的操作,這裡我們的節點只設置了前面的能夠旋轉展開,並且設置了一系列的樣式:

clipNode = new ht.CSGBox(); clipNode.setName('CSGBox-Expand-Left'); clipNode.s3(100, 100, 120); clipNode.p3(0, 65, 0.1); clipNode.setHost(shelf); clipNode.showMe = true; clipNode.s({ 'all.visible': false,//6面均不可見 'front.visible': true,//前面可見 'front.toggleable': true,//允許前面雙擊展開 'front.reverse.flip': true,//前面的反面顯示正面的內容 'front.transparent': true,//前面透明 'front.end': Math.PI * 0.7,//前面展開狀態的結束旋轉弧度 'front.color': 'rgba(0, 50, 50, 0.7)'//前面顏色 });

可能你們還想知道下面的地球是怎麼做到的?還記得之前的文章寫到過 HT 中設置了 shape3d 屬性,設置這個屬性實際上就是在操作 setShape3dModel(name, model) 和 getShape3dModel(name),可以通過這個屬性設置為 box|sphere|cylinder|cone|torus|star|rect|roundRect|triangle|rightTriangle|parallelogram|trapezoid 等等模型,這些模型也都是 HT 封裝好的,要使用時直接設置 shape3d 為其中的一個值即可,如這個例子中用到 「shape3d: sphere」 就是設置為球體。我們簡單地用一張地圖圖片包裹在這個球體的外側,當然,這張地圖圖片是先通過 ht.Default.setImage 註冊過的,然後通過 shape3d.image 將圖片附到這個節點上:

earth = new ht.Node(); earth.setName('earth'); earth.s3(70, 70, 70); earth.p3(0, 50, 0); earth.s({ 'shape3d': 'sphere', 'shape3d.image': 'earth' }); earth.setHost(shelf); earth.setParent(shelf); dm.add(earth);

右邊的書架,同樣也是有一個主節點,其他節點依附於它,但是我們看到這邊換了一個新的節點類型 ht.DoorWindow,ht.DoorWindow繼承於 ht.CSGNode,其除具備父類 CSGNode 的挖空等功能外,還可進行整體的旋轉展開關閉的操作, 常用於作為門或窗的業務對象,吸附於 CSGNode 或 CSGShape 的 host 作為牆面的圖元。這個節點類型就是 ht.CSGNode 的延展,相對來說就是區分了實際應用而添加了不同的 style 參數,更多的屬性請到 HT for Web 建模手冊 DoorWindow 章節 查看然後添加到節點中玩玩:

photos = new ht.DoorWindow(); photos.setName('DoorWindow-Photos'); photos.setIcon('ben12'); photos.s3(110, 100, 130); photos.p3(5, 180, 0); photos.setHost(shelf); photos.showMe = true; photos.s({ 'bottom.uv': [1,1, 1,0, 0,0, 0,1], 'bottom.uv.scale': [1, 1], 'left.uv.scale': [3, 3], 'top.uv.scale': [2, 2], 'dw.s3': [0.8, 0.9, 0.05], 'dw.t3': [0, -5, 0], 'dw.axis': 'v', 'dw.toggleable': false, 'front.image': 'ben1', 'back.image': 'ben2', 'all.color': '#F8CE8B' }); photos.setParent(shelf); dm.add(photos);

最後,我們將左側的地球 earth 和右側的照片 photo 旋轉起來:

var angle = 0; setInterval(function(){ angle += Math.PI/40; earth.r3(0, angle, 0); photos.s('dw.angle', angle); }, 50);

我們看到,其實雖然 HT 封裝了很多不同的 CSG 節點類型,但是實際應用都差不多,而且內容也沒有差特別多,差別都是在 style 參數上,但是真的在實際開發中,這種區分就會很大程度上加快開發速度,畢竟名稱一目了然,就知道要運用哪些 style 屬性了。

相關焦點

  • 基於HTML5的WebGL經典3D虛擬機房漫遊動畫
    http://www.hightopo.com/demo/room-walkthrough/index.html= new ht.graph3d.Graph3dView(dm); //.......構建好場景 dm.serialize();//可以填入number參數,作為空格縮進值既然我們已經搭建好環境,轉成了 json 文件,代碼中不好控制,這種情況下我們會將 DataModel 數據模型再反序列化,這個函數的功能就是將 json 格式轉成對象,並將反序列化的對象傳入到 DataModel
  • 3d模型 / 國內外好用的模型下載網站介紹
    隨著3D技術的發展,建模技術的飛速進步,3d技術的跨界以及創新永無窮盡。近幾年3d模型在網上鋪天蓋地,3d模型正在以我們所不能想像的速度在快速更替。常見的國內外3d模型庫海量,對於設計師來說,如此多的模型網站,但是真正想找模型的時候,有的下載價格很貴,有的質量很差,花一分鐘細細想一想,究竟哪家網站的3d模型網站哪呢?在此我整理了一下2020年比較好用的3D模型網站,希望為廣大設計師們提供更多尋找模型的便利。
  • 3D印表機教程 如何使用magics軟體修改STL格式文件
    我們從網絡上下載的3D列印模型一般也都是stl的,通過3D列印切片軟體處理後,即可輸出到3D列印進行列印。視頻教程連結:https://v.qq.com/x/page/r0793kr9uq8.html       小錦囊:      1、使用軟體:magics      2、在製作的過程中,主要使用的命令:標記面、分離被標記三角面片、標記殼體、合併零件、補洞模式、標籤。
  • 手辦太貴 如何用3D印表機列印原創手辦
    今天就教大家如何利用3D印表機玩轉手辦。  一、3D列印手辦有哪些優勢呢?可以自設計原型,列印獨一無二的遊戲、動漫等模型。  2.高效省時。現在的手辦很多都是國外批量定製的,有些限量版還要3D列印可以快速製作手辦,快速高效,而且3D列印手辦精度高、質感好。  3.成本低。
  • 3d模型製作軟體有哪些?6款常用的3d模型製作軟體推薦
    提到3d模型製作軟體,最出名的就是:3dmax這一款軟體了,不過,除了3dmax,還有許多3d模型製作軟體也非常不錯。那麼,3d模型製作軟體有哪些?下面,小編就給大家整理了6款常用的3d模型製作軟體推薦給大家!
  • 「模型雲」10款3d模型適用的淺啡色網格大理石貼圖素材推薦
    很多室內設計3d模型之中會使用淺啡網大理石貼圖來作為地磚效果,不同的大理石貼圖能夠在室內裝點出不一樣的精彩。本期,模型云為您整理精選了10款3d模型適用的淺啡色網格大理石貼圖素材推薦,快來和我們一起看看吧!
  • 國外3D列印免費模型下載網站
    在這裡,您將發現一系列提供免費SLA3D印表機模型的3D列印站點、模型模型、市場和站點。每一個都允許您瀏覽大量3D列印設計,以便在家中列印。其中一些網站還包括銷售3D列印設計的商店。該網站由mlicbotIndustry管理,mlicbotIndustry是3d印表機複製器家族的創始人。該網站已經建立和成熟,擁有一個龐大的專業製造社區,提供免費的stl文件,並可以下載不同的類別和複雜性。登錄後,您可以在您的個人收藏中共享標記的3D印表機型號。CGTrader是一個買賣3D設計的市場。
  • 創想三維3D印表機|3D教程製作雙色模型
    上次和大家分享了3D印表機如何使用Magics軟體中的切割方法來製作雙色模型,但是切割僅僅只能對一些簡單的模型進行雙色處理,而且局限性比較大,不能隨便分割某一個部位,而今天,我就來教大家一個更好的方法來製作雙色模型。
  • 創想三維:3D印表機如何製作四軸無人機教程
    首先,列舉一下我們使用到的工具:      1.切片使用Creality Slicer軟體,可在官網(www.cxsw3d.com)下載。      2.創想三維3D印表機(本次我們使用的是CR-X機型)      3.用到的螺絲有:M2*12杯頭螺絲,M3*10內六角圓頭。
  • 3D印表機教程:專屬定製月球燈底座設計(附視頻)
    小錦囊:  Magics軟體下載:  https://www.cxsw3d.com/qiepianruanjian.html  月球燈底座的模型下載:  https://www.cxsw3d.com/yishupin/39-327.html  實在不懂的歡迎在官網上留言聯繫小編哦!
  • 哀喜交並的出處、釋義、典故、近反義詞及例句用法 - 成語知識
    哀喜交並,交:交錯。悲痛和喜悅交織。出自:晉 陳壽《三國志 吳志 諸葛恪傳》:「皇太子以丁酋踐尊號,哀喜交並,不知所措。」近義詞有:悲喜交集,反義詞有:麻木不仁,哀喜交並是中性成語,可作謂語、定語;形容又高興又難過。
  • 3D列印一個模型多少錢?
    ,而由於體積件佔的體積較大,列印的時候沒辦法放入其他模型一起列印,在相同的列印時間,列印的模型少了,列印成本就高了。 簡單的模型,打磨方便,而模型結構比較複雜的,打磨起來比較困難,需要花費較多時間,增加人工成本。線上報價無法針對模型的結構計算人工成本。所以像下圖這樣的模型,打磨起來不容易,因此,當模型較複雜的時候,報價會結合線下人工報價。
  • 3D列印什麼最賺錢——創想三維
    先說3D模型通過平臺自主上傳提供用戶付費下載3D模型賺取佣金,這裡分享一個優質3D模型庫——創想雲,還有一種3D模型定製,定製就是決定了每個人的模型都是獨一無二的,和客戶直接溝通解決需求。是想給個人客戶列印興趣類產品,手辦之類的,還是給汽車,醫療,製造業做生產模型或是零件,不同類型的客戶需要不同規格的印表機和列印材料。在中國,越來越多的企業開始用3d列印來製作不需要大批量生產的產品,因為這樣比傳統製造過程要便宜。如果你能在國內鎖定一些這樣的企業客戶,會是一個不錯的賺錢點。
  • TOP前五:3d列印動漫模型製作公司
    3d列印動漫模型製作公司  163 kB  RCA-SRA4R-I-20-5-20.zip  150 kB  RCA-SRA4R-I-20-5-200.zip  169 kB  RCA-SRA4R-I-20-5-30.zip  150 kB  RCA-SRA4R-I-20-5-40.zip  150 kB  RCA-SRA4R-I-20-5-50.zip
  • 講述3D印表機怎麼用 初學者必看「創想三維3D印表機」
    想要玩轉3D列印,最重要也是必不可少的環節就是建模!3D印表機一般都會自帶切片軟體,在主菜單頁面,通常會有「添加模型」選項,點擊之後,我們創建或下載的模型就自動出現在我們的三維列印空間中了。
  • 3dmax精品模型素材!再也不用擔心沒好模型用了
    仔細觀察就會發現,大佬們的效果圖、模型、材質、燈光等素材都很精美,那麼我們怎麼樣才能擁有精美的素材呢?小編來教你兩招!1、選取素材3dmax精品模型素材積累是一個比較漫長的過程,當我們平時瀏覽到一些精美的3d模型、效果圖的時候,我們可以將這些精品效果圖的模型下載下來,以後自己用,慢慢積累,我們就會有很多3d模型素材。
  • 創想三維:有了3D印表機後,可以做哪些事賺錢
    手板加工製作      3d印表機最開始普及運用的行業是手板行業模型製作的區域很廣,涉及建築沙盤模型、航空模型、汽車模型、玩具模型、畢業設計模型、雕塑模型等。擁有3D列印技術,模型公司擁有非常大的實現空間,過去沒法接的訂單現如今也變得可能。終端用戶列印的東西千奇百怪,酒瓶、水壺、樓盤模型、汽車模型等等。
  • 盤點3D Max大神必去的15個國外模型網站「渲雲渲染」
    常見的國內外模型庫非常海量,對於設計師來說,面對如此多的模型網站,選擇海量、高質量的網站是非常重要的。今天就給你們分享15個免費下載3D模型的網站,趕緊收藏~1、Free 3D MoDels擁有超過92萬種3D模型,其中很大部分是免費的。
  • Egret 3D 1.4 正式發布:新增17個新特性,3D編輯器公開測試
    堅守在最後一刻的小夥伴們可能在2月2日產品正式發布時已獲知此消息,但經過「年味」的薰陶,不知您對Egret 3D1.4 還有多少印象,而第一時間去追尋「家味」的小夥伴今天則可以靜下心來細細了解Egret 3D 1.4。
  • 設計師神器之1-可打開任何3D格式的模型查看器Glovius
    作為一個機械設計經常會打開各種設計軟體的模型或圖紙,Solidworks、proE、NX、CATIA等等,每個軟體都裝都會用也不現實,這時候你就需要一個基本上可以打開任何3D格式的軟體,告訴你,還真有!