Babylon.js學習之路《十、高級幾何體:自定義模型與復雜形狀生成》

在這里插入圖片描述

文章目錄

  • 1. 引言:高級幾何體的應用場景
  • 2. 參數化建模:Babylon.MeshBuilder
    • 2.1 擴展幾何體類型
    • 2.2 自定義多邊形(ExtrudePolygon)
  • 3. 頂點級建模:自定義VertexData
    • 3.1 手動定義頂點數據
    • 3.2 動態生成地形(高度圖)
  • 4. 幾何體變形與動態更新
    • 4.1 實時頂點動畫(波浪效果)
    • 4.2 幾何體布爾運算(差集/并集)
  • 5. 實戰任務
    • 任務1:生成參數化齒輪
    • 任務2:動態生長的植物
  • 6. 性能優化與調試
    • 6.1 優化策略
    • 6.2 調試工具
  • 7. 總結與擴展


1. 引言:高級幾何體的應用場景

  • 核心價值

    • 突破基礎幾何體限制,創建復雜模型(如建筑結構、有機生物、工業零件)。
  • 案例對比

    • 基礎幾何體:僅能表現簡單形狀(立方體/球體),缺乏細節。
    • 高級幾何體:通過參數化建模生成齒輪、地形、管道等專業模型。

2. 參數化建模:Babylon.MeshBuilder

2.1 擴展幾何體類型

  • 內置復雜幾何體

    // 創建十二面體
    const dodecahedron = BABYLON.MeshBuilder.CreatePolyhedron("dodeca", { type: 2, size: 2 }, // type 2 對應十二面體scene
    );
    

    在這里插入圖片描述

    // 創建圓環結(Torus Knot)
    const torusKnot = BABYLON.MeshBuilder.CreateTorusKnot("knot", // 網格的名稱0.5, // 設置圓環結的全局半徑大小0.2, // 設置圓環管的直徑大小128, // 設置每個管段上的邊數64, // 設置要將結分解為的管的數量2: // X軸上的匝數3: // Y軸上的匝數scene
    );
    

    在這里插入圖片描述

2.2 自定義多邊形(ExtrudePolygon)

  • 生成2D形狀拉伸的3D模型
    // Poteau Gauche
    const pts_pg = [new BABYLON.Vector3(0, 0, 0), new BABYLON.Vector3(100, 0, 0),   new BABYLON.Vector3(100, 0, 100), new BABYLON.Vector3(0, 0, 100), ]
    const poteau_gauche = BABYLON.MeshBuilder.ExtrudePolygon("poteau_gauche",{shape: pts_pg,depth: 1100}
    )
    
    在這里插入圖片描述

3. 頂點級建模:自定義VertexData

3.1 手動定義頂點數據

  • 步驟
    定義頂點位置(positions)
    定義頂點索引(indices)
    可選:法線(normals)、UV坐標(uvs)
  • 代碼示例:創建三角錐
    const customMesh = new BABYLON.Mesh("custom", scene);
    const vertexData = new BABYLON.VertexData();// 頂點坐標(4個點:底面3個,頂點1個)
    vertexData.positions = [0, 0, 0,   // 底面點11, 0, 0,   // 底面點20.5, 0, 1, // 底面點30.5, 1, 0.5 // 頂點
    ];// 三角形面索引(4個面:底面+3個側面)
    vertexData.indices = [0, 1, 2,   // 底面0, 1, 3,   // 側面11, 2, 3,   // 側面22, 0, 3    // 側面3
    ];// 計算法線(否則光照異常)
    BABYLON.VertexData.ComputeNormals(vertexData.positions, vertexData.indices, vertexData.normals);vertexData.applyToMesh(customMesh);
    

3.2 動態生成地形(高度圖)

  • 基于噪聲函數生成起伏地形
    const size = 100;
    const subdivisions = 50;
    const terrain = BABYLON.MeshBuilder.CreateGround("terrain", { width: size, height: size, subdivisions: subdivisions },scene
    );// 修改頂點Y坐標
    const positions = terrain.getVerticesData(BABYLON.VertexBuffer.PositionKind);
    for (let i = 0; i < positions.length; i += 3) {const x = positions[i];const z = positions[i + 2];positions[i + 1] = 5 * Math.sin(x * 0.2) * Math.cos(z * 0.2); // 噪聲函數
    }
    terrain.updateVerticesData(BABYLON.VertexBuffer.PositionKind, positions);
    

