成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Three.Js 實現 360 度全景瀏覽的簡單方式

開發 前端
一般我們拍照都是拍一個方向,而全景圖是拍上下左右前后 6 個方向,360 度,這樣能夠立體的記錄所在的場景。

[[438455]]

什么是全景圖?

一般我們拍照都是拍一個方向,而全景圖是拍上下左右前后 6 個方向,360 度,這樣能夠立體的記錄所在的場景。

那全景圖怎么瀏覽呢?

全景圖拍的是六個方向的圖,放在一個平面看會很別扭,所以會有專門的瀏覽的工具,根據視角的改變來切換看到的內容,這樣就能 360 度的還原拍照的場景。

用 Three.js 做這樣的一個全景圖瀏覽工具,是再簡單不過的事情,只需要幾行代碼,但卻很有用。

那我們就來學一下 Three.js 怎么做全景圖瀏覽吧。

Three.js 基礎回顧

我們簡單回顧下 Three.js 的基礎:

Three.js 是通過場景 Scene 來管理 3D 場景中的各種物體的,有一個三維坐標系,每個物體放在不同的位置,然后在某個位置放置相機,來觀察 Scene 中的各種物體,看到的內容就是二維的,通過渲染器 Renderer 渲染出來就行。這就是 Three.js 的 3D 場景的創建和渲染成 2D 的流程。

簡單回顧了下基礎,那全景圖改怎么瀏覽呢?

全景圖瀏覽的原理

全景圖是六個方向的照片,我們可以在 3D 的場景中放一個立方體,六個面貼上不同方向的圖,相機放在其中,轉動相機就可以看到不同方向的內容。這也是為什么全景圖瀏覽也叫天空盒,因為就是通過立方體貼圖的方式實現的。

當然,也可以用球體來做,直接貼上一個大的全景圖,相機放在中間,轉動相機也可以看到不同方向的內容。

那這么說做全景圖瀏覽需要先創建個立方體或者球體嘍?

其實不用,場景 Scene 是可以設置背景的紋理的,我們可以設置成立方體紋理 CubeTexture,也就是 6 個面的圖片,這樣轉動相機,就能看到場景 Scene 的不同方向的內容。根本不用單獨創建立方體或球體。

設置個紋理也就幾行代碼的事情,我們來寫下代碼。

Three.js 實現全景圖瀏覽

我們創建 3D 場景 Scene:

  1. const scene = new THREE.Scene(); 

然后設置它的背景,用立方體的紋理來設置,需要分別指定左右上下前后的 6 個方向的圖:

  1. let urls = [ 
  2.     './img/home.left.jpg'
  3.     './img/home.right.jpg'
  4.     './img/home.top.jpg'
  5.     './img/home.bottom.jpg'
  6.     './img/home.front.jpg'
  7.     './img/home.back.jpg' 
  8. ]; 
  9. let cubeTexture = new THREE.CubeTextureLoader().load(urls); 
  10. scene.background = cubeTexture; 

這樣整個背景就是一個全景圖,就這么幾行代碼。

當然,我們還要設置下相機位置,這里用透視相機就行,它的特點是從一個點去看 3D 場景,看到的內容是近大遠小的。

  1. const width = window.innerWidth; 
  2. const height = window.innerHeight; 
  3. const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000); 
  4.  
  5. camera.position.set(0,0, 100); 
  6. camera.lookAt(scene.position); 

需要設置看到的角度,這里設置了 45 度,看到內容的寬高比,這里用窗口寬高比,再就是遠近范圍,這個設置范圍大一點就行。

相機位置設置在了 z 軸 100 的位置,這樣看 z 為 0 的位置就是從正面去看的,可以感受下這個看的方向。

有了 3D 的 Scene,設置好了相機,就可以用 Renderer 把它渲染出來了。

  1. const renderer = new THREE.WebGLRenderer(); 
  2. renderer.setSize(width, height); 
  3. document.body.appendChild(renderer.domElement) 
  4.  
  5. function render() { 
  6.     renderer.render(scene, camera); 
  7.     requestAnimationFrame(render); 
  8.  
  9. render(); 

我們用 requestAnimationFrame 來一幀幀的調用 renderer 渲染。

當然,還要加上鼠標控制,可以通過鼠標的拖動方向來改變相機看到的角度,這個用 Three.js 提供的 Controls 就行,不用自己寫。

我們需要 360 度的看,用 OrbitsControls 來做交互就行,他叫軌道控制器,也就是衛星繞地球的那種軌道的感覺。

  1. const controls = new THREE.OrbitControls(camera); 

OrbitControls 參數是 camera,因為它就是通過改變 camera 位置實現的。

至此,我們就實現了全景圖的瀏覽。來看下效果:

全部代碼上傳了 github:https://github.com/QuarkGluonPlasma/threejs-exercize

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>全景圖</title> 
  6.     <style> 
  7.         body { 
  8.             margin: 0; 
  9.             overflow: hidden; 
  10.         } 
  11.     </style> 
  12.     <script src="./js/three.js"></script> 
  13.     <script src="./js/OrbitControls.js"></script> 
  14. </head> 
  15. <body> 
  16. <script> 
  17.     const width = window.innerWidth; 
  18.     const height = window.innerHeight; 
  19.     const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000); 
  20.  
  21.     const scene = new THREE.Scene(); 
  22.     const renderer = new THREE.WebGLRenderer(); 
  23.  
  24.     camera.position.set(0,0, 100); 
  25.     camera.lookAt(scene.position); 
  26.  
  27.     renderer.setSize(width, height); 
  28.     document.body.appendChild(renderer.domElement) 
  29.  
  30.     function create() { 
  31.         let urls = [ 
  32.             './img/home.left.jpg'
  33.             './img/home.right.jpg'
  34.             './img/home.top.jpg'
  35.             './img/home.bottom.jpg'
  36.             './img/home.front.jpg'
  37.             './img/home.back.jpg' 
  38.         ]; 
  39.         let cubeTexture = new THREE.CubeTextureLoader().load(urls); 
  40.         scene.background = cubeTexture; 
  41.     } 
  42.  
  43.     function render() { 
  44.         renderer.render(scene, camera); 
  45.         requestAnimationFrame(render); 
  46.     } 
  47.  
  48.     create(); 
  49.     render(); 
  50.     const controls = new THREE.OrbitControls(camera); 
  51.  
  52. </script> 
  53. </body> 
  54. </html> 

 

 

 

 

 

 

 

 

 

 

 

 

 

