ThreeJS程序化生成城市大場景底座(性能測試)

一、簡介

基于矢量geojson數據構建建筑、植被、道路等,實現城市場景底座。

涉及渲染的性能優化無非就是眾所周知的那些事兒。

視錐剔除、mesh合并、減少draw call、四叉樹、八叉樹、數據壓縮、WebWorker、著色器優化等。下面是對東莞市數十萬建筑以及海量3D樹的渲染測試。

二、效果

三、代碼

const unit = 1;
const sceneControl = InitHelper.init3D(new Vector3(0, 5000, 0));
const container = document.querySelector("#map") as HTMLElement;
container && sceneControl.render(container);
const { scene, camera, renderer } = sceneControl;
const control = InitHelper._createControls(camera, document.body, scene);
renderer.shadowMap.type = BasicShadowMap;
InitHelper.addLight(scene, new Vector3(3 / unit, 2 / unit, 1 / unit), unit);//插件初始化
const centerGeo = new Vector3(113.739834, 23.052766, 0);
const imageryLayers = new ImageryLayers();
imageryLayers.add(tdtImageryLayerIMG);
imageryLayers.add(tdtImageryLayerLabel);
const map = new Map({threeModule: {scene, camera, renderer, control},center: centerGeo,earthOptions: {useEarth: true},imageryLayers: imageryLayers,unit: unit,terrainLayer: guangdongTerrain,castShadow: true,receiveShadow: true
})
///////////loading///////////////////
map.addEventListener(MapEventType.onProgress, (v) => {console.log(v.progress);if (v.progress > 0.8) {const mask = document.getElementById('mask');mask!.style.display = 'none';}
});
////////////////////樹///////////////////////
const treePipline = new TreePipelineSprite({imageryLayer: tdtImageryLayerIMG,widthBottomHeight: true,level: 14,
})
treePipline.addTo(map);
///////////////////////建筑///////////////////////
const buildingPipline = new BuildingPipline({// pbfUrl: map.staticPath + '/static/' + 'shijingshan.bpf',pbfUrl: map.staticPath + '/static/' + 'dongguan441900.pbf',heightProp: 'height',bottomHeight: 10,
})
buildingPipline.addTo(map);
///////////////////////GUI參數設置界面///////////////////////////
initGui(map, {show: true
});
//////////////////////////建筑設置面板////////////////////////////////////
// initBuildingGui(map, buildingPipline);
////////////////////////////材質切換/////////////////////////////
import RoamingPath, { PointWithPitch } from './RoamingPath';
const pathPos: PointWithPitch[] = [{ position: new Vector3(113.653087, 22.763037, 10000), pitch: -20 },{ position: new Vector3(113.662839, 22.779383, 1000), pitch: -20 },{ position: new Vector3(113.667659, 22.806545, 700), pitch: -30 },{ position: new Vector3(113.668767, 22.824555, 500), pitch: -30 },{ position: new Vector3(113.660551, 22.861560, 400), pitch: -30 },{ position: new Vector3(113.656820, 22.907300, 300), pitch: -30 },{ position: new Vector3(113.657126, 22.922037, 300), pitch: -30 },{ position: new Vector3(113.661291, 22.933088, 300), pitch: -30 },{ position: new Vector3(113.669534, 22.945224, 300), pitch: -30 },{ position: new Vector3(113.710343, 22.992263, 500), pitch: -30 }
];const line: any = [];
const pathPosWord: PointWithPitch[] = [];
for (let index = 0; index < pathPos.length; index++) {const pointCoord = pathPos[index];line.push([pointCoord.position.x, pointCoord.position.y]);const coord3DXYZ = CoordUtil.LonLatTo3DXYZ(pointCoord.position.x, pointCoord.position.y, pointCoord.position.z);pathPosWord.push({position: coord3DXYZ,pitch: pointCoord.pitch - 50});
}const path = new RoamingPath(pathPosWord, 35, 'speed');
path.addEventListener('start', () => {console.log('Roaming started');
});path.addEventListener('end', () => {console.log('Roaming ended');
});path.addEventListener('update', (camera, delta) => {console.log('Updating camera', camera.position);
});
use.useframe(() => {const delta = path.getDelta();path.update(camera, delta);
})
const buttons = document.querySelectorAll("#btns button");
buttons.forEach(button => {button.addEventListener("click", function () {const buttonId = this.id;switch (buttonId) {case "one":path.start({ height: 0 });break;case "two":path.stop();break;default:alert("未知按鈕被點擊");}});
});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918906.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

