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

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

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

目錄

項(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)用起來(lái),話(huà)不多說(shuō)直接開(kāi)始。

項(xiàng)目搭建

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

因?yàn)閞eact在每次頁(yè)面發(fā)生變化時(shí)會(huì)出現(xiàn)執(zhí)行整段代碼,這樣的話(huà)就會(huì)產(chǎn)生不必要的資源擁塞,所以我將three.js代碼單獨(dú)抽離成一個(gè)js文件。具體如下:

import { render } from "./three/水天一色小島.js"
import './App.css'
const App = () => {
  return (
    <div>
      {render()}
    </div>
  )
}
export default App

當(dāng)然也是有比較設(shè)置一下css樣式,重置一下瀏覽器原本的css樣式,如下:

*{
  margin: 0;
  padding: 0;
}
body{
  background-color: #1e1a20;
}
::-webkit-scrollbar {
  display: none;
}

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

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

導(dǎo)入three庫(kù)

import * as THREE from 'three'

初始化場(chǎng)景

const scene = new THREE.Scene()

初始化相機(jī)

const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,2000)
camera.position.set(10,50,120) // 設(shè)置相機(jī)位置
camera.aspect = window.innerWidth / window.innerHeight // 更新攝像頭寬高比例
camera.updateProjectionMatrix() // 更新攝像頭矩陣
scene.add(camera)

初始化渲染器

const renderer = new THREE.WebGLRenderer({
  antialias:true, // 設(shè)置抗鋸齒

})
renderer.outputEncoding = THREE.sRGBEncoding // 告訴渲染器在輸出顏色時(shí)采用sRGB空間的標(biāo)準(zhǔn)渲染格式
renderer.setSize(window.innerWidth,window.innerHeight) // 設(shè)置渲染器的寬高
document.body.appendChild(renderer.domElement) // 將渲染器添加到頁(yè)面中

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

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

導(dǎo)入控制器

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
// 實(shí)例化控制器
const controls = new OrbitControls(camera,renderer.domElement)

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

export function render(){
  renderer.render(scene,camera) // 渲染場(chǎng)景
  requestAnimationFrame(render) // 引擎自動(dòng)更新渲染器
}
render()

ok,設(shè)置完這些基礎(chǔ)代碼之后,我們可以添加一個(gè)物體進(jìn)行檢驗(yàn)一下,就添加個(gè)平面吧,如下:

// 添加平面
const planeGeometry = new THREE.PlaneGeometry(100,100)
const planeMaterial = new THREE.MeshBasicMaterial({
  color:0xffffff
})
const plane = new THREE.Mesh(planeGeometry,planeMaterial)
scene.add(plane)

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

ok,可見(jiàn)代碼寫(xiě)的沒(méi)有錯(cuò)誤,接下來(lái)開(kāi)始具體的Demo實(shí)操。

設(shè)置環(huán)境背景

在網(wǎng)上隨便找一張全景圖片,然后進(jìn)行球體的紋理貼圖,代碼如下:

// 創(chuàng)建一個(gè)巨大的天空球體
const skyGeometry = new THREE.SphereGeometry(1000,60,60)
const skyMaterial = new THREE.MeshBasicMaterial({
  map: new THREE.TextureLoader().load('./src/public/starry-sky2.jpg')
})
const sky = new THREE.Mesh(skyGeometry,skyMaterial)
scene.add(sky)

一開(kāi)始我們是置身在球體外部的,具體效果如下:

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

如果想我們一開(kāi)始就置身在球體內(nèi)部可以進(jìn)行如下操作:

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

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

設(shè)置視頻紋理:除了設(shè)置圖片紋理外,我們也可以設(shè)置一下視頻紋理,如下:

// 設(shè)置視頻紋理
const video = document.createElement("video")
video.src = "./src/public/sky.mp4" // 視頻路徑
video.loop = true // 循環(huán)播放
window,addEventListener("click",(e)=>{
  // 判斷視頻是否處于播放狀態(tài)
  if(video.paused){
    video.play()
    skyMaterial.map = new THREE.VideoTexture(video)
    skyMaterial.map.needsUpdate = true
  }
})

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

設(shè)置水面樣式

這里借助three庫(kù)中Water來(lái)實(shí)現(xiàn)水面波紋的效果,如下:

// 導(dǎo)入水面
import { Water } from "three/examples/jsm/objects/Water2"
// 創(chuàng)建平面
const waterGeometry = new THREE.CircleGeometry(300,64)
const water = new Water(waterGeometry,{
  textureWidth: 1024,
  textureHeight: 1024,
  color:0x0080ff,
  scale: 1,
})
water.rotation.x = -Math.PI / 2
scene.add(water)

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

這里有個(gè)坑,如果想實(shí)現(xiàn)這種波紋效果的話(huà),需要自行提供波紋的紋理貼圖,并提供特定的路徑,如果路徑不對(duì)的話(huà)是否爆出如下錯(cuò)誤的,如下:

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

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

