基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景

小編給大家分享一下基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)建站是一家專(zhuān)業(yè)提供濱州企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為濱州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

HT for Web 提供了多種基礎(chǔ)類(lèi)型供用戶(hù)建模使用,不同于傳統(tǒng)的 3D 建模方式,HT 的建模核心都是基于 API 的接口方式,通過(guò) HT 預(yù)定義的圖元類(lèi)型和參數(shù)接口,進(jìn)行設(shè)置達(dá)到三維模型的構(gòu)建。接下來(lái)我們就來(lái)談?wù)勵(lì)A(yù)定義的 3D 模型及參數(shù)設(shè)置。

HT 預(yù)定義的 3D 模型有:box、sphere、cone、torus、cylinder、star、rect、roundRect、triangle、tightTriangle、parallelogram 和 trapezoid 這十二種,那么這十二種類(lèi)型又是怎么設(shè)置的呢?

在網(wǎng)絡(luò)拓?fù)鋱D GraphView 的 2D 圖形上,呈現(xiàn)各種圖形是通過(guò) style 中的 shape 屬性決定的,HT 在 3D 上提供了 shape3d 屬性預(yù)定義多種 3D 形體。shape3d 屬性的默認(rèn)值為 undefined,圖元顯示為六面立方圖形,當(dāng) shape3d 指定值時(shí),則顯示為 shape3d 指定的形體,接下來(lái)我們來(lái)一一介紹 3D 模型的各個(gè)形體。

1. box:立方體,不同于默認(rèn)的六面體,立方體類(lèi)型的六個(gè)面顏色和貼圖只能相同,繪制性能比默認(rèn)六面體高;

基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景

就如上圖所示,左邊是 shape3d 設(shè)置為 box,右邊是默認(rèn)的六面體,兩個(gè)節(jié)點(diǎn)都對(duì)上表面設(shè)置了貼圖,但是從效果上看 shape3d 設(shè)置為 box 的節(jié)點(diǎn)直接無(wú)視了上表面的貼圖設(shè)置,這也應(yīng)證了上面描述的,box 類(lèi)型六個(gè)面的顏色和貼圖只能相同,只對(duì) shape3d.image 和 shape3d.color 起效,下面是具體的設(shè)置代碼:

node = new ht.Node();
node.s3(80, 80, 80);
node.s({    
'shape3d': 'box',    
'shape3d.image': 'img11',    
'shape3d.top.image': 'img10'});
dm.add(node);

node = new ht.Node();
node.s3(80, 80, 80);
node.p3(100, 0, 0);
node.s({    
'all.image': 'img11',    
'top.image': 'img10'});
dm.add(node);

2. sphere:球體,可通過(guò) shape3d.side 分成多片,結(jié)合 shape3d.side.from 和 shape3d.side.to 可形成半球體等

基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景

就如上圖所示,球被裁切掉了一部分,被裁切的兩個(gè)面可以單獨(dú)控制,通過(guò) shape3d.from.* 和 shape3d.to.* 兩組參數(shù)就可以單獨(dú)控制兩面的顯示效果,在上圖中,我通過(guò) shape3d.to.visible 將 to 的面隱藏了,將 from 面通過(guò) shape3d.from.image 設(shè)置了新的貼圖,具體代碼如下:

node.s({    
'shape3d': 'sphere',    
'shape3d.image': 'img11',    
'shape3d.side': 100,    
'shape3d.side.from': 0,    
'shape3d.side.to': 65,    
'shape3d.from.image': 'img10',    
'shape3d.to.visible': false});

3. cone:錐體,可通過(guò) shape3d.side 形成三角錐、四角錐等形狀

基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景

從上圖可以看到,side 值越大,椎體就越圓滑,完全可以比擬圓錐。具體如何設(shè)置的,我們來(lái)看看代碼:

[3, 4, 5, 6, 10, 20, 40, 80, 100].forEach(function(side, index) {    
var x = ((index / 3) >> 0) * 100 - 100,
        y = index % 3 * 100 - 100;
    node = new ht.Node();
    node.p3(x, 40, y);
    node.s3(80, 80, 80);
    node.s({        
    'shape3d': 'cone',        
    'shape3d.image': 'img11',        
    'shape3d.side': side,        
    'note': 'side: ' + side,        
    'note.autorotate': true,        
    'note.position': 17,        
    'note.face': 'top',        
    'note.background': '#979EAF'
    });
    dm.add(node);
});

