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

Three.js--》實(shí)現(xiàn)圖片轉(zhuǎn)3D效果展示

這篇具有很好參考價(jià)值的文章主要介紹了Three.js--》實(shí)現(xiàn)圖片轉(zhuǎn)3D效果展示。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

項(xiàng)目搭建

初始化three.js基礎(chǔ)代碼

加載圖片紋理

設(shè)置著色器


今天簡(jiǎn)單實(shí)現(xiàn)一個(gè)three.js的小Demo,加強(qiáng)自己對(duì)three知識(shí)的掌握與學(xué)習(xí),只有在項(xiàng)目中才能靈活將所學(xué)知識(shí)運(yùn)用起來,話不多說直接開始。

項(xiàng)目搭建

本案例還是借助框架書寫three項(xiàng)目,借用vite構(gòu)建工具搭建vue項(xiàng)目,vite這個(gè)構(gòu)建工具如果有不了解的朋友,可以參考我之前對(duì)其講解的文章:vite腳手架的搭建與使用 。搭建完成之后,用編輯器打開該項(xiàng)目,在終端執(zhí)行 npm i 安裝一下依賴,安裝完成之后終端在安裝 npm i three 即可。

因?yàn)槲掖罱ǖ氖莢ue3項(xiàng)目,為了便于代碼的可讀性,所以我將three.js代碼單獨(dú)抽離放在一個(gè)組件當(dāng)中,在App根組件中進(jìn)入引入該組件。具體如下:

<template>
  <!-- 3D圖片效果 -->
  <Image3DEffect></Image3DEffect>
</template>

<script setup>
import Image3DEffect from './components/Image3DEffect.vue';
</script>

<style lang="less">
  *{
    margin: 0;
    padding: 0;
  }
</style>

初始化three.js基礎(chǔ)代碼

three.js開啟必須用到的基礎(chǔ)代碼如下:

導(dǎo)入three庫

import * as THREE from 'three'

初始化場(chǎng)景

const scene = new THREE.Scene()

初始化相機(jī)

// 設(shè)置相機(jī)
const camera = new THREE.PerspectiveCamera(90,window.innerWidth/window.innerHeight,0.1,1000)
camera.position.set(0,0,5)

初始化渲染器

// 渲染器
let renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth,window.innerHeight)

監(jiān)聽屏幕大小的改變,修改渲染器的寬高和相機(jī)的比例

window.addEventListener("resize",()=>{ 
  renderer.setSize(window.innerWidth,window.innerHeight)
  camera.aspect = window.innerWidth/window.innerHeight
  camera.updateProjectionMatrix()
})

設(shè)置渲染函數(shù):?

// 創(chuàng)建渲染函數(shù)
const render = () => {
  requestAnimationFrame(render);
  renderer.render(scene, camera);
}
render();

ok,寫完基礎(chǔ)代碼之后,接下來開始具體的Demo實(shí)操。?

加載圖片紋理

這里通過TextureLoader加載各圖片紋理文件,圖片資源大家可以隨便在網(wǎng)上找一個(gè)就行,如果想要圖片資源的朋友可以在這個(gè)網(wǎng)站找找看:https://pixabay.com/zh/ ,在加載圖片紋理時(shí),我們還要加載器深度圖。

Depth Map(深度圖)是一種圖像格式,它記錄了每個(gè)像素距離相機(jī)的距離信息。深度圖可以用來表示三維場(chǎng)景中物體的距離,是3D渲染中常用的圖像格式之一。

在圖形渲染管線中,深度圖通常用于實(shí)現(xiàn)深度測(cè)試和陰影計(jì)算。深度測(cè)試是指在將三維物體渲染到屏幕上時(shí),比較每個(gè)像素的深度值(即該像素距離相機(jī)的距離),如果一個(gè)像素前面有另一個(gè)像素,則只顯示前面的像素,從而保證渲染順序的正確性。而陰影計(jì)算則是通過比較光源與物體之間的深度值,確定每個(gè)像素是否被遮擋(即在陰影中)。

生成深度圖的網(wǎng)站:LeiaPix Converter | Depth Animations ,我們直接導(dǎo)入圖片即可:

