計算機圖形學:(三)MVP變換擴展

Three.js

?????????WebGL允許把JavaScript和OpenGL 結合在一起運用,但使用WebGL原生的API來寫3D程序非常的復雜,同時需要相對較多的數學知識,對于前端開發者來說學習成本非常高。

????????Three.js是基于webGL的封裝的一個易于使用且輕量級的3D庫,Three.js對WebGL提供的接口進行了非常好的封裝,簡化了很多細節,大大降低了學習成本,極大地提高了性能,功能也非常強大。

????????官網:Three.js – JavaScript 3D Library (threejs.org)

? ? # 下載

? ? GitHub:GitHub - mrdoob/three.js: JavaScript 3D Library.?

? ? # 基礎

????????基于Three.js寫頁面的三要素是:場景(Scene)相機(Camera)渲染器(Renderer)

  • 場景是一個容器,主要用于保存、跟蹤所要渲染的物體和使用的光源
  • 攝像機對象,攝像機決定了能夠在場景看到什么。
  • 渲染器對象,該對象會基于攝像機的角度來計算場景對象在瀏覽器中會渲染成什么樣子。

????????將一個Scene對象Camera對象傳遞給一個Renderer,它將在相機視錐體內的3D場景的部分作為2D圖像呈現(繪制)到Canvas。?

????????SceneGraph是一個樹狀結構,由各種對象組成,如一個Scene對象、多個Mesh對象、Light對象、Group、Object3D和Camera對象

????????在圖中,Camera對象有一半是不在SceneGraph中的。這是為了表示在three.js中,不像其他對象,Camera不需要在場景中才能起作用。

? ? 每個添加到Three.js場景的對象,甚至包括THREE.Scene本身,都是繼承自一個名為THREE.Object3D的對象。

? ? ? ? # 入門

? ? ? ? 直接找了其他博主的教程:https://blog.csdn.net/sd1sd2/category_12898367.html

示例一:初始化

? ? ? ? 這里我們參照計算機圖形學:(二)MVP變換示例用Three.js初始化一個立方體,相機看向它:?

<html><head><title>視圖變換基礎案例</title><style>body {margin: 0;overflow: hidden;}canvas {width: 100%;height: 100%;}</style>
</head><body><script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r83/three.min.js"></script><script>// 【0】創建一個場景var scene = new THREE.Scene();// 【1】立方體幾何var geometry = new THREE.BoxGeometry(4, 4, 2);// 渲染的基礎材料var materialBasic = new THREE.MeshBasicMaterial({color: 0xffffff, wireframe: true });// 這是一種簡單的材質,根據物體表面的法向量計算顏色var materialNormal = new THREE.MeshNormalMaterial();// 創建多材料對象var cube = THREE.SceneUtils.createMultiMaterialObject(geometry, [materialBasic,materialNormal]);// 位置上添加渲染的東西scene.add(cube); // 默認情況下,使用 scene.add() 會將物體加載到(0,0,0) // 【2】做一個相機模擬真實人的視角// 注意,在three.js中的大多數角度都是弧度,但由于某些原因,透視相機需要角度。var camera = new THREE.PerspectiveCamera(30, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.set(0, 0, 20);// 觀察位置camera.lookAt(cube.position);// 【3】渲染器var renderer = new THREE.WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);// 【4】添加聚光燈并且添加到頁面當中var spotLight = new THREE.SpotLight(0xffffff);spotLight.position.set(0, 20, 20);spotLight.intensity = 5;scene.add(spotLight);// 【5】添加三維坐標系var axes = new THREE.AxisHelper(6);scene.add(axes);// 最終的渲染renderer.render(scene, camera);</script>
</body></html>

示例二:繞點旋轉

① 以固定角度旋轉相機

????????同計算機圖形學:(二)MVP變換示例一樣,我們需要通過計算相機旋轉后的新位置來更新視圖矩陣,從而達到讓相機以一個固定的旋轉度數繞立方體中心旋轉的效果:

