Babylon.js學習之路《四、Babylon.js 中的相機(Camera)與視角控制》

在這里插入圖片描述

文章目錄

  • 1. 引言:為什么相機是 3D 場景的“眼睛”?
    • 1.1 相機的核心作用
    • 1.2 常見相機類型概覽
  • 2. 相機基礎參數解析
    • 2.1 通用屬性
    • 2.2 相機坐標系
  • 3. 詳解常用相機類型
    • 3.1 自由相機(FreeCamera)
    • 3.2 弧形旋轉相機(ArcRotateCamera)
    • 3.3 跟隨相機(FollowCamera)
    • 3.4 其他相機類型(快速概覽)
  • 4. 視角交互實戰技巧
    • 4.1 多相機切換
    • 4.2 自定義輸入控制
    • 4.3 相機動畫與過渡
  • 5. 相機性能優化與調試
    • 5.1 視錐剔除(Frustum Culling)
    • 5.2 避免過度繪制
    • 5.3 使用調試工具
  • 6. 實戰任務
    • 任務 1:構建可切換的相機系統
    • 任務 2:實現“物體聚焦”功能
  • 7. 常見問題解答
  • 8. 總結與下一章預告
    • 8.1 關鍵知識點回顧
    • 8.2 下一章預告


1. 引言:為什么相機是 3D 場景的“眼睛”?

  • 上一章簡單介紹了場景中如何添加標準形狀的物體,并且介紹了如何調整物體屬性,包括位置、旋轉、縮放,以及父級關系的設置。
  • 這一章詳細介紹一下Babylon中,相機相關的知識。涵蓋相機類型、交互配置及實戰技巧。

1.1 相機的核心作用

  • 定義用戶視角:觀察場景的位置、方向、視野范圍。
  • 交互基礎:通過鼠標/鍵盤/觸控控制視角移動。