當(dāng)然,椎體也可以和球體一樣,可以設(shè)置 shape3d.side.from 和 shape3d.side.to 參數(shù)來(lái)控制裁切;還可以通過(guò) shape3d.from.* 和 shape3d.to.* 參數(shù)來(lái)控制兩個(gè)面的表現(xiàn)效果;還可以通過(guò) shape3d.bottom.* 樣式來(lái)控制椎體地面的表現(xiàn)效果。

在上面的代碼中,可以看到 note 相關(guān)的設(shè)置,在這邊也順帶介紹下,note.autorotate 樣式是用來(lái)控制 note 的朝向,如果設(shè)置為 true,那么這個(gè) note 永遠(yuǎn)是朝向眼睛的方向,不管場(chǎng)景如何旋轉(zhuǎn)。

4. torus:圓環(huán),可通過(guò) shape3d.side 分成多片,結(jié)合 shape3d.side.from 和 shape3d.side.to 可形成半圓環(huán)等

基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景

在上圖中可以看出,圓環(huán)其實(shí)和圓錐是一樣的,也是可以設(shè)置邊數(shù),構(gòu)成三角環(huán),四角環(huán)等形狀,當(dāng)邊數(shù)達(dá)到一定的程度,邊數(shù)越多,圓環(huán)就越平滑。

在上圖中可以看到 note 中多加了一個(gè) radius 值的打印,這個(gè)值對(duì)應(yīng)的是樣式中的 shape3d.torus.radius,那么這個(gè)值的作用是什么呢,我想從上圖也可以看得出來(lái),radius 值是用來(lái)控制圓環(huán)的半徑,但是為什么 radius 為 0.25 的時(shí)候圓環(huán)中間就被填上了,沒(méi)有像其他的圓環(huán)中間都漏空呢?我們可以這樣理解,一個(gè)圓環(huán)的切面有兩個(gè)圓環(huán)直徑,那就有四個(gè)圓環(huán)半徑,那按百分比去計(jì)算的話,一個(gè)半徑就是占整個(gè)圖元寬的 1/4,也就是 0.25,所以這個(gè) shape3d.torus.radius 樣式的取值范圍為 0~0.25。

[3, 4, 5, 6, 10, 20, 40, 80, 100].forEach(function(side, index) {    
var x = ((index / 3) >> 0) * 100 - 100,
        y = index % 3 * 100 - 100;
    radius = (Math.random() * 0.25).toFixed(2);
    node = new ht.Node();
    node.p3(x, 40, y);
    node.s3(80, 80, 80);
    node.s({        
    'shape3d': 'torus',        
    'shape3d.image': 'img11',        
    'shape3d.side': side,        
    'shape3d.torus.radius': radius,        
    'note': 'side: ' + side + ', radius: ' + radius,        
    'note.autorotate': true,        
    'note.position': 17,        
    'note.face': 'top',        
    'note.background': '#979EAF'
    });
    dm.add(node);
});

5. cylinder:圓柱,可通過(guò) shape3d.top.* 和 shape3d.bottom.* 可控制頂面和底面的參數(shù)

基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景

圓柱的參數(shù)除了 shape3d.top.* 之外,其他的都和前面提到的圓錐的參數(shù)一樣,因?yàn)閳A柱體其實(shí)就是比圓錐體多了一個(gè)面。

[3, 4, 5, 6, 10, 20, 40, 80, 100].forEach(function(side, index) {    
var x = ((index / 3) >> 0) * 100 - 100,
        y = index % 3 * 100 - 100;
    node = new ht.Node();
    node.p3(x, 40, y);
    node.s3(80, 80, 80);
    node.s({        
    'shape3d': 'cylinder',        
    'shape3d.image': 'img11',        
    'shape3d.side': side,        
    'note': 'side: ' + side,        
    'note.autorotate': true,        
    'note.position': 17,        
    'note.face': 'top',        
    'note.background': '#979EAF'
    });
    dm.add(node);
});

到這里所有的可裁切的基本模型都介紹完了,下面要介紹的幾個(gè)基本模型就沒(méi)有 side 的相關(guān)屬性了,也就意味著,它們將沒(méi)有 from 和 to 的相關(guān)參數(shù),沒(méi)有裁切的功能。