?電風扇離線語音芯片方案設計與應用場景:基于 8 腳 MCU 與 WTK6900P 的創新融合

?電風扇離線語音芯片方案設計與應用場景&#xff1a;基于 8 腳 MCU 與 WTK6900P 的創新融合一、引言在智能家居領域蓬勃發展的當下&#xff0c;用戶對于家電產品的智能化和便捷性需求日益增長。傳統的電風扇控制方式&#xff0c;如按鍵操作或遙控器控制&#xff0c;在某些場景…

(第四篇)spring cloud之Consul注冊中心

目錄 一、介紹 二、安裝 三、整合代碼使用 1、創建服務提供者8006 2、創建服務消費者80 3、Eureka、zookeeper和consul的異同點 一、介紹 Consul 是一套開源的分布式服務發現和配置管理系統&#xff0c;由 HashiCorp 公司用 Go 語言開發。它提供了微服務系統中的服務治理…

NAT 和 PNAT

核心概念與背景 IPv4 地址枯竭&#xff1a; IPv4 地址空間有限&#xff08;約 42.9 億個&#xff09;&#xff0c;早已分配殆盡。NAT/PNAT 是緩解此問題的最重要、最廣泛部署的技術。私有 IP 地址空間&#xff1a; IANA 保留了三個 IPv4 地址段專供私有網絡內部使用&#xff08…

windows系統創建FTP服務

一丶開啟FTP功能 控制面板->程序與功能->啟用或關閉windows功能->Internet Information Services->勾選FTP服務器二丶創建FTP服務 1丶控制面板->windows工具->Internet Information Services (IIS) 管理器2丶網站->添加FTP站點->輸入對應內容3丶點擊新…

DeepSeek補全IBM MQ 9.4 REST API 執行命令的PPT

DeepSeek補全了我在網上找到的PPT的一頁內容&#xff0c;幫了大忙了。人機協同&#xff0c;人工智能可以協助人更好的做事。下面的內容是講解IBM MQ REST API 執行IBM MQ命令的PPT: MQSC for REST Tailored RESTful support for individual MQ objects and actions are in the …

【swift】SwiftUI動畫卡頓全解:GeometryReader濫用檢測與Canvas繪制替代方案

SwiftUI動畫卡頓全解&#xff1a;GeometryReader濫用檢測與Canvas繪制替代方案一、GeometryReader的性能陷阱深度解析1. 布局計算機制2. 動畫中的災難性表現二、GeometryReader濫用檢測系統1. 靜態代碼分析器2. 運行時性能監控三、Canvas繪制優化方案1. 基礎Canvas實現2. 性能優…

悄悄話、合唱層次感:聲網空間音頻解鎖語聊新玩法

作為語聊房主播&#xff0c;我曾覺得線上相聚差點意思。多人開麥時聲音混雜&#xff0c;互動缺真實感&#xff0c;觀眾留不住&#xff0c;自己播著也沒勁。直到平臺接入聲網空間音頻&#xff0c;一切改觀&#xff0c;觀眾說像在真實房間聊天&#xff0c;留存率漲 35%&#xff0…

【工具】多圖裁剪批量處理工具

文章目錄工具核心功能亮點1. 批量上傳與智能管理2. 精準直觀的裁剪控制3. 一鍵應用與批量處理為什么這個工具能提升你的工作效率&#xff1f;統一性與一致性保證節省90%以上的時間專業級功能&#xff0c;零學習成本實際應用場景電子商務攝影工作內容創作教育領域技術優勢完全在…

如何提升需求分析能力

要系統性地提升需求分析能力&#xff0c;核心在于實現從一個被動的“需求記錄員”&#xff0c;向一個主動的、價值驅動的“業務問題解決者”的深刻轉型。要完成這一蛻變&#xff0c;必須在五個關鍵領域進行系統性的修煉與實踐&#xff1a;培養“穿透表象”的系統思維能力、掌握…

另類的pdb恢復方式