let angle = 0;
let radius = camera.position.z;
const rotationValue = 0.01;var tick = function () {angle += rotationValue;// 更新相機位置(圓形路徑)camera.position.x = radius * Math.sin(angle);camera.position.z = radius * Math.cos(angle);camera.lookAt(cube.position); // 確保相機一直看向物體// 場景改變時,重新執行渲染操作渲染三維場景renderer.render(scene, camera);requestAnimationFrame(tick);
};
tick();

????????軌道控制器(OrbitControls)是 Three.js 中的一個常用工具,用于控制相機的運動。如果目標是實現“相機繞物體旋轉”,直接使用?OrbitControls更簡單:

? ? ? ? 注:這里為了導入OrbitControls模塊,變更了有些API(下述代碼刪減了未做修改的部分)。

<script type="importmap">{"imports": {"three": "https://unpkg.com/three@0.148.0/build/three.module.js","three/examples/jsm/controls/OrbitControls": "https://unpkg.com/three@0.148.0/examples/jsm/controls/OrbitControls.js","three/examples/jsm/utils/SceneUtils": "https://unpkg.com/three@0.148.0/examples/jsm/utils/SceneUtils.js"}}
</script><script type="module">import * as THREE from 'three';import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';import { createMultiMaterialObject } from 'three/examples/jsm/utils/SceneUtils';// 創建多材料對象var cube = createMultiMaterialObject(geometry, [ // 修改前:THREE.SceneUtils.createMultiMaterialObjectmaterialBasic,materialNormal]);// 添加三維坐標系var axes = new THREE.AxesHelper(6); // 修改前:THREE.AxisHelper// 添加軌道控制器const controls = new OrbitControls(camera, renderer.domElement);controls.target.set(cube.position.x, cube.position.y, cube.position.z); // 設置目標點為物體中心controls.autoRotate = true;   // 啟用自動旋轉controls.autoRotateSpeed = 1.0; // 旋轉速度var tick = function () {controls.update();renderer.render(scene, camera);requestAnimationFrame(tick);};tick();</script>

????????其他:當對相機繞Y軸進行旋轉時,看起來會是“物體繞相機旋轉”:

var tick = function () {camera.rotateY(0.01);renderer.render(scene, camera);requestAnimationFrame(tick);
};
tick();

② 鼠標拖拽旋轉相機

????????OrbitControls 會監聽鼠標事件(如鼠標移動、鼠標滾輪滾動、鼠標按鍵點擊等),根據用戶的操作實時計算相機應該移動到的新位置和角度,然后更新相機的相關屬性,從而改變相機在 3D 場景中的視角。

const controls = new OrbitControls(camera, renderer.domElement);// 監聽控制器,每次拖動后重新渲染畫面
controls.addEventListener('change', function () {renderer.render(scene, camera); //執行渲染操作
});

? ? ? ? 比起之前做的簡陋版,OrbitControls實現的效果更加絲滑了:?

? ? ? ? 想知道其具體實現可以直接看源碼:THREE:controls/OrbitControls.js(部分源碼解讀:https://zhuanlan.zhihu.com/p/447471816),以及也可以手寫控制器,如three.js鼠標控制物體旋轉

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

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

相關文章

MySQL數據庫操作合集

一、SQL通用語法 ①SQL語句可以單行或多行書寫&#xff0c;以分號結尾。 ②SQL語句可以使用空格/縮進來增強語句可讀性。 ③MySQL數據庫的SQL語句不區分大小寫&#xff0c;關鍵字建議使用大寫。 ④注釋&#xff1a; 單行注釋&#xff1a; -- 注釋內容 或 # 注釋內容&#…

傳統工程項目管理與業財一體化管理的區別?

在工程項目管理領域&#xff0c;傳統管理模式與新興的業財一體化管理模式正在形成鮮明對比。隨著數字化轉型的加速&#xff0c;工程行業對高效、透明、協同的管理需求日益迫切。傳統工程項目管理依賴人工操作、分散系統和分模塊管理&#xff0c;難以應對復雜項目的全生命周期需…

敦煌網測評從環境搭建到風控應對,精細化運營打造安全測評體系

自養號測評&#xff0c;搶占流量為快速提升產品權重和銷量&#xff0c;很多賣家常采用自己養號補單測評的方式&#xff0c;技術搭建需要很多要素 一、硬件參數的關聯性 在我們使用設備進行注冊或操作賬號的過程中&#xff0c;系統會記錄下大量的系統與網絡參數&#xff0c;其中…

redis Pub/Sub 簡介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)