一共也沒幾行代碼。

我們來做下小結:

全景圖瀏覽不用創建立方體或者球體,直接給場景(Scene)設置立方體紋理(CubeTexture)的背景就可以了,貼上 6 張圖。之后設置下相機(Camera)位置,用渲染器(Renderer)一幀幀渲染出來,還要加上軌道控制器來支持拖拽改變相機位置。

主要的邏輯講完了,但還有一個支線劇情要講:6 張圖是怎么來的?

全景圖轉 6 張貼圖

全景圖網上能搜到很多,我們手機的相機也都能拍全景圖,但是它是一張完整的大圖,而立方體紋理要加載 6 張不同方向的圖,如果把全景圖裁切成 6 張圖呢?

這個有工具來做,我是用的 PTGui (試用版)來做的裁切。

官網有下載地址:https://www.ptgui.com/download.html?ps=main

點擊 tools 里面的 convert to cube faces,會打開一個窗口,然后選擇一個全景圖,設置導出的格式,點導出就行了,就能生成上下左右前后的六個方向的圖。

總結

一般的照片只是一個方向的畫面,而全景圖是上下左右前后 360 度的畫面,它能立體的記錄拍照位置的場景。

全景圖需要專門的工具來瀏覽,我們可以用 Three.js 來實現。原理就是通過立方體貼 6 張圖(也叫天空盒),或者通過球體貼一張大圖,把相機設置在中間,轉動相機就可以看到不同方向的畫面。

其實實現全景圖瀏覽更簡單的方式是直接給 Scene 設置立方體紋理,不用再單獨創建立方體或球體,用 CubeTextureLoader 加載六張圖,設置到 Scene 的背景上就行。

還要設置下相機,加上軌道控制器,通過渲染器一幀幀的渲染出來,這樣就實現了全景圖瀏覽的功能。

至于那六張貼圖,通過 PTGui 或者類似的工具就可以裁切出來。

全景圖瀏覽一共也沒幾行代碼,但是這個功能還是很有用的。如果你會拍全景圖,那就更棒了,可以把生活中一些場景立體的記錄下來,自己寫一個工具來瀏覽。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2022-07-15 13:09:33

Three.js前端

2019-11-29 09:30:37

Three.js3D前端

2017-05-08 11:41:37

WebGLThree.js

2021-11-22 06:14:45

Three.js3D 渲染花瓣雨

2024-07-18 06:58:36

2021-04-23 16:40:49

Three.js前端代碼

2025-05-15 08:45:00

開源前端手勢

2021-12-14 11:44:37

可視化Three.js 信息

2022-01-16 19:23:25

Three.js粒子動畫群星送福

2025-03-13 10:54:18

2021-11-27 10:42:01

Three.js3D可視化AudioContex

2022-05-27 14:55:34

canvas畫布鴻蒙

2025-06-17 08:15:00

VTK.jsThree.js3D

2011-02-17 11:19:24

Linux Live

2010-08-23 17:57:43

交換機配置dhcp

2022-03-07 09:20:00

JavaScripThree.jsNFT

2022-07-08 10:39:09

Three.js元宇宙VR

2012-10-17 14:25:29

HTML5WebGLWeb

2019-09-19 14:44:18

LinuxWindows操作系統

2016-09-21 14:24:37

3D全景瀏覽器瀏覽器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩高清一区 | 欧美日韩中文字幕在线 | 91精品国产91久久久久久 | 日韩成人免费视频 | 毛片在线看片 | 99热免费在线| 成人av网站在线观看 | 午夜精品 | 中文字幕人成乱码在线观看 | 日韩尤物视频 | 精品久久久久久亚洲精品 | 精品久久久久久久久亚洲 | 精品久久久一区 | 久久精品日 | 欧美成人激情 | 精品日本久久久久久久久久 | 性高朝久久久久久久3小时 av一区二区三区四区 | 国产日韩欧美在线观看 | 成人欧美一区二区三区黑人孕妇 | 国产精品一区二区三级 | 免费看黄视频网站 | 亚洲欧洲在线视频 | 老司机午夜性大片 | 中文成人在线 | 久久久久亚洲 | 欧美激情国产日韩精品一区18 | 久久尤物免费一区二区三区 | 看片91 | 久久久久九九九女人毛片 | 色久电影 | 中文字幕第7页 | 成人免费视频一区 | 久久不射网 | 日本免费一区二区三区四区 | 国产精品综合网 | 91色网站| 国产精彩视频在线观看 | 国产精品久久一区二区三区 | 亚洲在线高清 | 亚洲喷水| 中文字幕一区二区三区乱码图片 |