1.2 常見相機類型概覽

  • 自由相機(FreeCamera
  • 弧形旋轉相機(ArcRotateCamera
  • 跟隨相機(FollowCamera
  • 第一人稱相機(UniversalCamera

2. 相機基礎參數解析

2.1 通用屬性

  • 位置(Position)camera.position = new BABYLON.Vector3(x, y, z)
  • 目標(Target)camera.setTarget(new BABYLON.Vector3(x, y, z))
  • 視野(FOV)camera.fov = 0.8(弧度制,影響廣角效果)。
  • 近裁面與遠裁面(Clipping Planes)
    camera.minZ = 0.1; // 近裁面(避免渲染過近物體)camera.maxZ = 1000; // 遠裁面(避免渲染過遠物體)

2.2 相機坐標系

  • 局部坐標系:相機的移動方向基于自身朝向。
  • 世界坐標系:相機的移動方向基于全局坐標軸。

3. 詳解常用相機類型

3.1 自由相機(FreeCamera)

在這里插入圖片描述

  • 特點:類似第一人稱射擊游戲的自由移動視角。
  • 代碼創建
  const freeCamera= new BABYLON.FreeCamera("freeCamera", new BABYLON.Vector3(0, 5, -10), scene);freeCamera.setTarget(BABYLON.Vector3.Zero());
  • 控制配置
    • 鍵盤移動:默認 WASD 控制前后左右,QE 控制升降。
    • 鼠標控制視角camera.attachControl(canvas, true)
    • 靈敏度調整
    freeCamera.speed = 0.5; // 移動速度freeCamera.angularSensibility = 2000; // 鼠標靈敏度(值越大越遲鈍)
  • 其他相機配置參數
	// 相機反轉freeCamera.invertRotation = true;// 相機轉動速度freeCamera.inverseRotationSpeed = 3;// 相機y軸角度freeCamera.rotation.y = (rotation * Math.PI) / 180;// 添加滾輪輸入freeCamera.inputs.addMouseWheel();// 開啟觸摸控制freeCamera.inputs.attached.mouse.touchEnabled = true;// 鼠標輸入靈敏度。(默認值為2000.0)值越高,靈敏度越低。freeCamera.angularSensibility = 1300;// 定義攝像頭可以看到的最小距離 太小會閃面freeCamera.minZ = 10;// 定義攝像頭可以看到的最大距離freeCamera.maxZ = 20000;// 廣角freeCamera.fov = 1.6;// 定義相機的默認慣性。這有助于使相機運動平穩freeCamera.inertia = 0.8// 設置相機每個窗口的大小freeCamera.viewport = new BABYLON.Viewport(0, 0, 1, 1);

3.2 弧形旋轉相機(ArcRotateCamera)

在這里插入圖片描述

  • 特點:圍繞目標點旋轉、縮放,適合展示物體。
  • 代碼創建
  const arcRotatecamera = new BABYLON.ArcRotateCamera("arcCam", alpha, beta, radius, // 初始角度(弧度)、半徑target, // 目標點(Vector3)scene);arcRotatecamera.attachControl(canvas, true);
  • 其他相機配置參數
    // 最大移動距離arcRotatecamera.upperRadiusLimit = 50000;// 最小移動距離arcRotatecamera.lowerRadiusLimit = 10000;// 角度靈敏度XarcRotatecamera.angularSensibilityX = 5000;// 角度靈敏度YarcRotatecamera.angularSensibilityY = 5000;// 平移靈敏度arcRotatecamera.panningSensibility = 8000;// Beta角上限arcRotatecamera.upperBetaLimit = 0;// Beta角上限arcRotatecamera.lowerBetaLimit = 0;// 縱軸最大角度,限制攝影機在場景中的移動arcRotatecamera.upperAlphaLimit = 0;// 縱軸最小角度arcRotatecamera.lowerAlphaLimit = 0;// 允許上下顛倒arcRotatecamera.allowUpsideDown = false;// 滾輪精度arcRotatecamera.wheelPrecision = 0.01;// 指針捏合精度arcRotatecamera.pinchPrecision = 0.01;// 使用自然捏縮放arcRotatecamera.useNaturalPinchZoom = false;// 廣角arcRotatecamera.fov = 0.5;// 照相機渲染的最大距離arcRotatecamera.maxZ = 100000;// 照相機渲染的最小距離  太小會閃面arcRotatecamera.minZ = 5;// 讓視圖相機傾斜一點角度arcRotatecamera.alpha = 0;arcRotatecamera.beta = 0;// 設置相機每個窗口的大小arcRotatecamera.viewport = new BABYLON.Viewport(0, 0, 1, 1);

在這里插入圖片描述
這里將 弧形旋轉相機自由相機 做對比,對于同一個場景,可見 自由相機 對場景有拉伸效果,甚至對場景的顯示效果都有影響。
因此,選擇適合自己的相機格外重要。

  • 關鍵參數
    • 限制旋轉角度camera.lowerBetaLimit = 0.1; camera.upperBetaLimit = Math.PI/2
    • 限制縮放范圍camera.lowerRadiusLimit = 5; camera.upRadiusLimit = 20
  • 交互優化
    • 啟用慣性效果:camera.inertia = 0.9(拖拽后平滑停止)。

3.3 跟隨相機(FollowCamera)

  • 特點:跟隨某個物體移動,適合角色扮演游戲。
  • 代碼創建
  const camera = new BABYLON.FollowCamera("followCam", new BABYLON.Vector3(0, 5, -10), // 初始位置scene);camera.radius = 10; // 跟隨距離camera.heightOffset = 2; // 垂直偏移camera.lockedTarget = playerMesh; // 綁定目標物體

3.4 其他相機類型(快速概覽)

  • 第一人稱相機(UniversalCamera):針對移動端優化的自由相機。
  • VR 設備相機(WebXRCamera):通過 WebXR 支持 VR 頭顯。

4. 視角交互實戰技巧

4.1 多相機切換

  • 代碼示例
  const camera1 = new BABYLON.FreeCamera(...);const camera2 = new BABYLON.ArcRotateCamera(...);scene.activeCamera = camera1; // 切換活動相機

4.2 自定義輸入控制

  • 覆蓋默認按鍵事件
  camera.keysUp = [87];    // W 鍵前進camera.keysDown = [83];  // S 鍵后退camera.keysLeft = [65];  // A 鍵左移camera.keysRight = [68]; // D 鍵右移
  • 添加鼠標滾輪縮放(適用于 ArcRotateCamera):
  camera.wheelPrecision = 50; // 滾輪靈敏度

4.3 相機動畫與過渡

  • 平滑移動相機到新位置
  BABYLON.Animation.CreateAndStartAnimation("camMove", camera, "position",30, 120, // 幀率、總幀數camera.position, // 起始位置new BABYLON.Vector3(10, 5, 0), // 目標位置BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT);

5. 相機性能優化與調試

5.1 視錐剔除(Frustum Culling)

  • 原理:只渲染相機視野內的物體。
  • Babylon.js 默認啟用,可通過 mesh.isVisible = false 手動控制。

5.2 避免過度繪制

  • 調整 maxZ 值,減少遠處物體渲染。

5.3 使用調試工具

  • 顯示相機視錐
  camera.showFrustum = true; // 顯示視錐線框
  • 實時調試參數:通過 scene.debugLayer 調整相機屬性。

6. 實戰任務

任務 1:構建可切換的相機系統

  • 場景中放置兩個相機:自由相機(默認)和弧形旋轉相機。
  • 按空格鍵切換相機,并添加過渡動畫。

我這里添加了兩個按鈕,用來切換相機,其中使用 弧形旋轉相機 ArcRotateCamera 模擬了上帝視角。

在這里插入圖片描述
在這里插入圖片描述

任務 2:實現“物體聚焦”功能

  • 點擊場景中的物體,弧形旋轉相機自動對準該物體并調整距離。
  mesh.actionManager = new BABYLON.ActionManager(scene);mesh.actionManager.registerAction(new BABYLON.ExecuteCodeAction(BABYLON.ActionManager.OnPickTrigger,() => {arcCamera.setTarget(mesh.position);arcCamera.radius = mesh.getBoundingInfo().diagonalLength * 2;}));

7. 常見問題解答

  • Q1:相機看不到物體?
    • 檢查相機位置與目標點是否在物體附近。
    • 確認物體的位置未被其他物體遮擋。
  • Q2:移動端觸控不靈敏?
    • 調整 angularSensibilitywheelPrecision
    • 使用 UniversalCamera 替代 FreeCamera

8. 總結與下一章預告

8.1 關鍵知識點回顧

  • 自由相機、弧形旋轉相機的適用場景與控制優化。
  • 多相機切換與自定義交互邏輯。

8.2 下一章預告

  • 《燈光與陰影:讓場景栩栩如生的關鍵》:學習點光源、方向光與陰影渲染技術。

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

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

相關文章

【Python】普通方法、類方法和靜態方法的區分

Python 中普通方法、類方法和靜態方法的區分 下面我將從多個維度對這三種方法進行詳細對比,并通過示例說明它們的使用場景和區別。 1. 核心區別總結 特性普通方法(實例方法)類方法(classmethod)靜態方法(staticmethod)定義裝飾器無classmethodstaticmethod第一個…

geoserver發布arcgis瓦片地圖服務(最新版本)

第一步:下載geoserver服務,進入bin目錄啟動 需要提前安裝好JDK環境,1.8及以上版本 安裝完成,頁面訪問端口,進入控制臺界面,默認用戶名密碼admin/geoserver 第二步:下載地圖 破解版全能電子地圖下載器&…

Linux服務之lvs集群與dr模式部署

目錄 一.lvs相關概述 1.lvs集群的工作模式 2.lvs調度算法 3.ipvsadm工具 二.DR模式部署 一.lvs相關概述 1.lvs集群的工作模式 lvs-nat:修改請求報文的目標IP,多目標IP的DNAT lvs-dr:操縱封裝新的MAC地址(直接路由)lvs-tu…

OFCMS代碼審計-freemaker注入sql注入xxexss文件上傳

環境搭建 下載地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入&#xff08;freemaker) FreeMarker模板注入實現遠程命令執行 - Eleven_Liu - 博客園 在admin中找到這個 發現請求的是這個 找到他 <#assign value"f…

一鍵部署NSFW檢測模型:快速識別并過濾敏感圖片內容

以下是對nsfw_detector的簡單介紹&#xff1a; nsfw_detector是一個 NSFW 內容檢測器&#xff0c;支持快速docker私有部署&#xff0c;提供API服務低資源消耗&#xff0c;2GB內存即可運行該模型&#xff0c;多核CPU自動調度加速推理 - 可以識別多種文件類型&#xff1a;圖片、…

【Redis】緩存穿透、緩存雪崩、緩存擊穿

1.緩存穿透 是指客戶端請求的數據在緩存中和數據庫中都不存在&#xff0c;這樣緩存永遠不會生效&#xff0c;導致請求直接穿透緩存到達數據庫&#xff0c;給數據庫帶來壓力的情況。 常見的解決方案有兩種&#xff1a; 緩存空對象&#xff1a;實現簡單&#xff0c;維護方便&am…

【C】初階數據結構15 -- 計數排序與穩定性分析

本文主要講解七大排序算法之外的另一種排序算法 -- 計數排序 目錄 1 計數排序 1&#xff09; 算法思想 2&#xff09; 代碼 3&#xff09; 時間復雜度與空間復雜度分析 &#xff08;1&#xff09; 時間復雜度 &#xff08;2&#xff09; 空間復雜度 4&#xff09; 計…

mysql的一個缺點

最近再移植一個從oracle轉mysql的項目&#xff0c;喜提一個報錯&#xff1a; You cant specify target table A016 for update in FROM clause 對應的程序代碼&#xff1a; public void setCurrent(String setId, String pk, String userId) throws SysException {String[]…

Ubuntu 上安裝 FTP 服務、開放指定端口并創建用戶

一、安裝 FTP 服務&#xff08;vsftpd&#xff09; sudo apt update sudo apt install vsftpd -y二、修改 vsftpd 配置&#xff0c;使用 21000 端口 編輯配置文件&#xff1a; sudo nano /etc/vsftpd.conf修改或添加以下配置&#xff1a; 使用以下配置文件需要修改的地方:l…

用自寫的jQuery庫+Ajax實現了省市聯動

1. 省市聯動&#xff1a;在網頁上&#xff0c;選擇對應的省份之后&#xff0c;動態的關聯出該省份對應的市。選擇對應的市之后&#xff0c;動態地關聯出城市對應的區。 2. 設計數據庫表 t_area &#xff08;區域表&#xff09; id(PK-自增) code name pcode ------------…

【行為型之迭代器模式】游戲開發實戰——Unity高效集合遍歷與場景管理的架構精髓

文章目錄 &#x1f504; 迭代器模式&#xff08;Iterator Pattern&#xff09;深度解析一、模式本質與核心價值二、經典UML結構三、Unity實戰代碼&#xff08;背包系統遍歷&#xff09;1. 定義迭代器與聚合接口2. 實現具體聚合類&#xff08;背包物品集合&#xff09;3. 實現具…

18前端項目----Vue項目收尾優化|重要知識

收尾/知識點匯總 項目收尾二級路由未登錄全局路由守衛路由獨享守衛圖片懶加載路由懶加載打包上線 重要知識點匯總組件通信方式1. props2. 自定義事件3. 全局事件總線4. 訂閱與發布pubsub5. Vuex6. 插槽 sync修飾符attrs和listeners屬性children和parent屬性mixin混入作用域插槽…

【Linux】基礎指令(Ⅱ)

目錄 1. mv指令 2. cat指令 3.echo指令 補&#xff1a;輸出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 時間戳&#xff1a; 8. cal指令 9. alias指令 10.grep指令 1. mv指令 語法&#xff1a;mv [選項]... 源文件/目錄 目標文件/目錄 …

docker及docker-compose安裝及使用

docker compose &#x1f517;官網地址 一、為什么要使用docker compose 1. 簡化管理 ? 通過一個 YAML 文件定義和管理多容器應用。 ? 簡化服務間的編排與協調&#xff0c;方便環境的管理與復制。 2. 提升協作效率 ? 配置文件易于共享&#xff0c;便于開發、運維等團隊協…

JVM學習專題(二)內存模型深度剖析

目錄 1.JVM結構體系 ?編輯 2.跨平臺特性 3.JVM整體結構及內存模型 1.棧內存 1、棧幀&#xff1a; 1.局部變量表 2.操作數棧 3.動態鏈接 4.方法出口 2、創建對象 2.程序計數器&#xff1a; 3.方法區 ?4.堆 5.本地方法區 6.總結 1.JVM結構體系 JDK、JRE 和 JVM…

Flink之Table API

Apache Flink 的 Table API 是 Flink 提供的一種高級抽象&#xff0c;用于以聲明式方式處理批處理和流處理數據。它是基于關系模型的 API&#xff0c;用戶可以像編寫 SQL 一樣&#xff0c;以簡潔、類型安全的方式編寫數據處理邏輯。 一、基本概念 1. 什么是 Table API&#xf…

基于Vue3.0的高德地圖api教程005:實現繪制線并編輯功能

文章目錄 6、繪制多段線6.1 繪制多段線6.1.1 開啟繪制功能6.1.2 雙擊完成繪制6.1.3 保存到數據庫6.2 修改多段線6.2.1 點擊線,進入編輯模式6.2.2 編輯線6.3 完整代碼6、繪制多段線 6.1 繪制多段線 6.1.1 開啟繪制功能 實現代碼: const changeSwitchDrawPolyline = ()=>…

“redis 目標計算機積極拒絕,無法連接” 解決方法,每次開機啟動redis

如果遇到以上問題 先打開“服務” 找到App Readiness 右擊-啟動 以管理員身份運行cmd&#xff0c;跳轉到 安裝redis的目錄 運行&#xff1a;redis-server.exe redis.windows.conf 以管理員身份打開另一cmd窗口&#xff0c;跳轉到安裝redis的目錄 運行&#xff1a;redis-…

Java 大視界——Java 大數據在智慧交通智能停車誘導系統中的數據融合與實時更新

面對城市停車資源錯配導致的30%以上交通擁堵問題&#xff0c;本文以某新一線城市智慧交通項目為藍本&#xff0c;深度解析Java大數據技術如何實現多源停車數據融合、動態路徑規劃與誘導策略優化。通過構建“感知-計算-決策”全鏈路系統&#xff0c;實現車位狀態更新延遲<200…

牛客周賽 Round 92(再現京津冀藍橋杯???)

1. 小紅的簽到題 現在小紅希望你寫出一個長度為 nnn 的、使用了下劃線命名法命名的變量。為了顯出特征&#xff0c;請保證該變量至少由兩個單詞組成。 輸入描述: 輸入一個正整數 n(3≦n≦100)&#xff0c;代表需要構造的變量長度。 輸出描述: 輸出一個長度為 n 的字符串&#x…