添加天空小島

導(dǎo)入gltf載入庫(kù)

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"
import { DRACOLoader } from 'three/examples/jsm/loaders/dracoloader'

添加小島模型

const loader = new GLTFLoader() // 實(shí)例化gltf載入庫(kù)
const dracoLoader = new DRACOLoader() // 實(shí)例化draco載入庫(kù)
dracoLoader.setDecoderPath("/draco/") // 添加draco載入庫(kù)
loader.setDRACOLoader(dracoLoader) // 添加draco載入庫(kù)

loader.load("./model/island2.glb",(gltf)=>{
  scene.add(gltf.scene)
})

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

這里需要設(shè)置一下環(huán)境紋理來(lái)顯示具體樣式

import { DRACOLoader } from 'three/examples/jsm/loaders/dracoloader'
import { RGBELoader } from 'three/examples/jsm/loaders/rgbeloader'
// 載入環(huán)境紋理
const hdrLoader = new RGBELoader()
hdrLoader.loadAsync("./src/public/050.hdr").then((texture)=>{
  texture.mapping = THREE.EquirectangularReflectionMapping
  scene.background = texture
  scene.environment = texture
})

// 添加環(huán)境光
const light = new THREE.DirectionalLight(0xffffff,1)
light.position.set(-100,100,10)
scene.add(light)

最后實(shí)現(xiàn)的效果如下:

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

ok,今天的three.js小案例就講到這,給出本文的代碼筆記: (獲取素材也可以私信博主)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-448943.html

/* eslint-disable no-unused-vars */
import * as THREE from 'three'
// 導(dǎo)入控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
// 導(dǎo)入水面
import { Water } from "three/examples/jsm/objects/Water2"
// 導(dǎo)入gltf載入庫(kù)
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"
import { DRACOLoader } from 'three/examples/jsm/loaders/dracoloader'
import { RGBELoader } from 'three/examples/jsm/loaders/rgbeloader'

// 初始化場(chǎng)景
const scene = new THREE.Scene()
// 初始化相機(jī)
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,2000)
camera.position.set(10,50,120) // 設(shè)置相機(jī)位置
camera.aspect = window.innerWidth / window.innerHeight // 更新攝像頭寬高比例
camera.updateProjectionMatrix() // 更新攝像頭矩陣
scene.add(camera)
// 初始化渲染器
const renderer = new THREE.WebGLRenderer({
  antialias:true, // 設(shè)置抗鋸齒
  logarithmicDepthBuffer: true // 對(duì)數(shù)深度緩沖區(qū)
})
renderer.outputEncoding = THREE.sRGBEncoding // 告訴渲染器在輸出顏色時(shí)采用sRGB空間的標(biāo)準(zhǔn)渲染格式
renderer.setSize(window.innerWidth,window.innerHeight) // 設(shè)置渲染器的寬高
document.body.appendChild(renderer.domElement) // 將渲染器添加到頁(yè)面中

// 監(jiān)聽(tīng)屏幕大小的改變,修改渲染器的寬高和相機(jī)的比例
window.addEventListener("resize",()=>{
  camera.aspect = window.innerWidth / window.innerHeight
  camera.updateProjectionMatrix()
  renderer.setSize(window.innerWidth,window.innerHeight)
})

// 實(shí)例化控制器
const controls = new OrbitControls(camera,renderer.domElement)

// 設(shè)置渲染函數(shù)
export function render(){
  renderer.render(scene,camera) // 渲染場(chǎng)景
  requestAnimationFrame(render) // 引擎自動(dòng)更新渲染器
}
render()

// 創(chuàng)建一個(gè)巨大的天空球體
let texture = new THREE.TextureLoader().load('./src/public/starry-sky2.jpg')
const skyGeometry = new THREE.SphereGeometry(1000,30,30)
const skyMaterial = new THREE.MeshBasicMaterial({
  map: texture
})
skyGeometry.scale(1,1,-1)
const sky = new THREE.Mesh(skyGeometry,skyMaterial)
scene.add(sky)

// 設(shè)置視頻紋理
const video = document.createElement("video")
video.src = "./src/public/sky.mp4" // 視頻路徑
video.loop = true // 循環(huán)播放
window,addEventListener("click",(e)=>{
  // 判斷視頻是否處于播放狀態(tài)
  if(video.paused){
    video.play()
    let texture = new THREE.VideoTexture(video)
    skyMaterial.map = texture
    skyMaterial.map.needsUpdate = true
    scene.background = texture
    scene.environment = texture
  }
})

// 載入環(huán)境紋理
const hdrLoader = new RGBELoader()
hdrLoader.loadAsync("./src/public/050.hdr").then((texture)=>{
  texture.mapping = THREE.EquirectangularReflectionMapping
  scene.background = texture
  scene.environment = texture
})

// 添加環(huán)境光
const light = new THREE.DirectionalLight(0xffffff,1)
light.position.set(-100,100,10)
scene.add(light)

