Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
前一直想過用CSS做一個3D足球,前幾天使用CSS畫地球之后,突然就來了靈感。使用相同的思路來完成3D足球,沒有看過請參考一下之前的文字《css-畫一個3D地球 》
先看效果:
需求分析:
足球是由12個五邊形和20個六邊形縫合而成。
首先,我們需要準備邊長相同的五邊形和六邊形。
css畫多邊形的方式很多,這里我考慮到后期偏移的時候需要確定多邊形重心的位置。
使用css的clip-path:polygon屬性來完成多邊形。首先我們畫出六邊形和五邊形的外切圓,來確定外層div的尺寸。
暫定多邊形邊長為100:則可以算出,六邊形外層div寬度為200;五邊形外層div為170。
并且計算出多邊形的每個頂點,在外切圓上的位置。(發揮你初中水平的時候到了)
.polygon {
border-radius: 50%;
}
.polygon::after {
position: relative;
content: '';
display: block;
width: 100%;
height: 100%;
}
.polygon6 {
width: 200px;
height: 200px;
background: rgba(255, 0, 0, .6);
}
.polygon6::after {
background: #FFF;
clip-path: polygon(0 50%, 25% 6.7%, 75% 6.7%, 100% 50%, 75% 93.3%, 25% 93.3%);
}
.polygon5 {
width: 170px;
height: 170px;
background: rgba(0, 255, 0, .6);
}
.polygon5::after {
background: #000;
clip-path: polygon(50% 0, 97.55% 34.55%, 79.39% 90.45%, 20.6% 90.45%, 2.45% 34.55%);
}
第二步:我們需要將按規律將五邊形和六邊形貼到球形的表面
首先,我們要先算出來球的半徑,在足球赤道上,其實是10個六邊形的五條邊和五條中線的連線。
我們大致推算出足球的赤道周長約為1500(沒有計算直線和弧形的誤差,此處我們不需要做到如此精細)
以此計算出,球的半徑約為235左右。
我們從足球的北極開始到足球的南極,依次排布:1個五邊形、5個六邊形、5個五邊形、5個六邊形、5個六邊形、5個五邊形、5個六邊形、1個五邊形。
/**
* deg 緯度
* len 圖形個數
* className 圖形是5邊形還是6邊形
* Y軸上偏移角度
* Z軸上旋轉角度
*/
function draw(deg, len, className, startDeg=0, rotateDeg=0) {
var fragment=document.createDocumentFragment()
for (var i=0; i < len; i++) {
var div=document.createElement('div')
div.className=className
div.style.transform='rotateY(' + ~~(360 / len * i + startDeg) + 'deg) rotateX(' + deg + 'deg) rotateZ(' + rotateDeg + 'deg) translateZ(238px)'
fragment.appendChild(div)
}
document.querySelector('.box').appendChild(fragment)
}
window.onload=function () {
draw(-90, 1, 'polygon5')
draw(-53, 5, 'polygon6', 36)
draw(-28, 5, 'polygon5', 0, 180)
draw(-11, 5, 'polygon6', 36)
draw(11, 5, 'polygon6')
draw(28, 5, 'polygon5', 36, 0)
draw(53, 5, 'polygon6', 72)
draw(90, 1, 'polygon5')
}
簡單加個動畫效果,一個3D的足球就完成了。
由于是平面拼接而成,所有效果無法像真實足球那樣特別的圓。
不過一個足球的原理基本解釋清楚了。后期我在考慮將五邊形和六邊形繼續拆分成更小的圖形來讓足球更加的圓潤。
代碼倉庫地址:
https://github.com/shb190802/html5
演示地址:
https://suohb.com/demo/win/globe3.html
前言
關于可視化大屏,好多人看到好多炫酷的大屏,視覺效果都非常棒,但是具體實現起來大家就充滿了疑惑,今天就來聊一聊可視化大屏的具體實現方法。歡迎大家溝通交流。
可視化大屏常見的實現方式
1. WEB
項目中最常用的實現方法,第三方的輕量化圖表控件比較多,最常見的 Echarts,來自 Enterprise Charts 的縮寫,商業級數據圖表,一個純 Javascript 的圖表庫,可以流暢地運行在 PC 和移動設備上,兼容當前絕大部分瀏覽器(IE6/7/8/9/10/11,chrome,firefox,Safari 等),底層依賴輕量級的 Canvas 類庫 ZRender,提供直觀、生動、可交互、可高度個性化定制的數據可視化圖表。
創新的拖拽重計算、數據視圖、值域漫游等特性大大增強了用戶體驗,賦予了用戶對數據進行挖掘、整合的能力。支持折線圖(區域圖)、柱狀圖(條狀圖)、散點圖(氣泡圖)、K 線圖、餅圖(環形圖)、雷達圖(填充雷達圖)、和弦圖、力導向布局圖、地圖、儀表盤、漏斗圖、事件河流圖等 12 類圖表,同時提供標題,詳情氣泡、圖例、值域、數據區域、時間軸、工具箱等 7 個可交互組件,支持多圖表、組件的聯動和混搭展現。
△ 圖片源自 https://threejs.org/截圖
threesjs(Three.js 是一款運行在瀏覽器中的 3D 引擎,你可以用它創建各種三維場景,包括了攝影機、光影、材質等各種對象。)threejs.org 網站上有好多 demo 案例,大家有時間可以研究下。
2. U3D
Unity 3D 的簡稱是由 Unity Technologies 開發的一個讓玩家輕松創建諸如三維視頻游戲、建筑可視化、實時三維動畫等類型互動內容的多平臺的綜合型游戲開發工具,是一個全面整合的專業游戲引擎。
Unity 類似于 Director,Blender game engine, Virtools 或 Torque Game Builder 等利用交互的圖型化開發環境為首要方式的軟件。其編輯器可運行在Windows、Linux(目前僅支持 Ubuntu 和 Centos 發行版)、Mac OS X 下,可發布游戲至 Windows、Mac、Wii、iPhone、WebGL(需要HTML5)、Windows phone 8 和 Android平臺。
也可以利用 Unity web player 插件發布網頁游戲,支持Mac和Windows的網頁瀏覽。它的網頁播放器也被Mac 所支持。
4. UE4
Unreal Engine4 的簡稱,是由游戲開發者制作并供游戲開發者使用的一整套游戲開發工具。UE4 不僅涉及主機游戲、PC 游戲、手游等游戲方面,還涉及高精度模擬,戰略演練,工況模擬,可視化與設計表現,無人機巡航等諸多領域。
前段時間發布了虛幻 5 的宣傳片刷爆朋友圈,近幾年 UE4 也在可視化中的運用也逐漸多了起來。
5. VENTUZ
Ventuz 專注于高端視聽內容的制作,包括交互展示和大型活動、視頻墻、廣播電視在線包裝及演播室舞臺及燈光控制等領域。Ventuz 十分穩定、功能強大、流程簡單,可以很容易地集成到復雜的硬件和軟件系統中。同樣 ventuz 也是可交互的,不過 ventuz 不支持 mac 系統,有點小遺憾,網上一些資源素材都是英文的,感覺學習成本挺高沒有深入研究,就大概講解下有這個工具。
項目用什么開發工具很大程度決定了設計方法方式,各種工具自有不同的優劣勢,像 web 輕量化圖表控件多,效果相比 u3d 會弱很多。u3d 對三維支持好,粒子等效果有優勢。U3D、UE4、ventuz 都是對于偏三維的效果有很好的支持,效果上都能做出比較驚艷的場景效果,了解這些工具的大致實現效果可為以后做設計產生事半功倍的效果。
地圖常見的實現方法
關于地圖一般分為 2d 地圖和 3d 地圖,不同的效果實現的方法也不同。
△ 圖片來源于「雷爾可視化」侵刪
1. 2D地圖
下面是普通 2d 地圖的截圖可以任意縮放下鉆,基于 json 技術實現的。一般都是去對接三方平臺,如百度地圖、高德地圖、騰訊地圖、谷歌地圖等。
△ 圖片來自百度開放平臺
2D 地圖效果上可以實現在地圖上進行點、線、面、區域、熱力等效果隨意配置。
圖片是百度地圖的開放平臺模板(百度地圖、高德地圖、騰訊地圖、谷歌地圖等都有自己的地圖開放平臺)。他里面有大量的配色樣式模板,可以隨意調整,大家有時間可以研究下。
2. 3D地圖
3d 地圖大致分為 3d 地球、3d 地圖、智慧城市、智慧工廠等各種 3d 建模的效果。
△ 圖片作品鏈接(https://www.zcool.com.cn/work/ZMzY4NjM2NDA=.html)
3d 地球的話一般是需要建模加貼圖實現的,可以在 c4d 中做球體然后貼圖,對接到開發的話只需要提供地圖貼圖就可以了。貼圖的話進行調色處理,有的會采用凹凸貼圖實現球體凹凸不平的效果。
關于地球的實現方法 Echarts 組件庫里有一些官方示例(如圖),可以在官方示例的基礎上進行調整,不過缺點就是粒子飛線的效果會打些折扣,上圖的地球案例是采用 U3D 工具開發實現的,在粒子飛線效果上都有很好的支持。
地圖是要打通數據的,顏色色塊根據數據量區分的,點擊會下鉆到具體的省份地區。需要前端調用外部地圖接口,要做到滿意的效果用 3D 自建地圖結合 H5 反復調試,最終實現。
上圖地圖立體效果圖是通過三方組件庫的實現的,缺點是前端可配置的項目少,好多效果都不支持?,F在好多公司都多多少少會有一些大屏的需求,但是公司前端不是專業做大屏的,他們大部分都會直接套用三方現有的組件庫去實現,在實現效果上會大打折扣。
△ 圖片作品鏈接(https://www.zcool.com.cn/work/ZMzY4NjM2NDA=.html)
智慧城市像這種城市的 3d 模型我們可以直接從 google、高德地圖購買,它們本質上是立體空間里的數據,開發可以通過這些數據將它實體化,設計師也可以導出開發提供的模型,在三維軟件中作為底層建筑模型,不需要單獨去建模。在現有模型基礎上再進行一些效果的處理,比如走光、光線上升、車流、飛線等。
具體實現也是采用 U3D 去實現的,前文也說了 U3d 對粒子飛線這些效果的支持性比較好。所以這種效果大多都會采用 U3D 去做(不是唯一 ue4、ventuz 同樣能實現這種效果)。
其實不管是 web 也好 u3d、Ue4、ventuz 也好都只是一種實現的工具,最重要的還是設計思路。以上實現方法作者也是了解一些皮毛,這里就大概了解下知道一些效果用什么工具可以實現出來就好,沒必要去深究死磕。我們的重點還是要回歸到做好設計,去更好的服務于業務。
拆解下一些對接開發的方法
很多剛接觸可視化的朋友最關心的問題就是自己效果出來了咋讓開發實現呢?很讓人頭疼。其實可視化大屏的對接實現跟普通網頁 ui 界面交付是一樣的道理,切圖+標注。
1. 標注
現在好多三方軟件可以自動生成標注(藍湖、像素大廚等)。需要注意的是,如果大屏頁面需要在不同比例的終端展示,這就牽扯適配問題了,那么此時的標注與開發可以使用 rem 作為基本單位來實現,這樣實現的大屏頁面在后期會有更好的擴展性與適應性,這塊三方工具都可以隨意轉換單位的,大家了解就好。
2. 切圖
對于切圖這塊需要注意的是要區分下界面功能,哪些是可以直接給參數代碼實現的、哪些效果是需要給切圖的。我一般會把它區分為有數據效果圖表 基于組件庫拓展、無數據 ae 做動效輸出 json。一般開發用代碼寫不出的樣式或動效,都需要設計師切圖作支持:比如數據容器的邊框、小的動效、頁面整體大背景、部分圖標等純視覺展示的。牽扯到數據界面的就需要開發區自己代碼實現了。
總之就是在實現過程中溝通很重要,隨時跟開發溝通進度及效果,做設計前也需要去考慮開發實現的,一些不確定能不能實現的效果,一定要在做之前跟開發區溝通解決方法。
推薦一款 ae 神器 Bodymovin,把在 AE上 做好的動畫導出為 json 文件,直接給到開發,可以幫助提高實現動效效率,同時提高動效質量,網上有好多視頻教程這塊就不再一一闡述了。
下面是官方支持的 ae 效果說明:
插件支持預合成,形狀層次,固態層,圖片,空對象以及文字樣式。
支持遮罩和反向遮罩。也許別的模式也會支持,但是導致性能造成巨大影響。
支持時間重映射。
支持形狀雙層的形狀,矩形,橢圓和三角形。
目前只支持滑塊效果。
支持部分表達式。更多介紹可以查看這里(英文)
不支持:圖像序列,視頻和音頻(也許未來會支持)。
不要擴展軸向!不知為何,擴展軸向會破壞導出的數據,所以不要做這個操作。
Bodymovin 工具在 AE 中有些預設效果和透視功能是不支持的,可以把動畫渲染成視頻,把格式轉換為 ogg 或者 webm 網頁視頻格式,網頁視頻格式加載是非??斓?,之后把文件給開發就可以了。
注意 Bodymovin導出 json 給開發的文件中需要有完整視頻參考,開發可以通過完整視頻查看位置和效果,同時如果出現 json 導出錯誤的情況,開發可以查看,遇到不一樣的地方可以詢問設計師。開發完成后需要走查,看是否與你預期一致。
總結
本文大概講了下 web、U3d、Ue4、ventuz 等一些可視化的實現工具,以及地圖的一些實現方法,關于數據可視化大家都是摸著石頭過河,以上是我在工作中了解的一些跟開發對接實現的經驗分享給大家,歡迎大家多溝通交流。
文由ScriptEcho平臺提供技術支持
項目地址:傳送門
本文展示了如何使用 p5.js 庫創建交互式的 3D 幾何圖形展示。該技術廣泛應用于藝術、教育和科學可視化等領域。
這段代碼利用 p5.js 庫繪制了六個不同的 3D 幾何圖形:平面、立方體、圓柱體、圓錐體、環面和球體。這些圖形隨著時間的推移旋轉和移動,呈現出動態的 3D 展示效果。
首先,通過 loadJavascript 函數異步加載 p5.js 庫。
let jsUrls=['https://registry.npmmirror.com/p5/1.9.3/files/lib/p5.min.js']
await Promise.all(jsUrls.map((jsUrl)=> loadJavascript(jsUrl)))
接下來,定義了一個 p5.js 草圖,其中包含 setup 和 draw 函數。
const sketch=(s)=> {
s.setup=()=> {
s.createCanvas(710, 400, s.WEBGL)
}
s.draw=()=> {
// ...
}
}
在 setup 函數中,創建了一個 WebGL 畫布,并設置畫布大小。
s.createCanvas(710, 400, s.WEBGL)
在 draw 函數中,使用 p5.js 的 3D 形狀函數繪制了六個不同的幾何圖形。每個圖形都應用了不同的旋轉和移動變換,以創建動態的展示效果。
s.plane(70)
s.box(70, 70, 70)
s.cylinder(70, 70)
s.cone(70, 70)
s.torus(70, 20)
s.sphere(70)
最后,創建一個 p5.js 實例,并將其附加到 HTML 元素上。
new p5(sketch, 'container')
開發這段代碼的過程讓我深入了解了 p5.js 庫在創建交互式 3D 可視化方面的強大功能。該代碼可以進一步擴展和優化,例如:
獲取更多Echos
本文由ScriptEcho平臺提供技術支持
項目地址:傳送門
微信搜索ScriptEcho了解更多
*請認真填寫需求信息,我們會在24小時內與您取得聯系。