基於 HTML5 的 WebGL 技術構建 3D 場景(一)

今天和你們分享的是 3D 系列之 3D 預約義模型。html

HT for Web 提供了多種基礎類型供用戶建模使用,不一樣於傳統的 3D 建模方式,HT 的建模核心都是基於 API 的接口方式,經過 HT 預約義的圖元類型和參數接口,進行設置達到三維模型的構建。接下來咱們就來談談預約義的 3D 模型及參數設置。node

HT 預約義的 3D 模型有:box、sphere、cone、torus、cylinder、star、rect、roundRect、triangle、tightTriangle、parallelogram 和 trapezoid 這十二種,那麼這十二種類型又是怎麼設置的呢?網絡

網絡拓撲圖 GraphView 的 2D 圖形上,呈現各類圖形是經過 style 中的 shape 屬性決定的,HT 在 3D 上提供了 shape3d 屬性預約義多種 3D 形體。shape3d 屬性的默認值爲 undefined,圖元顯示爲六面立方圖形,當 shape3d 指定值時,則顯示爲 shape3d 指定的形體,接下來咱們來一一介紹 3D 模型的各個形體。dom

1.box:立方體,不一樣於默認的六面體,立方體類型的六個面顏色和貼圖只能相同,繪製性能比默認六面體高;ide

591709-20160713001606482-872828638.png

就如上圖所示,左邊是 shape3d 設置爲 box,右邊是默認的六面體,兩個節點都對上表面設置了貼圖,可是從效果上看 shape3d 設置爲 box 的節點直接無視了上表面的貼圖設置,這也應證了上面描述的,box 類型六個面的顏色和貼圖只能相同,只對 shape3d.image 和 shape3d.color 起效,下面是具體的設置代碼:性能

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:球體,可經過 shape3d.side 分紅多片,結合 shape3d.side.from 和 shape3d.side.to 可造成半球體等ui

591709-20160713001838998-508754611.png

就如上圖所示,球被裁切掉了一部分,被裁切的兩個面能夠單獨控制,經過 shape3d.from. 和 shape3d.to. 兩組參數就能夠單獨控制兩面的顯示效果,在上圖中,我經過 shape3d.to.visible 將 to 的面隱藏了,將 from 面經過 shape3d.from.image 設置了新的貼圖,具體代碼以下:spa

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:錐體,可經過 shape3d.side 造成三角錐、四角錐等形狀設計

591709-20160713001949248-1949341506.png

從上圖能夠看到,side 值越大,椎體就越圓滑,徹底能夠比擬圓錐。具體如何設置的,咱們來看看代碼:3d

[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);
});

固然,椎體也能夠和球體同樣,能夠設置 shape3d.side.from 和 shape3d.side.to 參數來控制裁切;還能夠經過 shape3d.from. 和 shape3d.to. 參數來控制兩個面的表現效果;還能夠經過 shape3d.bottom.* 樣式來控制椎體地面的表現效果。

在上面的代碼中,能夠看到 note 相關的設置,在這邊也順帶介紹下,note.autorotate 樣式是用來控制 note 的朝向,若是設置爲 true,那麼這個 note 永遠是朝向眼睛的方向,無論場景如何旋轉。

4.torus:圓環,可經過 shape3d.side 分紅多片,結合 shape3d.side.from 和 shape3d.side.to 可造成半圓環等

591709-20160713002059170-39567569.png

在上圖中能夠看出,圓環其實和圓錐是同樣的,也是能夠設置邊數,構成三角環,四角環等形狀,當邊數達到必定的程度,邊數越多,圓環就越平滑。

在上圖中能夠看到 note 中多加了一個 radius 值的打印,這個值對應的是樣式中的 shape3d.torus.radius,那麼這個值的做用是什麼呢,我想從上圖也能夠看得出來,radius 值是用來控制圓環的半徑,可是爲何 radius 爲 0.25 的時候圓環中間就被填上了,沒有像其餘的圓環中間都漏空呢?咱們能夠這樣理解,一個圓環的切面有兩個圓環直徑,那就有四個圓環半徑,那按百分比去計算的話,一個半徑就是佔整個圖元寬的 1/4,也就是 0.25,因此這個 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:圓柱,可經過 shape3d.top. 和 shape3d.bottom. 可控制頂面和底面的參數

591709-20160713002208389-1581030707.png

圓柱的參數除了 shape3d.top.* 以外,其餘的都和前面提到的圓錐的參數同樣,由於圓柱體其實就是比圓錐體多了一個面。

[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);
});

到這裏全部的可裁切的基本模型都介紹完了,下面要介紹的幾個基本模型就沒有 side 的相關屬性了,也就意味着,它們將沒有 from 和 to 的相關參數,沒有裁切的功能。

若是想讓不能裁切的基本圖元達到裁切的效果,仍是有其餘方案和方法的,這些,咱們就在後續的章節中介紹,還望耐心等待。

6.star:星形體,可經過 shape3d.top. 和 shape3d.bottom. 可控制頂面和底面的參數

7.rect:矩形體,可經過 shape3d.top. 和 shape3d.bottom. 可控制頂面和底面的參數

8.roundRect:圓矩形體,可經過 shape3d.top. 和 shape3d.bottom. 可控制頂面和底面的參數

9.triangle:三角形體,可經過 shape3d.top. 和 shape3d.bottom. 可控制頂面和底面的參數

10.rightTriangle:直角三角形體,可經過 shape3d.top. 和 shape3d.bottom. 可控制頂面和底面的參數

11.parallelogram:平行四邊形體,可經過 shape3d.top. 和 shape3d.bottom. 可控制頂面和底面的參數

12.trapezoid:梯形體,可經過 shape3d.top. 和 shape3d.bottom. 可控制頂面和底面的參數

591709-20160713002316686-104248124.png

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

[
    '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);
});

仔細觀察上圖,你會發現,從左算起,第二個和第四個好像在前面的例子中有見過。沒錯,在形狀上是同樣的,可是在表現上倒是有些差別,到底存在什麼差別呢,咱們經過圖來瞧瞧。

591709-20160713002357701-372651598.png

左邊是基本模型 rect 和 triangle,右邊是經過基本模型 cylinder 模擬出來的 rect 和 triangle,四個圖元設置的大小都是同樣的,邊長都是 80,能夠發現基本模型 rect 和 triangle 在表現上會比經過 cylinder 模擬出來的 rect 和 triangle 來的大些,緣由很簡單,經過 cylinder 模擬出來的 rect 和 triangle 由於其本質仍是圓柱體,side 參數是是讓圖形可以更接近圓形而已,因此繪製出來的圖形將會是在一個圓柱體內,也就是 rect 基本模型上表面的內切圓範圍內,也就是說經過 cylinder 模擬出來的 rect 上表面的對角線纔是圖元的變成 80。

如下是相關代碼,你們能夠嘗試下,經過不一樣角度的觀察,可能會更好理解一些。

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);

這樣,HT 的 3D 預約義模型就介紹完了,能夠結合 HT 的官方文檔(http://www.hightopo.com/guide/guide/core/3d/ht-3d-guide.html)一塊兒閱讀,可能更好理解些。那麼在下一章節,咱們將會重點介紹 3d Max 設計導出的模型在 HT 中應用。

相關文章
相關標籤/搜索