Redis Pub/Sub 簡介&#xff1a;PUBLISH、SUBSCRIBE、PSUBSCRIBE Redis Pub/Sub 是一種強大的消息傳遞范例&#xff0c;可在應用程序的不同部分之間實現實時通信。它是構建可擴展和響應式系統的基石&#xff0c;允許組件在沒有直接依賴的情況下進行交互。本章將全面介紹 Redis…

JavaSE核心知識點03高級特性03-01(集合框架)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 JavaSE核心知識點03高級特性03-01&#xff0…

日志分析-IIS日志分析

環境準備 https://xj.edisec.net/challenges/115 題目要求 windows系統中才有的IIS服務 既然是windows平臺&#xff0c;當然需要rdp登錄&#xff0c;在ssh登錄失敗 解題過程 phpstudy--2018站點日志.(.log文件)所在路徑&#xff0c;提供絕對路徑 Windows服務的日志一般有固定…

一、web安全基礎入門

1、Windows命令 文件和目錄操作 dir&#xff1a;列出當前目錄下的文件和子目錄。cd&#xff1a;切換目錄&#xff0c;例如 cd C:\Users 切換到C盤的Users目錄。md 或 mkdir&#xff1a;創建新目錄&#xff0c;如 md testdir。rd 或 rmdir&#xff1a;刪除空目錄&#xff0c;例…

動態規劃應用場景 + 代表題目清單(模板加上套路加上題單)

1. 序列型DP&#xff08;Sequence DP&#xff09; ? 應用場景 單個或多個序列&#xff08;數組/字符串&#xff09;&#xff0c;求最優子結構。 常見問題&#xff1a;最長遞增子序列、最長公共子序列、回文子序列。 &#x1f9e0; 套路總結 單序列&#xff1a;dp[i] max(…

Linux iSCSI存儲共享實驗指南

實驗介紹 1、在Linux平臺上通過iSCSI協議實現IP-SAN存儲共享 2、掌握存儲導出(export)和存儲導入(import)的配置方法 3、學習iSCSI存儲的發現、連接、斷開和管理操作 1、實驗環境 兩臺同網段的Linux虛擬機&#xff08;無需物理交換機&#xff09; 操作系統&#xff1a;Lin…

從 Docker 到 runC

從 Docker 到 runC:容器底層原理詳解 目錄 1. Docker 與 runC 的關系 2. Docker 的核心組件 3. runC 的核心功能 4. 實戰示例:從 Docker 到 runC 4.1 示例場景:運行一個簡單容器 4.2 Docker 底層調用 runC 的流程 4.3 查看 runC 的調用 4.4 直接調用 runC 創建容器 …

使用Python在PowerPoint中插入形狀(Shape)

在進行演示文稿設計時&#xff0c;形狀&#xff08;Shape&#xff09;不僅可以增強視覺效果&#xff0c;還可以用于展示流程圖、標注、數據圖示等。借助Python&#xff0c;我們可以通過代碼快速批量地在PPT中添加各種形狀&#xff0c;提升設計效率。本文將介紹如何使用Python向…

Windows系統下MySQL 8.4.5壓縮包安裝詳細教程

一、MySQL 8.4.5新特性概覽 相較于舊版本&#xff0c;MySQL 8.4.5在性能與功能上實現了顯著提升&#xff1a; 性能優化&#xff1a;官方測試顯示&#xff0c;在高并發場景下&#xff0c;其讀寫性能較5.7版本提升近2倍&#xff0c;尤其在處理熱點數據競爭問題時表現更為出色。…