Three.js--》實(shí)現(xiàn)圖片轉(zhuǎn)3D效果展示

我們可以對(duì)深度圖片的相關(guān)樣式進(jìn)行修改:

Three.js--》實(shí)現(xiàn)圖片轉(zhuǎn)3D效果展示

最后點(diǎn)擊Depath Map? 下載深度圖片即可。

Three.js--》實(shí)現(xiàn)圖片轉(zhuǎn)3D效果展示

// 加載紋理
const textureLoader = new THREE.TextureLoader()
const texture = textureLoader.load("/images/woman.jpg")
const depthTexture = textureLoader.load("/images/woman_depth.jpg")

設(shè)置著色器

著色器(Shader)是一種在圖形渲染管線中運(yùn)行的程序,它可以對(duì)渲染過程中的頂點(diǎn)、像素等進(jìn)行各種計(jì)算和處理,從而實(shí)現(xiàn)各種復(fù)雜的渲染效果。

著色器通常分為兩種類型頂點(diǎn)著色器片元著色器。頂點(diǎn)著色器是用來計(jì)算頂點(diǎn)的位置、法線、紋理坐標(biāo)等信息,并將其傳遞給片元著色器進(jìn)行處理;片元著色器則是用來計(jì)算每個(gè)像素(片元)的顏色值,通常根據(jù)紋理、燈光、材質(zhì)等信息進(jìn)行計(jì)算,并輸出最終顏色值到屏幕上。

// 創(chuàng)建屏幕
const geomery = new THREE.PlaneGeometry(19.2,12.8)
// 創(chuàng)建鼠標(biāo)對(duì)象
const mouse = new THREE.Vector2()
// 設(shè)置著色器材質(zhì)
const material = new THREE.ShaderMaterial({
  uniforms: {
    uTime: { value: 0 },
    uTexture: { value: texture },
    uDepthTexture: { value: depthTexture },
    uMouse: { value: mouse }
  },
  vertexShader: `
    varying vec2 vUv;
    void main() {
      vUv = uv;
      gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }
  `,
  fragmentShader: `
    uniform sampler2D uTexture;
    uniform sampler2D uDepthTexture;
    uniform vec2 uMouse;
    varying vec2 vUv;
    uniform float uTime;
    void main() {
      vec4 color = texture2D(uTexture, vUv);
      vec4 depth = texture2D(uDepthTexture, vUv);
      float depthValue = depth.r;
      float x = vUv.x + (uMouse.x+sin(uTime))*0.01*depthValue;
      float y = vUv.y + (uMouse.y+cos(uTime))*0.01*depthValue;
      vec4 newColor = texture2D(uTexture, vec2(x, y));
      gl_FragColor = newColor;
    }
  `,
})
const plane = new THREE.Mesh(geomery,material)
scene.add(plane)

最后我們?cè)O(shè)置渲染函數(shù)和監(jiān)聽事件:

// 設(shè)置渲染函數(shù)
const render = () =>{ 
  material.uniforms.uMouse.value = mouse;
  material.uniforms.uTime.value = performance.now() / 1000;
  requestAnimationFrame(render)
  renderer.render(scene,camera)
} 
render()

// 設(shè)置鼠標(biāo)移動(dòng)監(jiān)聽事件
window.addEventListener("mousemove", (event) => {
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
});

動(dòng)態(tài)圖的文件太大上傳不了glf,這里就已圖片代替了,效果就是鼠標(biāo)移動(dòng)圖片跟著輕微的移動(dòng),如果是已經(jīng)感受到上面講解到生成深度圖的網(wǎng)站的人應(yīng)該能理解我說過的話。

Three.js--》實(shí)現(xiàn)圖片轉(zhuǎn)3D效果展示

接下來我們可以給該3D背景圖添加點(diǎn)文字:

<template>
  <div class="canvas-container" ref="screenDom"></div>
  <div class="content">
    <h1>學(xué)習(xí)更多前端技術(shù)</h1>
    <h2>請(qǐng)關(guān)注亦世凡華、</h2>
  </div>
</template>