cdb中有pdb1,pdb2 需求&#xff1a;希望將在線熱備份pdb1的備份集a&#xff0c;恢復成pdb3&#xff0c;使得cdb中有pdb1,2,3 參考到的&#xff1a;RMAN備份恢復典型案例——跨平臺遷移pdb - 墨天輪 ORA-65122: Pluggable Database GUID Conflicts With The GUID Of An Existi…

HarmonyOS 實戰:用 @Observed + @ObjectLink 玩轉多組件實時數據更新

摘要 在鴻蒙&#xff08;HarmonyOS&#xff09;應用開發中&#xff0c;實時數據更新是一個繞不開的話題&#xff0c;尤其是在你封裝了很多自定義組件、需要多個組件之間共享和同步數據的場景里。過去我們可能會依賴父子組件直接傳參或全局狀態管理&#xff0c;但這樣寫會讓代碼…

云原生俱樂部-雜談2

說實話&#xff0c;雜談系列可能會比較少&#xff0c;因為畢竟大部分時間都是上的線上&#xff0c;迄今為止也是&#xff0c;和雷老師與WH的交流不是很多。這個系列僅僅是我在做其他筆記部分無聊的時候來寫的&#xff0c;內容也沒有規劃過&#xff0c;隨想隨寫。倒不是時間太多…

波浪模型SWAN學習(1)——模型編譯與波浪折射模擬(Test of the refraction formulation)

SWAN模型編譯與波浪折射模擬&#xff08;Test of the refraction formulation&#xff09;編譯過程算例簡介參數文件文件頭&#xff08;HEADING&#xff09;計算區域和網格地形數據邊界條件物理模塊設置輸出設置執行參數模擬結果由于工作原因&#xff0c;最近開始接觸波浪模型&…

更換cmd背景圖片

打開cmd 右擊頂部&#xff0c;選擇設置選擇命令提示符&#xff0c;外觀選擇背景圖像路徑更改成自己的圖片&#xff0c;然后右下角保存 設置成功

基于RobustVideoMatting(RVM)進行視頻人像分割(torch、onnx版本)

發表時間&#xff1a;2021年8月25日 項目地址&#xff1a;https://peterl1n.github.io/RobustVideoMatting/ 論文閱讀&#xff1a;https://hpg123.blog.csdn.net/article/details/134409222 RVM是字節團隊開源的一個實時人像分割模型&#xff0c;基于LSTMConv實現&#xff0c;…

強制從不抱怨環境。

警世俗語&#xff1a;強者逆襲心法&#xff08;句句穿心&#xff09;環境是泥潭&#xff1f;那就讓它開出金蓮&#xff01; —— 抱怨是弱者的裹腳布&#xff0c;行動是強者的登天梯。爛泥里也能種出搖錢樹&#xff0c;關鍵看你敢不敢下手挖&#xff01;老天爺發牌爛&#xff1…

MC0439符號統計

碼蹄集OJ-符號統計 MC0439?符號統計 難度&#xff1a;黃金 時間限制&#xff1a;1 秒 占用內存&#xff1a;256 M 收藏 報錯 在華容道放曹的緊張時刻&#xff0c;小碼哥接到了一個看似微不足道卻至關重要的任務&#xff1a;解讀一條僅由小寫英文字母組成的神秘字符串 s&#…

Android Jetpack 系列(五)Room 本地數據庫實戰詳解

1. 簡介 在需要輕量級本地持久化的場景中&#xff0c;DataStore 是一個理想的選擇&#xff08;詳見《Android Jetpack 系列&#xff08;四&#xff09;DataStore 全面解析與實踐》&#xff09;。但當你面臨如下需求時&#xff0c;本地數據庫便顯得尤為重要&#xff1a; 復雜的…

C語言實現類似C#的格式化輸出

在C#中&#xff0c;格式化輸出可以使用索引占位符以及復合格式的占位符&#xff0c;可以不用關心后面參數是什么類型&#xff0c;使用起來非常方便&#xff0c;如下簡單的示例&#xff1a; Console.WriteLine("{2} {1} {0} {{{2}}}", "Hello, World!", 1,…

一人公司方法論

** 一人公司方法論 ** 那什么是一人公司&#xff1f; 字面的理解就是一個人運營的公司&#xff0c;但實際上它指代的是比較少的人運營的小公司&#xff0c;一般來說 1 ~ 3 個人運營的公司&#xff0c;也可以把它放到一人公司的范圍以內。其他一些形式&#xff0c;比如說一個人再…