4. 幾何體變形與動態更新

4.1 實時頂點動畫(波浪效果)

  • 代碼
    scene.registerBeforeRender(() => {const time = performance.now() / 1000;const positions = plane.getVerticesData(BABYLON.VertexBuffer.PositionKind);for (let i = 0; i < positions.length; i += 3) {const x = positions[i];const z = positions[i + 2];positions[i + 1] = Math.sin(x + time) * Math.cos(z + time);}plane.updateVerticesData(BABYLON.VertexBuffer.PositionKind, positions);
    });
    

4.2 幾何體布爾運算(差集/并集)

  • 使用CSG(Constructive Solid Geometry)
    const box = BABYLON.MeshBuilder.CreateBox("box", { size: 2 }, scene);
    const sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 2 }, scene);
    sphere.position.x = 1;// 轉換為CSG對象
    const boxCSG = BABYLON.CSG.FromMesh(box);
    const sphereCSG = BABYLON.CSG.FromMesh(sphere);// 布爾運算(差集:立方體減去球體)
    const resultCSG = boxCSG.subtract(sphereCSG);
    const resultMesh = resultCSG.toMesh("result", null, scene);
    box.dispose();
    sphere.dispose();
    

5. 實戰任務

任務1:生成參數化齒輪

  • 目標
  • 代碼要點
    function createGear(teeth: number, radius: number) {const points = [];for (let i = 0; i < teeth * 2; i++) {const angle = (i / (teeth * 2)) * Math.PI * 2;const r = i % 2 === 0 ? radius : radius * 0.8; // 交替半徑生成齒槽points.push(new BABYLON.Vector3(r * Math.cos(angle), 0, r * Math.sin(angle)));}return BABYLON.MeshBuilder.ExtrudePolygon("gear", { shape: points, depth: 0.5 },scene);
    }
    const gear = createGear(16, 3); // 16齒,半徑3
    

任務2:動態生長的植物

  • 目標
  • 實現步驟
    1. 使用L-System算法生成分支結構。
    2. 通過頂點數據構建圓柱體分支。
    3. 添加生長動畫(逐幀增加分支長度)。

6. 性能優化與調試

6.1 優化策略

  • 合并網格(MergeMeshes):減少Draw Call。
    const merged = BABYLON.Mesh.MergeMeshes([mesh1, mesh2], true); // 第二個參數啟用材質合并
    
  • 簡化復雜網格:使用simplify()方法降低面數。
    const simplified = BABYLON.SimplificationStrategy.QUADRATIC(mesh);
    mesh.simplify([{ distance: 100, quality: 0.8 }]); // 根據距離簡化
    

6.2 調試工具

  • 顯示頂點法線
    BABYLON.Debug.AxesViewer(scene, 1); // 顯示坐標系
    const normalsViewer = new BABYLON.Debug.NormalsViewer(mesh, scene); // 顯示法線
    

7. 總結與擴展

  • 核心技能:參數化建模、頂點操作、布爾運算、動態幾何更新。
  • 擴展方向
    • GPU加速生成:通過Compute Shader實時生成幾何體。
    • 程序化城市生成:結合噪聲函數和規則系統。
    • 三維掃描重建:從點云數據生成網格。

通過本指南,開發者可掌握從基礎擴展幾何體到專業級程序化建模的全套技能,滿足工業設計、游戲開發等領域的復雜需求。

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

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

相關文章

【趙渝強老師】Kubernetes的安全框架

Kubernetes集群的安全框架主要由以下認證、鑒權和準入控制三個階段組成。這三個階段的關系如下圖所示。 視頻講解如下 【趙渝強老師】Kubernetes的安全框架 認證&#xff08;Authentication&#xff09; 當客戶端與Kubernetes集群建立HTTP通信時&#xff0c;首先HTTP請求會進…

CDN與靜態資源優化

CDN與靜態資源優化 在現代Web系統和AI應用中&#xff0c;隨著用戶訪問量的不斷攀升&#xff0c;靜態資源&#xff08;如HTML、CSS、JavaScript、圖片、音視頻、模型文件等&#xff09;帶來的負載日益沉重。尤其在大模型推理、前端渲染、廣告投放等場景中&#xff0c;靜態資源的…

如何填寫“appium inspector”內容?

1. 確認已經開啟appium的服務&#xff0c;運行appium 參考內容&#xff1a;{"appium:platformName": "Android", # 系統名稱"appium:platformVersion": "9", # 安卓版本&#xff0c;看設備"appium:deviceName": "3d…

mysql server層做了什么

服務器處理客戶端請求 服務器程序在處理來自客戶端的查詢請求時&#xff0c;大致需要分為3部分&#xff1a;連接管理、解析與優化、存儲引擎。 連接管理 每當有一個客戶端進程連接到服務器進程時&#xff0c;服務器進程都會創建一個線程專門處理與這個客戶端的交互&#xff…

APISIX 簡介:云原生 API 網關的架構與實踐

文章目錄 引言&#xff1a;APISIX 概述基于Nginx構建的原因基于etcd構建的原因 架構圖示架構分層解析管理層&#xff1a;人機交互與配置入口控制層&#xff1a;配置管理與集群協調數據面&#xff1a;請求處理與流量轉發說明&#xff1a;關于OpenRestry 引言&#xff1a;APISIX …

【AI作畫】第3章 LORA加載器

目錄 LORA加載器 管道信息 ?編輯 ?編輯 ?編輯 lora模型的串接 作品集 LORA加載器 前面我們已經分析過節點目錄了&#xff0c;現在我們來看一下LORA加載器。我們進行圖片渲染&#xff0c;一般都需要LORA模型的。 首先&#xff0c;我們“鼠標右鍵——添加節點——…

Xilinx XC7A12T?1CPG238I Artix?7 FPGA

XC7A12T?1CPG238I 以其獨特的性能與封裝組合&#xff0c;成為諸多工程師的首選方案。下面&#xff0c;我們從多個維度對這款芯片做深入剖析。 一、產品定位與封裝特點 XC7A12T?1CPG238I 屬于賽靈思&#xff08;Xilinx&#xff09;28?nm Artix?7 系列中的入門級型號&#x…

如何利用 Java 爬蟲獲得微店商品詳情:實戰指南

在電商領域&#xff0c;微店作為眾多商家的線上銷售渠道之一&#xff0c;其商品詳情數據對于市場分析、競品研究和商業決策具有重要價值。Java 爬蟲技術可以幫助我們高效地獲取這些數據。本文將詳細介紹如何使用 Java 編寫爬蟲&#xff0c;獲取微店商品詳情。 一、準備工作 &…

【Bug】MAUI自定義彈窗在IOS有異常背景

文章目錄 問題問題代碼原因解決處理Bug的具體步驟 問題 自定義彈窗有異常背景 問題代碼 <mct:Popup xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/xaml"xmlns:converters"clr-names…

C語言酒店管理系統:完整源碼與深度解析

酒店管理系統通過自動化流程提升酒店運營效率。本系統采用C語言開發&#xff0c;基于模塊化設計思想&#xff0c;包含以下核心功能&#xff1a; ?房間管理?&#xff1a;初始化房間信息、查看房間狀態?預訂管理?&#xff1a;按時間段預訂房間、查詢預訂記錄?入住管理?&am…

基于Gold-YOLO的聚合-分發機制改進YOLOv8教程

1. 引言 本文將詳細介紹如何將Gold-YOLO的核心創新——聚合-分發(Gather-and-Distribute, GD)機制集成到YOLOv8架構中。Gold-YOLO是一種創新的目標檢測架構,通過獨特的信息融合策略實現了低延遲和高準確性的理想平衡。 1.1 Gold-YOLO核心特性 Gold-YOLO的主要創新點包括…

blob 的使用 文件下載 圖片預覽 大文件分片上傳

1. 文件下載 function downloadFile(content, filename, type) {const blob new Blob([content], { type });const url URL.createObjectURL(blob);const a document.createElement(a);a.href url;a.download filename;a.click();URL.revokeObjectURL(url); }// 使用示例…

FlinkCDC-Hudi數據實時入湖原理篇

1.Hudi應用場景 面對海量數據開發場景&#xff0c;一種支持存儲多種原始數據格式、多種計算引擎、高效的元數據統一管理的存儲方式能極大的提高開發效率。所以在選擇技術選型的時候&#xff0c;這種存儲方式有以下幾個特點&#xff1a; 存儲原始數據&#xff0c;這些原始數據來…

sqldeveloper 創建新用戶并訪問其他空間特定表和視圖

創建用戶 右鍵選擇創建用戶 1.給用戶取一個名字 VIEW_TEST 2.設置密碼 123456&#xff08;建議用其他&#xff09; 3.選擇表空間和臨時空間 選擇角色 CONNECT 連接角色 選擇系統權限 然后點擊應用就可以了 然后在用戶哪里就能看到這個用戶了 登錄用戶 出現成功就說明可以…

家用電器3d掃描逆向建模中科米堆手持式藍光三維掃描儀數字建模

從廚房里的冰箱、微波爐&#xff0c;到客廳中的電視、空調&#xff0c;再到臥室的加濕器、空氣凈化器等&#xff0c;家用電器極大地提升了我們的生活品質。 家電市場的競爭日益激烈&#xff0c;產品更新換代速度加快&#xff0c;如何快速、精準地獲取現有家電產品的三維數據&a…

從“數據困境”到“數據生態”:DaaS重塑三甲醫院醫療數據治理

從“數據困境”到“數據生態”&#xff1a;DaaS如何重塑三甲醫院醫療數據治理 醫療數據治理的現狀剖析 在智慧醫療蓬勃發展的當下&#xff0c;三甲醫院憑借其豐富的臨床資源&#xff0c;積累了海量、多維度的醫療數據。這些數據猶如一座蘊藏著巨大價值的富礦&#xff0c;涵蓋了…

LVS +Keepalived 高可用群集

目錄 前言一. Keepalived 雙機熱備基礎知識1. Keepalived 概述及安裝&#xff08;1&#xff09;Keepalived 的熱備方式&#xff08;2&#xff09;Keepalived 的安裝與服務控制 2. 使用Keepalived 實現雙機熱備&#xff08;1&#xff09;主服務器的配置&#xff08;2&#xff09…

【Go語言基礎】對齊邊界與內存填充

文章目錄 一、內存對齊的核心概念二、Go語言的內存對齊規則三、內存對齊示例示例1&#xff1a;字段順序影響對齊示例2&#xff1a;指針與切片的對齊 四、如何查看內存對齊&#xff1f;五、內存對齊的優化建議六、總結&#xff1a;內存對齊的核心要點 在計算機科學中&#xff0c…

網絡核心 - CNI、Service 與 Ingress/Gateway API 解析

網絡核心 - CNI、Service 與 Ingress/Gateway API 解析 Kubernetes 的強大之處在于它極大地簡化了容器化應用的部署和管理,但其網絡模型的靈活性和復雜性也常常讓初學者感到困惑。作為 SRE,我們需要撥開迷霧,理解流量在 K8s 集群內部以及進出集群時,到底是如何流轉的。 Po…

20.jsBridge多頁面交互與原生事件監聽沖突問題

一、問題描述 ? 安卓原生頁面調起 H5A 頁面&#xff1b; ? H5A 頁面跳轉到 H5B 頁面&#xff1b; ? 在 H5B 頁面點擊“附件上傳”&#xff0c;通過 JS Bridge 調用安卓的附件上傳功能&#xff0c;彈出附件彈窗&#xff1b; ? 然后 返回 到 H5A 頁面&#xff0c;附件上傳彈窗…