<style lang="less">
*{
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
.canvas-container {
  width: 100vw;
  height: 100vh;
  display: block;
  position: fixed;
  top: 0;
  left: 0;
}
.content{
  position: fixed;
  top: 40%;
  left: 20%;
}
.content h1 {
  color: rgb(255, 247, 0);
  font-size: 40px;
  margin-bottom: 30px;
}
</style>

Three.js--》實(shí)現(xiàn)圖片轉(zhuǎn)3D效果展示

demo做完,給出本案例的完整代碼:(獲取素材也可以私信博主)文章來源地址http://www.zghlxwxcb.cn/news/detail-473225.html

<template>
  <div class="canvas-container" ref="screenDom"></div>
  <div class="content">
    <h1>學(xué)習(xí)更多前端技術(shù)</h1>
    <h2>請(qǐng)關(guān)注亦世凡華、</h2>
  </div>
</template>

<script setup>
import * as THREE from 'three'
import { ref,onMounted } from 'vue'

let screenDom = ref(null);
// 設(shè)置場(chǎng)景
const scene = new THREE.Scene()
// 設(shè)置相機(jī)
const camera = new THREE.PerspectiveCamera(90,window.innerWidth/window.innerHeight,0.1,1000)
camera.position.set(0,0,5)
// 渲染器
let renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth,window.innerHeight)
onMounted(()=>{
  screenDom.value.appendChild(renderer.domElement);
})

// 監(jiān)聽屏幕大小變化
window.addEventListener("resize",()=>{ 
  renderer.setSize(window.innerWidth,window.innerHeight)
  camera.aspect = window.innerWidth/window.innerHeight
  camera.updateProjectionMatrix()
})

// 加載紋理
const textureLoader = new THREE.TextureLoader()
const texture = textureLoader.load("/images/woman.jpg")
const depthTexture = textureLoader.load("/images/woman_depth.jpg")

// 創(chuàng)建屏幕
const geomery = new THREE.PlaneGeometry(19.2,12.8)
// 創(chuàng)建鼠標(biāo)對(duì)象
const mouse = new THREE.Vector2()
// 設(shè)置著色器材質(zhì)
const material = new THREE.ShaderMaterial({
  uniforms: {
    uTime: { value: 0 },
    uTexture: { value: texture },
    uDepthTexture: { value: depthTexture },
    uMouse: { value: mouse }
  },
  vertexShader: `
    varying vec2 vUv;
    void main() {
      vUv = uv;
      gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }
  `,
  fragmentShader: `
    uniform sampler2D uTexture;
    uniform sampler2D uDepthTexture;
    uniform vec2 uMouse;
    varying vec2 vUv;
    uniform float uTime;
    void main() {
      vec4 color = texture2D(uTexture, vUv);
      vec4 depth = texture2D(uDepthTexture, vUv);
      float depthValue = depth.r;
      float x = vUv.x + (uMouse.x+sin(uTime))*0.01*depthValue;
      float y = vUv.y + (uMouse.y+cos(uTime))*0.01*depthValue;
      vec4 newColor = texture2D(uTexture, vec2(x, y));
      gl_FragColor = newColor;
    }
  `,
})
const plane = new THREE.Mesh(geomery,material)
scene.add(plane)

// 設(shè)置渲染函數(shù)
const render = () =>{ 
  material.uniforms.uMouse.value = mouse;
  material.uniforms.uTime.value = performance.now() / 1000;
  requestAnimationFrame(render)
  renderer.render(scene,camera)
} 
render()

// 設(shè)置鼠標(biāo)移動(dòng)監(jiān)聽事件
window.addEventListener("mousemove", (event) => {
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
});
</script>