深度解析Vue項目Webpack打包分包策略 從基礎配置到高級優化,全面掌握性能優化核心技巧

深度解析Vue項目Webpack打包分包策略 從基礎配置到高級優化&#xff0c;全面掌握性能優化核心技巧 一、分包核心價值與基本原理 1.1 為什么需要分包 首屏加載優化&#xff1a;減少主包體積&#xff0c;提升TTI&#xff08;Time to Interactive&#xff09;緩存利用率提升&am…

【昇騰開發者訓練營:Dify大模型部署實戰】MindIE + Dify + DeepSeek + Embedding模型 + Rerank模型

文章目錄 部署 Dify1. Dify 適配 ARM2. 安裝 docker3. 啟動 Dify MindIEDify 實操手冊1. 基礎環境搭建1.1 環境檢查1.2 下載模型權重1.3 獲取MindIE鏡像 2. 啟動容器3. 純模型推理測試3.1 純模型對話測試3.2 性能測試 4. 服務化部署4.1 MindIE 配置4.2 MindIE 服務化4.3 發起測…

塔能高溫冰蓄冷技術:工廠能耗精準節能的創新之路

在工廠的能耗構成中&#xff0c;制冷系統是重要的耗能環節。傳統的水蓄冷和冰蓄冷技術在實際應用中存在一些局限性&#xff0c;難以滿足工廠對節能和成本控制的更高要求。塔能科技的高溫冰蓄冷技術&#xff0c;憑借其獨特的優勢&#xff0c;為工廠能耗精準節能提供了創新的解決…

通過現代數學語言重構《道德經》核心概念體系,形成一個兼具形式化與啟發性的理論框架

以下是對《道德經》的數學轉述嘗試&#xff0c;通過現代數學語言重構其核心概念&#xff0c;形成一個兼具形式化與啟發性的理論框架&#xff1a; 0. 基礎公理體系 定義&#xff1a; 《道德經》是一個動態宇宙模型 U(D,V,Φ)&#xff0c;其中&#xff1a; D 為“道”的無限維…

SQLMesh Typed Macros:讓SQL宏更強大、更安全、更易維護

在SQL開發中&#xff0c;宏&#xff08;Macros&#xff09;是一種強大的工具&#xff0c;可以封裝重復邏輯&#xff0c;提高代碼復用性。然而&#xff0c;傳統的SQL宏往往缺乏類型安全&#xff0c;容易導致運行時錯誤&#xff0c;且難以維護。SQLMesh 引入了 Typed Macros&…

5月23日day34打卡

GPU訓練及類的call方法 知識點回歸&#xff1a; CPU性能的查看&#xff1a;看架構代際、核心數、線程數GPU性能的查看&#xff1a;看顯存、看級別、看架構代際GPU訓練的方法&#xff1a;數據和模型移動到GPU device上類的call方法&#xff1a;為什么定義前向傳播時可以直接寫作…

集群、容器云與裸金屬服務器的全面對比分析

文章目錄 引言 集群 2.1 定義 2.2 特點 2.3 應用場景 容器云 3.1 定義 3.2 核心功能 3.3 應用場景 裸金屬 4.1 定義 4.2 特點 4.3 應用場景 三者的區別 5.1 架構與性能 5.2 管理與運維 5.3 成本與靈活性 總結 1. 引言 在云計算和數據中心領域&#xff0c;50…

Vscode +Keil Assistant編譯報錯處理

Vscode Keil Assistant編譯報錯處理 1.報錯圖片內容 所在位置 行:1 字符: 25 chcp.com 65001 -Command & c:\Users\92170.vscode\extensions\cl.keil-a … ~ 不允許使用與號(&)。& 運算符是為將來使用而保留的&#xff1b;請用雙引號將與號引起來(“&”)&…