国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

這篇具有很好參考價值的文章主要介紹了Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文 gihtub 地址: https://github.com/hua1995116/Fly-Three.js

最近元宇宙的概念很火,并且受到疫情的影響,我們的出行總是受限,電影院也總是關門,但是在家里又沒有看大片的氛圍,這個時候我們就可以通過自己來造一個宇宙,并在 VR 設備(Oculus 、cardboard)中來觀看。

今天我打算用 Three.js 來實現(xiàn)個人 VR 電影展廳,整個過程非常的簡單,哪怕不會編程都可以輕易掌握。

想要頂級的視覺盛宴,最重要的肯定是得要一塊大屏幕,首先我們就先來實現(xiàn)一塊大屏幕。

大屏幕的實現(xiàn)主要有兩種幾何體,一種是 PlaneGeometry 和 BoxGeometry,一個是平面,一個是六面體。為了使得屏幕更加有立體感,我選擇了 BoxGeometry。

老樣子,在添加物體之前,我們先要初始化我們的相機、場景和燈光等一些基礎的元件。

const scene = new THREE.Scene();

// 相機
const camera = new THREE.PerspectiveCamera(
    75,
    sizes.width / sizes.height,
    0.1,
    1000
)
camera.position.x = -5
camera.position.y = 5
camera.position.z = 5
scene.add(camera);

// 添加光照
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5)
scene.add(ambientLight)

const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
directionalLight.position.set(2, 2, -1)

scene.add(directionalLight)

// 控制器
const controls = new OrbitControls(camera, canvas);
scene.add(camera);

然后來寫我們的核心代碼,創(chuàng)建一個 5 * 5 的超薄長方體

const geometry = new THREE.BoxGeometry(5, 5, 0.2);
const cubeMaterial = new THREE.MeshStandardMaterial({
    color: '#ff0000'
});
const cubeMesh = new THREE.Mesh(geometry, cubeMaterial);
scene.add(cubeMesh);

效果如下:

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

然后緊接著加入我們的視頻內容,想要把視頻放入到3d場景中,需要用到兩樣東西,一個是 html 的 video 標簽,另一個是 Three.js 中的視頻紋理 VideoTexture

第一步將視頻標簽放入到 html 中,并設置自定播放以及不讓他顯示在屏幕中。

...
<canvas class="webgl"></canvas>
<video 
  id="video"
  src="./pikachu.mp4"
  playsinline
  webkit-playsinline
  autoplay
  loop
  style="display:none"
  ></video>
...

第二步,獲取到 video 標簽的內容將它傳給 VideoTexture,并且紋理賦給我們的材質。

+const video = document.getElementById( 'video' );
+const texture = new THREE.VideoTexture( video );

const geometry = new THREE.BoxGeometry(5, 5, 0.2);
const cubeMaterial = new THREE.MeshStandardMaterial({
-    color: '#ff0000'
+    map: texture
});
const cubeMesh = new THREE.Mesh(geometry, cubeMaterial);
scene.add(cubeMesh);

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

我們看到皮神明顯被拉伸了,這里就出現(xiàn)了一個問題就是紋理的拉伸。這也很好理解,我們的屏幕是 1 : 1 的,但是我們的視頻卻是 16:9 的。想要解決其實也很容易,要么就是讓我們的屏幕大小更改,要么就是讓我們的視頻紋理渲染的時候更改比例。

第一種方案很簡單

通過修改幾何體的形狀(也及時我們顯示器的比例)

const geometry = new THREE.BoxGeometry(8, 4.5, 0.2);
const cubeMaterial = new THREE.MeshStandardMaterial({
    map: texture
});
const cubeMesh = new THREE.Mesh(geometry, cubeMaterial);
scene.add(cubeMesh);

第二種方案稍微有點復雜,需要知道一定的紋理貼圖相關的知識

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

圖1-1