<style lang="less">
*{
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
.canvas-container {
  width: 100vw;
  height: 100vh;
  display: block;
  position: fixed;
  top: 0;
  left: 0;
}
.content{
  position: fixed;
  top: 40%;
  left: 20%;
}
.content h1 {
  color: rgb(255, 247, 0);
  font-size: 40px;
  margin-bottom: 30px;
}
</style>

到了這里,關(guān)于Three.js--》實(shí)現(xiàn)圖片轉(zhuǎn)3D效果展示的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Three.js--》實(shí)現(xiàn)3d地球模型展示

    Three.js--》實(shí)現(xiàn)3d地球模型展示

    目錄 項(xiàng)目搭建 實(shí)現(xiàn)網(wǎng)頁簡(jiǎn)單布局 初始化three.js基礎(chǔ)代碼 創(chuàng)建環(huán)境背景 加載地球模型 實(shí)現(xiàn)光柱效果 添加月球模型 今天簡(jiǎn)單實(shí)現(xiàn)一個(gè)three.js的小Demo,加強(qiáng)自己對(duì)three知識(shí)的掌握與學(xué)習(xí),只有在項(xiàng)目中才能靈活將所學(xué)知識(shí)運(yùn)用起來,話不多說直接開始。 項(xiàng)目搭建 本案例還是借

    2024年02月08日
    瀏覽(94)
  • Three.js--》實(shí)現(xiàn)3d地月模型展示

    Three.js--》實(shí)現(xiàn)3d地月模型展示

    目錄 項(xiàng)目搭建 初始化three.js基礎(chǔ)代碼 創(chuàng)建月球模型 添加地球模型 添加模型標(biāo)簽 今天簡(jiǎn)單實(shí)現(xiàn)一個(gè)three.js的小Demo,加強(qiáng)自己對(duì)three知識(shí)的掌握與學(xué)習(xí),只有在項(xiàng)目中才能靈活將所學(xué)知識(shí)運(yùn)用起來,話不多說直接開始。 項(xiàng)目搭建 本案例還是借助框架書寫three項(xiàng)目,借用vite構(gòu)建

    2024年02月07日
    瀏覽(100)
  • Three.js--》實(shí)現(xiàn)3d官網(wǎng)模型展示

    Three.js--》實(shí)現(xiàn)3d官網(wǎng)模型展示

    目錄 項(xiàng)目搭建 實(shí)現(xiàn)網(wǎng)頁簡(jiǎn)單布局 初始化three.js基礎(chǔ)代碼 創(chuàng)建環(huán)境背景 加載飛船模型 實(shí)現(xiàn)滾輪滑動(dòng)切換3D場(chǎng)景 設(shè)置星光流動(dòng)特效 今天簡(jiǎn)單實(shí)現(xiàn)一個(gè)three.js的小Demo,加強(qiáng)自己對(duì)three知識(shí)的掌握與學(xué)習(xí),只有在項(xiàng)目中才能靈活將所學(xué)知識(shí)運(yùn)用起來,話不多說直接開始。 項(xiàng)目搭建

    2024年02月06日
    瀏覽(102)
  • Three.js--》實(shí)現(xiàn)3d圣誕賀卡展示模型

    Three.js--》實(shí)現(xiàn)3d圣誕賀卡展示模型

    目錄 項(xiàng)目搭建 初始化three.js基礎(chǔ)代碼 加載環(huán)境模型 設(shè)置環(huán)境紋理 添加水面并設(shè)置陰影效果 實(shí)現(xiàn)幽靈小球的運(yùn)動(dòng) 實(shí)現(xiàn)相機(jī)切換和文字切屏 實(shí)現(xiàn)漫天星星和愛心樣式 今天簡(jiǎn)單實(shí)現(xiàn)一個(gè)three.js的小Demo,加強(qiáng)自己對(duì)three知識(shí)的掌握與學(xué)習(xí),只有在項(xiàng)目中才能靈活將所學(xué)知識(shí)運(yùn)用起

    2024年02月06日
    瀏覽(101)
  • Three.js--》實(shí)現(xiàn)3d球形機(jī)器人模型展示

    Three.js--》實(shí)現(xiàn)3d球形機(jī)器人模型展示

    目錄 項(xiàng)目搭建 初始化three.js基礎(chǔ)代碼 設(shè)置環(huán)境紋理 加載機(jī)器人模型 添加光陣 今天簡(jiǎn)單實(shí)現(xiàn)一個(gè)three.js的小Demo,加強(qiáng)自己對(duì)three知識(shí)的掌握與學(xué)習(xí),只有在項(xiàng)目中才能靈活將所學(xué)知識(shí)運(yùn)用起來,話不多說直接開始。 項(xiàng)目搭建 本案例還是借助框架書寫three項(xiàng)目,借用vite構(gòu)建工

    2024年02月07日
    瀏覽(364)
  • 【js&threeJS】入門three,并實(shí)現(xiàn)3D汽車展示廳,附帶全碼

    【js&threeJS】入門three,并實(shí)現(xiàn)3D汽車展示廳,附帶全碼

    首先放個(gè)最終效果圖: ? 三維(3D)概念: 三維(3D)是一個(gè)描述物體在三個(gè)空間坐標(biāo)軸上的位置和形態(tài)的概念。相比于二維(2D)只有長(zhǎng)度和寬度的平面,三維增加了高度或深度這一維度 在三維空間中,我們使用三個(gè)獨(dú)立的坐標(biāo)軸來描述物體的位置。通常使用笛卡爾坐標(biāo)系

    2024年02月11日
    瀏覽(703)
  • vue2+three.js實(shí)現(xiàn)類似VR、3D全景效果

    vue2+three.js實(shí)現(xiàn)類似VR、3D全景效果

    效果圖: 倆圖標(biāo)是我自己加的前進(jìn)后退按鈕,也是百度了好久,再加上GPT的幫助,才給搞出來。因?yàn)樾枨蠹保疾豢垂俜轿臋n,百度到一個(gè)能跑的demo之后改吧改吧,就先用著了。 下面是代碼: 這里 代碼有很多用不到的地方和需要優(yōu)化的地方,我是來不及改了,就先這樣吧

    2024年02月15日
    瀏覽(87)
  • WEB 3D技術(shù) three.js 3D賀卡(1) 搭建基本項(xiàng)目環(huán)境

    WEB 3D技術(shù) three.js 3D賀卡(1) 搭建基本項(xiàng)目環(huán)境

    好 今天 我也是在網(wǎng)上學(xué)的 帶著大家一起來做個(gè)3D賀卡 首先 我們要?jiǎng)?chuàng)建一個(gè)vue3的項(xiàng)目、 先創(chuàng)建一個(gè)文件夾 裝我們的項(xiàng)目 終端執(zhí)行 vue create 項(xiàng)目名稱 例如 我的名字想叫 greetingCards 就是 因?yàn)檫@個(gè)名錄 里面是全部都小寫的 然后 下面選擇 vue3 然后按下回車 等待項(xiàng)目創(chuàng)建完成

    2024年01月19日
    瀏覽(94)
  • 3D數(shù)字孿生 - Three.js 項(xiàng)目介紹與基礎(chǔ)環(huán)境搭建(一)

    3D數(shù)字孿生 - Three.js 項(xiàng)目介紹與基礎(chǔ)環(huán)境搭建(一)

    根據(jù)WMS系統(tǒng)基礎(chǔ)倉庫數(shù)據(jù)以及RCS調(diào)度坐標(biāo)系統(tǒng),生成3D可視化倉庫地圖,能夠?qū)崟r(shí)監(jiān)控倉庫庫位坐標(biāo)、調(diào)度任務(wù)狀態(tài)、車輛位置等信息。 社區(qū)對(duì)于threejs的實(shí)戰(zhàn)案例太少,于是,花了一個(gè)月的時(shí)間,手撕了這個(gè)需求。此篇重點(diǎn)不會(huì)對(duì)threejs做深入講解,畢竟我也是剛上車不到一

    2024年04月11日
    瀏覽(121)
  • Three.js--》實(shí)現(xiàn)3d小島模型搭建

    Three.js--》實(shí)現(xiàn)3d小島模型搭建

    目錄 項(xiàng)目搭建 初始化three.js基礎(chǔ)代碼 設(shè)置環(huán)境背景 設(shè)置水面樣式 添加天空小島 今天簡(jiǎn)單實(shí)現(xiàn)一個(gè)three.js的小Demo,加強(qiáng)自己對(duì)three知識(shí)的掌握與學(xué)習(xí),只有在項(xiàng)目中才能靈活將所學(xué)知識(shí)運(yùn)用起來,話不多說直接開始。 項(xiàng)目搭建 本案例還是借助框架書寫three項(xiàng)目,借用vite構(gòu)建

    2024年02月05日
    瀏覽(430)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包