- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) >
- HTML5中Canvas如何實(shí)現3D動(dòng)態(tài)Chart圖表
小編給大家分享一下HTML5中Canvas如何實(shí)現3D動(dòng)態(tài)Chart圖表,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
動(dòng)態(tài)效果圖如下:
這個(gè)例子用 HT 實(shí)現真的很容易,首先創(chuàng )建一個(gè) HT 中最基礎的 dm 數據模型,然后將數據模型添加進(jìn) g3d 3d 組件中,再設置 3d 中的視角并把 3d 組件添加進(jìn) body 元素中:
dm = new ht.DataModel(); g3d = new ht.graph4d.Graph4dView(dm); g3d.setEye(0, 185, 300); g3d.addToDOM(); g3d.getView().style.background = '#000';
接著(zhù)就是造這五個(gè)chart圖表條了,我的思路是這樣的,里層有一個(gè)節點(diǎn),外層一個(gè)透明的節點(diǎn),底部一個(gè) 3d 的文字顯示當前的百分比。
里層的節點(diǎn)非常容易,我直接用的 HT 封裝的 ht.Node 創(chuàng )建了一個(gè)新的節點(diǎn)對象,然后通過(guò) node.s 方法來(lái)設置 node 節點(diǎn)的樣式:
var node = new ht.Node(); node.s({ 'shape3d': cylinderModel, 'shape3d.color': color, '3d.movable': false }); node.a({ 'myHeight': s3[1], }); node.p3([p3[0], s3[1]/2, p3[2]]); node.s3(s3); dm.add(node);
其中要說(shuō)明的是,'shape3d':cylinderModel 這個(gè)樣式的設置,首先,shape3d 屬性指定顯示為 3d 模型的圖標效果,cylinderModel 是用 HT 自定義的一個(gè) 3d 模型,可參考 HT for Web 建模手冊:
cylinderModel = ht.Default.createCylinderModel(1000, 0, 1000, false, false, true, true);
然后設置了一個(gè)動(dòng)態(tài)變化的屬性 myHeight,在 HT 中,node.a 方法是預留給用戶(hù)存儲業(yè)務(wù)數據的,我們可以在這邊添加任意多個(gè)屬性。
接下來(lái)我們要創(chuàng )建的是外部的透明節點(diǎn),這個(gè)節點(diǎn)的構造方式基本上與內部節點(diǎn)相同,就是多了一點(diǎn)“透明”的樣式設置:
var cNode = new ht.Node(); cNode.s({ 'shape3d': cylinderModel, 'shape3d.transparent': true, 'shape3d.opacity': 0.2, 'label.color': '#fff', '3d.movable': false }); cNode.p3([p3[0], 50, p3[2]]); cNode.s3(20, 100, 20); dm.add(cNode);
要先設置 ‘shape3d.transparent’ 為true,再設置 ‘shape3d.opacity’ 透明度。
最后是 3d 文字,呈現 3d 文字需要一個(gè) json 格式的 typeface 字體,然后通過(guò) ht.Default.loadFontFace 來(lái)加載 json 格式的字體到內存中,詳情請參考 HT for Web 3D 手冊:
ht.Default.loadFontFace('./wenquanyi.json', function(){ //...... var text = new ht.Node(); text.s3([5, 5, 5]); text.p3(cNode.p3()[0]-5, -10, 0); dm.add(text); text.s({ 'shape3d' : 'text', 'shape3d.text': node.a('myHeight')+'%', 'shape3d.text.curveSegments': 1, '3d.movable': false }); });
因為我們用的 typeface 字體的繪制方式是無(wú)數個(gè)三角形構成的一個(gè)字,會(huì )占用很大的內存,所以我把圖形的曲線(xiàn)的精細度調得較低,但是還是很清晰,如果你們能找到性能更好的字體,可以使用并且告知我一下,我們目前沒(méi)找到占用內存小的字體。
最后,要動(dòng)態(tài)的變化 chart 圖表中的柱形圖,我們得設置動(dòng)畫(huà),并且將 3d 字體也同步更新數值:
setInterval(function(){ if(node.a('myHeight') < 100){ node.a('myHeight', (node.getAttr('myHeight')+1)); node.s3(20, node.a('myHeight'), 20); node.p3(p3[0], node.a('myHeight')/2, p3[2]); }else{ node.a('myHeight', 0); node.s3([20, 0, 20]); node.p3([p3[0], 0, p3[2]]); } if (text) text.s('shape3d.text', node.a('myHeight')+'%'); }, 100);
這里,我自定義的屬性 “myHeight” 就起到了決定性的作用,我用這個(gè)屬性來(lái)存儲變量,而且可以任意更改變量的值,這樣就能實(shí)現動(dòng)態(tài)綁定的效果了。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2 建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站