首先我們先要知道紋理坐標是由 u 和 v 兩個方向組成,并且取值都為 0 - 1。通過在 fragment shader 中,查詢 uv 坐標來獲取每個像素的像素值,從而渲染整個圖。

因此如果紋理圖是一張16:9 的,想要映射到一個長方形的面中,那么紋理圖必要會被拉伸,就像我們上面的視頻一樣,上面的圖為了表現(xiàn)出電視機的厚度所以沒有那么明顯,可以看一下的圖。(第一張比較暗是因為 Three.js 默認貼圖計算了光照,先忽略這一點)

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

我們先來捋一捋,假設我們的圖片的映射是按照 圖1-1,拉伸的情況下 (80,80,0) 映射的是 uv(1,1 ),但是其實我們期望的是點(80, 80 * 9/16, 0) 映射的是 uv(1,1),所以問題變成了像素點位 (80, 80 * 9/16, 0) 的uv值 如何變成 (80, 80, 0) 的uv 值,更加簡單一些就是如何讓 80 * 9 / 16 變成 80,答案顯而易見,就是 讓 80 * 9 / 16 像素點的 v 值 乘以 16 / 9,這樣就能找到了 uv(1,1) 的像素值。然后我們就可以開始寫 shader 了。

// 在頂點著色器傳遞 uv
const vshader = `
varying vec2 vUv;

void main() {
  vUv = uv;

  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
`

// 核心邏輯就是 vec2 uv = vUv * acept; 
const fshader = `
varying vec2 vUv;

uniform sampler2D u_tex;
uniform vec2 acept;

void main()
{
  vec2 uv = vUv * acept;
  vec3 color = vec3(0.3);
  if (uv.x>=0.0 && uv.y>=0.0 && uv.x<1.0 && uv.y<1.0) color = texture2D(u_tex, uv).rgb;
  gl_FragColor = vec4(color, 1.0);
}
`

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

然后我們看到我們畫面已經正常了,但是在整體屏幕的下方,所以還差一點點我們需要將它移動到屏幕的中央。

移動到中央的思路和上面差不多,我們只需要注重邊界點,假設邊界點 C 就是讓 80 * ( 0.5 + 9/16 * 0.5 ) 變成 80 ,很快我們也可能得出算是 C * 16/9 - 16/9 * 0.5 + 0.5 = 80

然后來修改 shader,頂點著色器不用改,我們只需要修改片段著色器。

const fshader = `
varying vec2 vUv;

uniform sampler2D u_tex;
uniform vec2 acept;

void main()
{
  vec2 uv = vec2(0.5) + vUv * acept - acept*0.5;
  vec3 color = vec3(0.0);
  if (uv.x>=0.0 && uv.y>=0.0 && uv.x<1.0 && uv.y<1.0) color = texture2D(u_tex, uv).rgb;
  gl_FragColor = vec4(color, 1.0);
}
`

好了,到現(xiàn)在為止,我們的圖像顯示正常啦~

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

那么 Three.js 中的 textureVideo 到底是如何實現(xiàn)視頻的播放的呢?

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

