發現如今工業SCADA上或者電信網管方面用圖表的特別多,雖然絕大部分人在圖表製做方面用的是echarts,他確實好用,可是有些時候咱們不能調用別的插件,這個時候就得本身寫這些美麗的圖表了,然而圖表輕易作不成美麗的。。。看到有一個網站上在賣的圖表,感受挺好看的,就用 HT for Web 3D 作了一個小例子,挺簡單的,也挺好看的,哈哈~html
Demo 地址: http://www.hightopo.com/demo/3DBar/index.html
node
動態效果圖以下:json
這個例子用 HT 實現真的很容易,首先建立一個 HT 中最基礎的 dm 數據模型,而後將數據模型添加進 g3d 3d 組件中,再設置 3d 中的視角並把 3d 組件添加進 body 元素中:echarts
1 dm = new ht.DataModel(); 2 g3d = new ht.graph3d.Graph3dView(dm); 3 g3d.setEye(0, 185, 300); 4 g3d.addToDOM(); 5 g3d.getView().style.background = '#000';
接着就是造這五個chart圖表條了,個人思路是這樣的,裏層有一個節點,外層一個透明的節點,底部一個 3d 的文字顯示當前的百分比。ide
裏層的節點很是容易,我直接用的 HT 封裝的 ht.Node 建立了一個新的節點對象,而後經過 node.s 方法來設置 node 節點的樣式:性能
1 var node = new ht.Node(); 2 node.s({ 3 'shape3d': cylinderModel, 4 'shape3d.color': color, 5 '3d.movable': false 6 }); 7 node.a({ 8 'myHeight': s3[1], 9 }); 10 node.p3([p3[0], s3[1]/2, p3[2]]); 11 node.s3(s3); 12 dm.add(node);
其中要說明的是,'shape3d':cylinderModel 這個樣式的設置,首先,shape3d 屬性指定顯示爲 3d 模型的圖標效果,cylinderModel 是用 HT 自定義的一個 3d 模型,可參考 HT for Web 建模手冊:字體
1 cylinderModel = ht.Default.createCylinderModel(1000, 0, 1000, false, false, true, true);
而後設置了一個動態變化的屬性 myHeight,在 HT 中,node.a 方法是預留給用戶存儲業務數據的,咱們能夠在這邊添加任意多個屬性。動畫
接下來咱們要建立的是外部的透明節點,這個節點的構造方式基本上與內部節點相同,就是多了一點「透明」的樣式設置:網站
1 var cNode = new ht.Node(); 2 cNode.s({ 3 'shape3d': cylinderModel, 4 'shape3d.transparent': true, 5 'shape3d.opacity': 0.2, 6 'label.color': '#fff', 7 '3d.movable': false 8 }); 9 cNode.p3([p3[0], 50, p3[2]]); 10 cNode.s3(20, 100, 20); 11 dm.add(cNode);
要先設置 ‘shape3d.transparent’ 爲true,再設置 ‘shape3d.opacity’ 透明度。ui
最後是 3d 文字,呈現 3d 文字須要一個 json 格式的 typeface 字體,而後經過 ht.Default.loadFontFace 來加載 json 格式的字體到內存中,詳情請參考 HT for Web 3D 手冊:
1 ht.Default.loadFontFace('./wenquanyi.json', function(){ 2 //...... 3 var text = new ht.Node(); 4 text.s3([5, 5, 5]); 5 text.p3(cNode.p3()[0]-5, -10, 0); 6 dm.add(text); 7 text.s({ 8 'shape3d' : 'text', 9 'shape3d.text': node.a('myHeight')+'%', 10 'shape3d.text.curveSegments': 1, 11 '3d.movable': false 12 }); 13 });
由於咱們用的 typeface 字體的繪製方式是無數個三角形構成的一個字,會佔用很大的內存,因此我把圖形的曲線的精細度調得較低,可是仍是很清晰,若是大家能找到性能更好的字體,可使用而且告知我一下,咱們目前沒找到佔用內存小的字體。
最後,要動態的變化 chart 圖表中的柱形圖,咱們得設置動畫,而且將 3d 字體也同步更新數值:
1 setInterval(function(){ 2 if(node.a('myHeight') < 100){ 3 node.a('myHeight', (node.getAttr('myHeight')+1)); 4 node.s3(20, node.a('myHeight'), 20); 5 node.p3(p3[0], node.a('myHeight')/2, p3[2]); 6 }else{ 7 node.a('myHeight', 0); 8 node.s3([20, 0, 20]); 9 node.p3([p3[0], 0, p3[2]]); 10 } 11 if (text) text.s('shape3d.text', node.a('myHeight')+'%'); 12 }, 100);
這裏,我自定義的屬性 「myHeight」 就起到了決定性的做用,我用這個屬性來存儲變量,並且能夠任意更改變量的值,這樣就能實現動態綁定的效果了。
還有不懂的能夠留言,或者直接去咱們官網上查看手冊 HT for Web,有更多你想不到的效果能快速實現哦~