如果想讓不能裁切的基本圖元達(dá)到裁切的效果,還是有其他方案和方法的,這些,我們就在后續(xù)的章節(jié)中介紹,還望耐心等待。

6. star:星形體,可通過(guò) shape3d.top.* 和 shape3d.bottom.* 可控制頂面和底面的參數(shù)

7. rect:矩形體,可通過(guò) shape3d.top.* 和 shape3d.bottom.* 可控制頂面和底面的參數(shù)

8. roundRect:圓矩形體,可通過(guò) shape3d.top.* 和 shape3d.bottom.* 可控制頂面和底面的參數(shù)

9. triangle:三角形體,可通過(guò) shape3d.top.* 和 shape3d.bottom.* 可控制頂面和底面的參數(shù)

10. rightTriangle:直角三角形體,可通過(guò) shape3d.top.* 和 shape3d.bottom.* 可控制頂面和底面的參數(shù)

11. parallelogram:平行四邊形體,可通過(guò) shape3d.top.* 和 shape3d.bottom.* 可控制頂面和底面的參數(shù)

12. trapezoid:梯形體,可通過(guò) shape3d.top.* 和 shape3d.bottom.* 可控制頂面和底面的參數(shù)

基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景

上圖就是幾個(gè)還未介紹的基本模型。

[    'star', 'rect', 'roundRect', 'triangle',    
'rightTriangle', 'parallelogram', 'trapezoid'].forEach(function(shape, index) {    
var x = index * 100 - 300;
    node = new ht.Node();
    node.p3(x, 40, 0);
    node.s3(80, 80, 80);
    node.s({        
    'shape3d': shape,        
    'shape3d.image': 'img11'
    });
    dm.add(node);
});?

仔細(xì)觀察上圖,你會(huì)發(fā)現(xiàn),從左算起,第二個(gè)和第四個(gè)好像在前面的例子中有見(jiàn)過(guò)。沒(méi)錯(cuò),在形狀上是一樣的,但是在表現(xiàn)上卻是有些差異,到底存在什么差異呢,我們通過(guò)圖來(lái)瞧瞧。

基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景

左邊是基本模型 rect 和 triangle,右邊是通過(guò)基本模型 cylinder 模擬出來(lái)的 rect 和 triangle,四個(gè)圖元設(shè)置的大小都是一樣的,邊長(zhǎng)都是 80,可以發(fā)現(xiàn)基本模型 rect 和 triangle 在表現(xiàn)上會(huì)比通過(guò) cylinder 模擬出來(lái)的 rect 和 triangle 來(lái)的大些,原因很簡(jiǎn)單,通過(guò) cylinder  模擬出來(lái)的 rect 和 triangle 因?yàn)槠浔举|(zhì)還是圓柱體,side 參數(shù)是是讓圖形能夠更接近圓形而已,所以繪制出來(lái)的圖形將會(huì)是在一個(gè)圓柱體內(nèi),也就是 rect 基本模型上表面的內(nèi)切圓范圍內(nèi),也就是說(shuō)通過(guò) cylinder 模擬出來(lái)的 rect 上表面的對(duì)角線才是圖元的變成 80。

以下是相關(guān)代碼,大家可以嘗試下,通過(guò)不同角度的觀察,可能會(huì)更好理解一些。

node = new ht.Node();
node.s3(80, 80, 80);
node.p3(-50, 40, 50);
node.s({    
'shape3d': 
'cylinder',    
'shape3d.side': 4,    
'shape3d.image': 'img11'});
dm.add(node);

node = new ht.Node();
node.s3(80, 80, 80);
node.p3(50, 40, 50);
node.s({    
'shape3d': 
'cylinder',    
'shape3d.side': 3,    
'shape3d.image': 'img11'});
dm.add(node);

node = new ht.Node();
node.s3(80, 80, 80);
node.p3(-50, 40, -50);
node.s({    
'shape3d': 'rect',    
'shape3d.image': 'img11'});
dm.add(node);

node = new ht.Node();
node.s3(80, 80, 80);
node.p3(50, 40, -50);
node.s({    
'shape3d': 'triangle',    
'shape3d.image': 'img11'});
dm.add(node);

以上是“基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁(yè)名稱(chēng):基于HTML5的WebGL技術(shù)如何構(gòu)建3D場(chǎng)景
文章路徑:http://bm7419.com/article20/jdsjco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、商城網(wǎng)站、面包屑導(dǎo)航Google、App開(kāi)發(fā)、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站