通過查看源碼(https://github.com/mrdoob/three.js/blob/6e897f9a42d615403dfa812b45663149f2d2db3e/src/textures/VideoTexture.js)源碼非常的少,VideoTexture 繼承了 Texture ,最大的一點就是通過 **requestVideoFrameCallback 這個方法,**我們來看看它的定義,發(fā)現(xiàn) mdn 沒有相關的示例,我們來到了 w3c 規(guī)范中尋找 https://wicg.github.io/video-rvfc/

這個屬性主要是獲取每一幀的圖形,可以通過以下的小 demo 來進行理解

<body>
  <video controls></video>
  <canvas width="640" height="360"></canvas>
  <span id="fps_text"/>
</body>

<script>
  function startDrawing() {
    var video = document.querySelector('video');
    var canvas = document.querySelector('canvas');
    var ctx = canvas.getContext('2d');

    var paint_count = 0;
    var start_time = 0.0;

    var updateCanvas = function(now) {
      if(start_time == 0.0)
        start_time = now;

      ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

      var elapsed = (now - start_time) / 1000.0;
      var fps = (++paint_count / elapsed).toFixed(3);
      document.querySelector('#fps_text').innerText = 'video fps: ' + fps;

      video.requestVideoFrameCallback(updateCanvas);
    }

    video.requestVideoFrameCallback(updateCanvas);

    video.src = "http://example.com/foo.webm"
    video.play()
  }
</script>

通過以上的理解,可以很容易抽象出整個過程,通過 requestVideoFrameCallback 獲取視頻每一幀的畫面,然后用 Texture 去渲染到物體上。

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

然后我們來加入 VR 代碼, Three.js 默認給他們提供了建立 VR 的方法。

// step1 引入 VRButton
import { VRButton } from 'three/examples/jsm/webxr/VRButton.js';
// step2 將 VRButton 創(chuàng)造的dom添加進body 
document.body.appendChild( VRButton.createButton( renderer ) );
// step3 設置開啟 xr
renderer.xr.enabled = true;
// step4 修改更新函數
renderer.setAnimationLoop( function () {
	renderer.render( scene, camera );
} );

由于 iphone 太拉胯不支持 webXR ,特地借了臺安卓機(安卓機需要下載 Google Play、Chrome 、Google VR),添加以上步驟后,就會如下顯示:

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

點擊 ENTER XR 按鈕后,即可進入 VR 場景。

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

然后我們我們可以再花20塊錢就可以買個谷歌眼鏡 cardboard。體驗地址如下:

https://fly-three-js.vercel.app/lesson03/code/index4.html

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴

或者也可以像我一樣買一個 Oculus 然后躺著看大片

Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴
系列其他文章:文章來源地址http://www.zghlxwxcb.cn/news/detail-473498.html

  • Three.js系列: 寫一個第一/三人稱視角小游戲
  • Three.js系列:造個海洋球池來學習物理引擎

到了這里,關于Three.js系列: 在元宇宙看電影,享受 VR 視覺盛宴的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【python小知識】你會用爬蟲嗎?給大家分享幾個爬蟲小程序,看電影、看書、天氣預報、找學校、挖段子、爬微博都可以哦~

    【python小知識】你會用爬蟲嗎?給大家分享幾個爬蟲小程序,看電影、看書、天氣預報、找學校、挖段子、爬微博都可以哦~

    在這篇文章中,我們將分享7個Python爬蟲的小案例,幫助大家更好地學習和了解Python爬蟲的基礎知識。以下是每個案例的簡介和源代碼: 這個案例使用BeautifulSoup庫爬取豆瓣電影Top250的電影名稱、評分和評價人數等信息,并將這些信息保存到CSV文件中。 這個案例使用正則表達式

    2024年01月22日
    瀏覽(29)
  • vue2+three.js實現(xiàn)宇宙(進階版)

    vue2+three.js實現(xiàn)宇宙(進階版)

    2023.9.12今天我學習了vue2+three.js實現(xiàn)一個好看的動態(tài)效果: 首先是安裝: npm install three 相關代碼如下:

    2024年02月09日
    瀏覽(19)
  • Mixlab 在元宇宙盤了塊 “地” 正式進軍元宇宙

    Mixlab 在元宇宙盤了塊 “地” 正式進軍元宇宙

    Mix 「 據 2022-1-19 微軟官方新聞稿 」 微軟(納斯達克股票代碼:MSFT)宣布收購游戲開發(fā)和互動娛樂內容發(fā)行商公司動視暴雪 Activision Blizzard Inc.(ATVI)。微軟以每股 95.00 USD 的價格收購動視暴雪,總收購額達 687 億美元。交易完成后,微軟將成為全球第三大游戲公司,僅次于騰

    2024年02月09日
    瀏覽(28)
  • 區(qū)塊鏈在元宇宙中的作用(二)

    第一,解決數據信任問題 如果一個元宇宙沒有區(qū)塊鏈技術,那么可能會面臨各種各樣的數據信任問題,你的賬號可以被隨時平臺禁封,你的“資產”價值完全受平臺定價和發(fā)行量的影響、你的投訴意見可以被平臺忽視、你的言論可以被平臺屏蔽甚至刪除等等一系列的問題將會

    2024年02月04日
    瀏覽(22)
  • 【元宇宙經濟學】實現(xiàn)DC/EP在元宇宙經濟中的法幣地位

    【元宇宙經濟學】實現(xiàn)DC/EP在元宇宙經濟中的法幣地位

    博主未授權任何人或組織機構轉載博主任何原創(chuàng)文章,感謝各位對原創(chuàng)的支持! 博主鏈接 DC/EP(Digital Currency/Electronic Payment,數字貨幣/電子支付)不但是元宇宙金融體系的基礎,更是整個數字經濟的核心。元宇宙提供了典型的、大規(guī)模的消費級應用場景,這個場景是超越國界的

    2024年01月16日
    瀏覽(29)
  • three.js從入門到精通系列教程003 - three.js透視相機(PerspectiveCamera)

    three.js從入門到精通系列教程003 - three.js透視相機(PerspectiveCamera)

    透視相機(PerspectiveCamera) 它是用來模擬人眼所看到的景象,它也是3D場景的渲染中使用得最普遍的投影模式。呈現(xiàn)的效果,類似眼睛看東西,近大遠小 源碼下載地址: three.js從入門到精通系列教程002 - three.js透視相機(PerspectiveCamera)

    2024年01月19日
    瀏覽(98)
  • three.js從入門到精通系列教程002 - three.js正交相機OrthographicCamera

    three.js從入門到精通系列教程002 - three.js正交相機OrthographicCamera

    正投影相機-OrthographicCamera,通過正投影相機渲染出來的物體的尺寸都一樣,不會因為觀察距離的遠近而出現(xiàn)近大遠小的情況 源碼下載地址 three.js從入門到精通系列教程002 - three.js正交相機OrthographicCamera

    2024年01月20日
    瀏覽(91)
  • P2E游戲《西游降魔》站在元宇宙風口 打造高效、完整且可持續(xù)的GameFi2.0體系

    P2E游戲《西游降魔》站在元宇宙風口 打造高效、完整且可持續(xù)的GameFi2.0體系

    引言:當人類大步邁入元宇宙時代,鏈上P2E游戲《西游降魔》正與元宇宙生態(tài)相伴相生,帶領人們開啟Play to Earn的變革之旅。 區(qū)塊鏈結合游戲組成新的 GameFi 賽道,在 2021 年迎來爆炸式增長。各大公鏈如:ETH、BSC、OKChain 等呈現(xiàn)出幾何量級的數據,乘著熱度迅速積累了眾多資

    2023年04月08日
    瀏覽(26)
  • three.js從入門到精通系列教程004 - three.js透視相機(PerspectiveCamera)滾動瀏覽全景大圖

    three.js從入門到精通系列教程004 - three.js透視相機(PerspectiveCamera)滾動瀏覽全景大圖

    源碼下載地址 three.js從入門到精通系列教程004 - three.js透視相機(PerspectiveCamera)滾動瀏覽全景大圖

    2024年01月23日
    瀏覽(104)
  • Three.js一學就會系列:02 畫線

    Three.js一學就會系列:02 畫線

    最近開始入坑前端3D建站,跟大家一起慢慢深入three.js做網站3D 這篇文章給大家講下three.js 畫線 官網,介紹 ,以及 引入庫 ,參看文章片頭系列文章:01 第一個3D網站 創(chuàng)建一個場景 創(chuàng)建一個透視攝像機 知識點: camera.position.set():三個參數固定透視攝像機的位置 camera.lookAt():

    2024年02月07日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包