// 創(chuàng)建平面
const waterGeometry = new THREE.CircleGeometry(300,64)
const water = new Water(waterGeometry,{
  textureWidth: 1024,
  textureHeight: 1024,
  color:0xeeeeff,
  scale: 1,
})
water.position.y = 3
water.rotation.x = -Math.PI / 2
scene.add(water)

// 添加小島模型
const loader = new GLTFLoader() // 實(shí)例化gltf載入庫(kù)
const dracoLoader = new DRACOLoader() // 實(shí)例化draco載入庫(kù)
dracoLoader.setDecoderPath("/draco/") // 添加draco載入庫(kù)
loader.setDRACOLoader(dracoLoader) // 添加draco載入庫(kù)

loader.load("./model/island2.glb",(gltf)=>{
  scene.add(gltf.scene)
})

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

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)目搭建 初始化three.js基礎(chǔ)代碼 設(shè)置環(huán)境紋理 加載字體模型 今天簡(jiǎn)單實(shí)現(xiàn)一個(gè)three.js的小Demo,加強(qiáng)自己對(duì)three知識(shí)的掌握與學(xué)習(xí),只有在項(xiàng)目中才能靈活將所學(xué)知識(shí)運(yùn)用起來(lái),話(huà)不多說(shuō)直接開(kāi)始。 項(xiàng)目搭建 本案例還是借助框架書(shū)寫(xiě)three項(xiàng)目,借用vite構(gòu)建工具搭建vue項(xiàng)

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

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

    目錄 項(xiàng)目搭建 初始化three.js基礎(chǔ)代碼 設(shè)置環(huán)境紋理加載模型 使用Cannon-es實(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)用起來(lái),話(huà)不多說(shuō)直接開(kāi)始。 項(xiàng)目搭建 本案例還是借助框架書(shū)寫(xiě)three項(xiàng)目,借用

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

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

    目錄 項(xiàng)目搭建 實(shí)現(xiàn)網(wǎng)頁(yè)簡(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)用起來(lái),話(huà)不多說(shuō)直接開(kāi)始。 項(xiàng)目搭建 本案例還是借

    2024年02月08日
    瀏覽(93)
  • 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)用起來(lái),話(huà)不多說(shuō)直接開(kāi)始。 項(xiàng)目搭建 本案例還是借助框架書(shū)寫(xiě)three項(xiàng)目,借用vite構(gòu)建

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

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

    目錄 項(xiàng)目搭建 實(shí)現(xiàn)網(wǎng)頁(yè)簡(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)用起來(lái),話(huà)不多說(shuō)直接開(kāi)始。 項(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)漫天星星和愛(ài)心樣式 今天簡(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)用起來(lái),話(huà)不多說(shuō)直接開(kāi)始。 項(xiàng)目搭建 本案例還是借助框架書(shū)寫(xiě)three項(xiàng)目,借用vite構(gòu)建工

    2024年02月07日
    瀏覽(364)
  • vue 項(xiàng)目使用three.js 實(shí)現(xiàn)3D看房效果

    vue 項(xiàng)目使用three.js 實(shí)現(xiàn)3D看房效果

    0.前言 該教程能幫助直接寫(xiě)出vue項(xiàng)目的3D看房效果?。。?先上效果圖 1.安裝依賴(lài) 2.vue代碼 這里文件名為three.vue 代碼非原創(chuàng),出處 vue3+threejs實(shí)現(xiàn)全景看房 (異步加載 BOLLROOM 部件為對(duì)原代碼的修改) 注意這里的hdr 文件必須要放在assets文件夾中,且要通過(guò)import模塊的形式導(dǎo)入!

    2024年02月13日
    瀏覽(94)
  • vue2+three.js+blender(實(shí)現(xiàn)3d 模型引入并可點(diǎn)擊效果)

    vue2+three.js+blender(實(shí)現(xiàn)3d 模型引入并可點(diǎn)擊效果)

    2023.9.13今天我學(xué)習(xí)了如何把3d建模里面的模型引入到vue中,并可以實(shí)現(xiàn)拖動(dòng),點(diǎn)擊的效果: 首先安裝: npm install three 相關(guān)代碼如下: ?如果沒(méi)有圖片可以去 Three.js--》建模軟件如何加載外部3D模型?_threejs加載3d模型_亦世凡華、的博客-CSDN博客

    2024年02月03日
    瀏覽(98)
  • three.js添加3d模型

    three.js添加3d模型

    three官方的幾何體也就那么幾個(gè),想要生成各種各樣的模型,其難度十分之大,這時(shí)引入外部模型也不失為一種選擇。具體引入辦法如下。 雖然名字為GLTFLoader,但實(shí)際上glb文件也是能加載的。 其中需要注意的是調(diào)節(jié)相機(jī)參數(shù)與相機(jī)位置,否則很有可能導(dǎo)致場(chǎng)景中看不見(jiàn)任何東

    2024年02月04日
    瀏覽(104)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包