基於 HTML5 WebGL 構建智慧城市 3D 場景
前言
隨著城市規模的擴大,傳統的方式很難徹底地展示城市的全貌,但隨著 3D 技術的應用,出現了 3D 城市群的方式以動態,互動式地把城市全貌呈現出來。配合智慧城市系統,通過 Web 視覺化的方式,使得城市管理者可以更及時地瞭解交通情況,城市消防,電力管理等方面的執行情況,做出處理。
本 demo 使用 HT for Web 產品輕量化 HTML5/WebGL 建模的方案,傳統的 智慧樓宇/樓宇自動化/樓宇安防/智慧園區 常會採用 BIM(建築資訊模型 Building information modeling)軟體,如 Autodesk 的 Revit 或 Bentley 這類建築和工程軟體,但這些 BIM 建模模型的資料往往過於龐大臃腫,絕大部分細節資訊對樓宇自控意義不大,反而影響拖累了行業 Web SCADA 或 Web 組態監控的趨勢,所以我們採用以 Hightopo 的 HT for Web 產品輕量化 HTML5/WebGL 建模的方案,實現快速建模、執行時輕量化到甚至手機終端瀏覽器即可 3D 視覺化運維的良好效果。
demo 地址:智慧城市
預覽圖:
程式碼實現
載入 3d 場景
新建一個 3d 場景,並加入到頁面中。
const g3d = new ht.graph3d.Graph3dView();
const dm3d = g3d.dm();
g3d.addToDOM();
addToDOM 函式預設將場景載入到 body 中並填充視窗。
接下來反序列化城市場景 json,並在反序列化函式的回撥中設定了場景的視角,中心位置,天空盒,並獲得各圖元資訊,呼叫 startAnim 函式:
g3d.deserialize('scenes/ny.json', () => {
g3d.setEye([1132.8386351821287, 1916.836416970022, 1479.5345608290288]);
g3d.setCenter([519.9741236104874, 273.4741921410557, -319.58669041297884]);
g3d.setSkyBox(dm3d.getDataByTag('skyBox'));
// 獲取擴散效果的圖元
scaleList.push(
dm3d.getDataByTag('scaleBlue'),
dm3d.getDataByTag('scaleRed')
);
···
// 開始動畫
startAnim();
});
動畫實現
載入後的城市場景如下圖所示:
我們可以看到場景中有藍黃水波紋效果,道路,消防通道的流動效果,上下浮動的效果和旋轉的 logo 和衛星。
動畫的實現均通過 ht.Default.startAnim 實現的,先來了解一下:
ht.Default.startAnim({
// 動畫幀數
frames: 12,
// 動畫幀間隔毫秒數
interval: 10,
// 動畫緩動函式,預設採用 ht.Default.animEasing
easing: function(t){ return t * t; },
// 動畫結束後呼叫的函式
finishFunc: function(){ console.log('Done!') },
// action 函式必須提供,實現動畫過程中的屬性變化
action: function(v, t){
// 此例子展示將節點 node 從位置 p1 動畫到位置 p2
node.setPosition(
p1.x + (p2.x - p1.x) * v,
p1.y + (p2.y - p1.y) * v
);
}
});
以上為 Frame-Based 方式動畫, 這種方式使用者通過指定 frames 動畫幀數,以及 interval 動畫幀間隔引數控制動畫效果。
ht的動畫手冊可以參照:動畫手冊
下面依次介紹各個效果的實現。
1. 波紋效果
預覽圖:
程式碼:
function waveScale(obj, dlt, max, min) {
obj.forEach(node => {
// 擴散半徑增加
let s = node.getScaleX() + dlt;
// 擴散半徑大於最大值的時候, 重置為最小值
if (s >= max) s = min;
// 設定 x,y,z 方向的縮放值
node.setScale3d(s, s, s);
});
}
function startAnim() {
ht.Default.startAnim({
frames: Infinity,
interval: 20,
action: () => {
// 擴散藍和擴散紅
waveScale(scaleList, dltScale, maxScale, minScale);
}
});
}
2. 旋轉效果
預覽圖:
程式碼:
function rotateAction(obj, dlt) {
// 獲取圖元旋轉弧度值,沒有就置零
let rotation = obj.getRotation() || 0;
// 每幀弧度增加
obj.setRotation(rotation + dlt);
}
function startAnim() {
ht.Default.startAnim({
frames: Infinity,
interval: 20,
action: () => {
// 衛星轉動
rotateAction(star, dltRoattion);
}
});
}
3. 流動效果
預覽圖:
流動效果是非常常見的效果,實現的過程也較為簡單,只需要動態地去改變 uv 貼圖的偏移值即可。在本例中,通過對模型六面的貼圖的 U 方向實施動態增減實現了多個流動效果:
function uvFlow(obj, dlt) {
// 改變貼圖 uv 座標實現流動效果
let offset = obj.s('all.uv.offset') || [0, 0];
obj.s('all.uv.offset', [offset[0] + dlt, offset[1]]);
}
function startAnim() {
ht.Default.startAnim({
frames: Infinity,
interval: 20,
action: () => {
// 小路流動效果
uvFlow(roadSmall, dltRoadSmall);
}
});
}
4. 浮動效果
預覽圖:
程式碼:
function blockFloat(obj, dis, dlt) {
obj.forEach(node => {
let startE = node.a('startE');
if (startE == null)
// 獲得圖元在 y(高度)方向上的值
node.a('startE', startE = node.getElevation());
let float = node.a('float') || 0;
// 設定 status 為方向
let status = node.a('status') || 1;
node.setElevation(startE + dis * float);
if (float > 1 || float < 0)
// 超出閥值則改變方向
node.a('status', status = -status);
float += dlt * status;
// 重新設定圖元高度
node.a('float', float);
});
}
function startAnim() {
ht.Default.startAnim({
frames: Infinity,
interval: 20,
action: () => {
// 消防標誌浮動效果
blockFloat(fireFloatList, fireFloadDis, fireFloatDlt)
}
});
}
這樣,一個基本的效果就實現了。
HT 的 3D 城市群方案不僅可以在大屏上有良好的效果,在移動端也有著不錯的體驗,這使得城市管理者不管何時何地都能獲取到實時的監控資訊,這裡放兩張在移動端瀏覽器上的預覽圖給大家體驗一下:
HT包含了數百個工業網際網路 2D 3D 視覺化應用案例,點選這裡體驗把玩:http://www.hightopo.com/demos/index.html
相關文章
- 基於 HTML5 WebGL 構建智慧數字化城市 3D 全景HTMLWeb3D
- 基於 HTML5 WebGL 的智慧城市(一)HTMLWeb
- 基於 HTML5 WebGL 的 3D 場景中的燈光效果HTMLWeb3D
- 基於WebGL HTML5 的場景小遊戲WebHTML遊戲
- 基於 HTML5 WebGL 智慧城市的模擬執行HTMLWeb
- 基於 HTML5 + WebGL 的 3D 風力發電場HTMLWeb3D
- 基於 HTML5 WebGL 的 3D 機房HTMLWeb3D
- 基於 HTML5 WebGL 的 3D 挖掘機HTMLWeb3D
- 基於 WebGL 的 HTML5 3D 智慧樓宇監控系統WebHTML3D
- 基於 HTML5 的 WebGL 3D 智慧樓宇監控系統HTMLWeb3D
- 基於 WebGL 的 HTML5 網路拓撲結構 3D 圖WebHTML3D
- 基於 HTML5 的 WebGL 3D 隧道監控HTMLWeb3D
- 基於 HTML5 WebGL 的 3D 科幻風機HTMLWeb3D
- 基於 HTML5 WebGL 的 3D 工控裙房系統HTMLWeb3D
- 基於 HTML5 WebGL 的 3D 模型斜面生成HTMLWeb3D模型
- 基於 WebGL HTML5 的 3D 模型分離控制WebHTML3D模型
- 基於 WebGL 的 HTML5 3D 工控裙房系統WebHTML3D
- 基於 HTML5 WebGL 的 3D 渲染引擎構建工廠運作系統HTMLWeb3D
- 基於 WebGl HTML5 的 3D 視覺化機房WebHTML3D視覺化
- 基於 HTML5 WebGL 的 3D 網路拓撲圖HTMLWeb3D
- 基於 WebGL 的 HTML5 3D SCADA 主站系統WebHTML3D
- 基於 WebGL 的 HTML5 3D 網路拓撲圖WebHTML3D
- 基於 HTML5 + WebGL 的 3D 風力發電場視覺化系統HTMLWeb3D視覺化
- 基於 HTML5 WebGL 的 3D 棉花加工監控系統HTMLWeb3D
- 基於 HTML5 + WebGL 的太陽系 3D 展示系統HTMLWeb3D
- 基於 WebGL 實現的 HTML5 3D “彈力”佈局WebHTML3D
- 基於 HTML5 WebGL 實現的 3D “彈力”佈局HTMLWeb3D
- 基於 WebGL 的 HTML5 3D 棉花加工監控系統WebHTML3D
- 基於Flink構建全場景實時數倉
- 基於HTML5 WebGL的工業化3D電子圍欄HTMLWeb3D
- 基於 HTML5 WebGL 的 3D 風機視覺化系統HTMLWeb3D視覺化
- 基於 WebGL 的 HTML5 3D 工控隧道視覺化系統WebHTML3D視覺化
- 基於 HTML5 WebGL 的挖掘機 3D 視覺化應用HTMLWeb3D視覺化
- 基於 HTML5 WebGL 與 GIS 的智慧機場大資料視覺化分析HTMLWeb大資料視覺化
- 阿里雲楊敬宇:四層技術構建基於城市場景的邊緣計算阿里
- 基於 HTML5 的 WebGL 樓宇自控 3D 視覺化監控HTMLWeb3D視覺化
- 基於 HTML5 的 WebGL 3D 地鐵站視覺化系統HTMLWeb3D視覺化
- 基於 WebGL 的 HTML5 樓宇自控 3D 視覺化監控WebHTML3D視覺化