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

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

這篇具有很好參考價值的文章主要介紹了Three.js--》實現(xiàn)3d地月模型展示。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄

項目搭建

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

創(chuàng)建月球模型

添加地球模型

添加模型標(biāo)簽


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

項目搭建

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

<template>
  <!-- 地月模型 -->
  <EarthMoonSurrounding></EarthMoonSurrounding>
</template>

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

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

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

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

導(dǎo)入three庫

import * as THREE from 'three'

初始化場景

const scene = new THREE.Scene()

初始化相機(jī)

const camera = new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,200)
camera.position.set(10,5,20)

初始化渲染器

const 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ù)

const render = () =>{ 
  requestAnimationFrame(render);
  renderer.render(scene, camera);
}

進(jìn)行掛載

onMounted(()=>{
  render()
})

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

創(chuàng)建月球模型

首先這里通過直接給畫布的canvas標(biāo)簽添加css樣式,給其一個背景圖片作為背景:

canvas{
  background-image: url('../../public/images/star.jpg');
  background-size: cover;
}

然后使用TextureLoader用于加載圖片紋理的工具,將圖片文件加載為 Three.js 中的紋理對象,并且可以將紋理應(yīng)用到場景中的任何物體上,從而實現(xiàn)更加生動的渲染效果。

// 創(chuàng)建月球
const moonGeometry = new THREE.SphereGeometry(MOON_RADIUS,16,16)
const moonMaterial = new THREE.MeshPhongMaterial({
  map: textureLoader.load('/public/textures/planets/moon_1024.jpg')
})
const moon = new THREE.Mesh(moonGeometry, moonMaterial)
moon.receiveShadow = true
moon.castShadow = true;
scene.add(moon)

創(chuàng)建好模型之后給場景中添加光源:

// 創(chuàng)建添加聚光燈光源
const dirLight = new THREE.SpotLight(0xffffff)
dirLight.position.set(0,0,10)
dirLight.intensity = 1
dirLight.castShadow = true
scene.add(dirLight)
// 添加環(huán)境光
const aLight = new THREE.AmbientLight(0xffffff)
aLight.intensity = 0.03
scene.add(aLight)

在渲染函數(shù)中通過getElapsedTime方法計算動畫經(jīng)過的時間或者控制動畫的播放速度,來動態(tài)改變月球位置,讓其繞圓周開始運(yùn)動。

let clock = new THREE.Clock();
// 設(shè)置渲染函數(shù)
const render = () =>{ 
  const elapsed = clock.getElapsedTime()
  // 月球旋轉(zhuǎn)
  moon.position.set(Math.sin(elapsed)*5,0,Math.cos(elapsed)*5)
  renderer.render(scene,camera)
  requestAnimationFrame(render)
}

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

添加地球模型

這里也采用TextureLoader用于加載圖片紋理的工具,將圖片文件加載為 Three.js 中的紋理對象,并且可以將紋理應(yīng)用到場景中的任何物體上,從而實現(xiàn)更加生動的渲染效果。

// 創(chuàng)建地球
const earthGeometry = new THREE.SphereGeometry(EARTH_RADIUS,16,16)
const earthMaterial = new THREE.MeshPhongMaterial({
  map: textureLoader.load('/public/textures/planets/earth_atmos_2048.jpg'),
  specularMap: textureLoader.load('/public/textures/planets/earth_specular_2048.jpg'),
  normalMap: textureLoader.load('/public/textures/planets/earth_normal_2048.jpg'),
})
const earth = new THREE.Mesh(earthGeometry,earthMaterial)
earth.receiveShadow = true
earth.castShadow = true
scene.add(earth)

這里依然在render渲染函數(shù)處通過getElapsedTime方法計算動畫經(jīng)過的時間或者控制動畫的播放速度,來動態(tài)改變地球自轉(zhuǎn)速度,讓自轉(zhuǎn)運(yùn)動。

let clock = new THREE.Clock();
let oldtime = 0
// 設(shè)置渲染函數(shù)
const render = () =>{ 
  const elapsed = clock.getElapsedTime()
  // 月球旋轉(zhuǎn)
  moon.position.set(Math.sin(elapsed)*5,0,Math.cos(elapsed)*5)
  // 地球自轉(zhuǎn)
  let axis = new THREE.Vector3(0,1,0)
  earth.rotateOnAxis(axis, (elapsed - oldtime) * Math.PI / 10)
  oldtime = elapsed
  requestAnimationFrame(render)
}

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

添加模型標(biāo)簽

在 Three.js 中,CSS2DRenderer 是一個用于將 HTML 元素渲染成 2D 貼圖,并將其添加到 Three.js 場景中的工具類。它可以幫助我們更方便地在 Three.js 場景中添加 HTML 元素,比如顯示標(biāo)簽、文字等。CSS2DRenderer 類似于 Three.js 中的 WebGLRenderer,但是它渲染的不是 Three.js 的 3D 對象,而是 HTML 元素。

import { CSS2DRenderer} from 'three/examples/jsm/renderers/CSS2DRenderer'

// 創(chuàng)建標(biāo)簽選擇器
const labelRenderer = new CSS2DRenderer();
labelRenderer.setSize(window.innerWidth, window.innerHeight)
labelRenderer.domElement.style.position = 'absolute';
labelRenderer.domElement.style.top = '0px';
document.body.appendChild(labelRenderer.domElement)
// 給CSS2DRenderer添加控制器
const controls1 = new OrbitControls(camera,labelRenderer.domElement)
controls1.enableDamping = true

CSS2DObject 則是可以在 Three.js 場景中創(chuàng)建的一個 CSS2D 元素。它類似于 Three.js 中的 Mesh,但是它表示的不是三維物體,而是一個 CSS 元素。你可以通過創(chuàng)建 CSS2DObject 實例,將其添加到 Three.js 的場景中,并設(shè)置其內(nèi)部的 HTML 元素,從而在 Three.js 場景中顯示 HTML 內(nèi)容。

import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer'

// 創(chuàng)建月球標(biāo)簽
const moonDiv = document.createElement('div');
moonDiv.className = 'label';
moonDiv.textContent = 'Moon';
const moonLabel = new CSS2DObject(moonDiv)
moonLabel.position.set(0, MOON_RADIUS + 0.5, 0);
moon.add(moonLabel)

// 創(chuàng)建地球標(biāo)簽
const earthDiv = document.createElement('div');
earthDiv.className = 'label';
earthDiv.textContent = 'Earch';
const eartchLabel = new CSS2DObject(earthDiv)
eartchLabel.position.set(0, EARTH_RADIUS + 0.5, 0);
earth.add(eartchLabel)

然后給出直接設(shè)置類名的樣式:

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

最后在渲染函數(shù)中加載渲染標(biāo)簽函數(shù) :

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

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

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

<script setup>
import * as THREE from 'three'
import { onMounted } from 'vue';
// 控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
// 文字2D渲染器
import { CSS2DRenderer,CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer'

const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,200)
camera.position.set(10,5,20)

// 創(chuàng)建渲染器
const renderer = new THREE.WebGLRenderer({ 
  alpha: true
})
renderer.setPixelRatio(window.devicePixelRatio) // 根據(jù)屏幕顯示像素比
renderer.setSize(window.innerWidth,window.innerHeight)
renderer.shadowMap.enabled = true // 渲染陰影
document.body.appendChild(renderer.domElement)

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

// 設(shè)置控制器
const controls = new OrbitControls(camera,renderer.domElement)
controls.enableDamping = true

let clock = new THREE.Clock();
let oldtime = 0
// 設(shè)置渲染函數(shù)
const render = () =>{ 
  const elapsed = clock.getElapsedTime()
  // 月球旋轉(zhuǎn)
  moon.position.set(Math.sin(elapsed)*5,0,Math.cos(elapsed)*5)
  // 地球自轉(zhuǎn)
  let axis = new THREE.Vector3(0,1,0)
  earth.rotateOnAxis(axis, (elapsed - oldtime) * Math.PI / 10)
  oldtime = elapsed
  renderer.render(scene,camera)
  labelRenderer.render(scene, camera)
  requestAnimationFrame(render)
}

// 設(shè)置地球和月球的半徑大小
const EARTH_RADIUS = 2.5
const MOON_RADIUS = 0.27
// 實例化紋理加載器
const textureLoader = new THREE.TextureLoader()
// 創(chuàng)建標(biāo)簽選擇器
const labelRenderer = new CSS2DRenderer();
labelRenderer.setSize(window.innerWidth, window.innerHeight)
labelRenderer.domElement.style.position = 'absolute';
labelRenderer.domElement.style.top = '0px';
document.body.appendChild(labelRenderer.domElement)
// 給CSS2DRenderer添加控制器
const controls1 = new OrbitControls(camera,labelRenderer.domElement)
controls1.enableDamping = true

// 創(chuàng)建月球
const moonGeometry = new THREE.SphereGeometry(MOON_RADIUS,16,16)
const moonMaterial = new THREE.MeshPhongMaterial({
  map: textureLoader.load('/public/textures/planets/moon_1024.jpg')
})
const moon = new THREE.Mesh(moonGeometry, moonMaterial)
moon.receiveShadow = true
moon.castShadow = true;
scene.add(moon)
// 創(chuàng)建月球標(biāo)簽
const moonDiv = document.createElement('div');
moonDiv.className = 'label';
moonDiv.textContent = 'Moon';
const moonLabel = new CSS2DObject(moonDiv)
moonLabel.position.set(0, MOON_RADIUS + 0.5, 0);
moon.add(moonLabel)

// 創(chuàng)建地球
const earthGeometry = new THREE.SphereGeometry(EARTH_RADIUS,16,16)
const earthMaterial = new THREE.MeshPhongMaterial({
  map: textureLoader.load('/public/textures/planets/earth_atmos_2048.jpg'),
  specularMap: textureLoader.load('/public/textures/planets/earth_specular_2048.jpg'),
  normalMap: textureLoader.load('/public/textures/planets/earth_normal_2048.jpg'),
})
const earth = new THREE.Mesh(earthGeometry,earthMaterial)
earth.receiveShadow = true
earth.castShadow = true
scene.add(earth)
// 創(chuàng)建地球標(biāo)簽
const earthDiv = document.createElement('div');
earthDiv.className = 'label';
earthDiv.textContent = 'Earch';
const eartchLabel = new CSS2DObject(earthDiv)
eartchLabel.position.set(0, EARTH_RADIUS + 0.5, 0);
earth.add(eartchLabel)

// 創(chuàng)建添加聚光燈光源
const dirLight = new THREE.SpotLight(0xffffff)
dirLight.position.set(0,0,10)
dirLight.intensity = 1
dirLight.castShadow = true
scene.add(dirLight)
// 添加環(huán)境光
const aLight = new THREE.AmbientLight(0xffffff)
aLight.intensity = 0.03
scene.add(aLight)

onMounted(()=>{
  render()
})
</script>
<style lang="less">
canvas{
  background-image: url('../../public/images/star.jpg');
  background-size: cover;
}
.label {
  color: #fff;
  font-size: 16px;
}
</style>

到了這里,關(guān)于Three.js--》實現(xiàn)3d地月模型展示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

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

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

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

    2024年02月07日
    瀏覽(364)
  • Three.js--》實現(xiàn)3d小島模型搭建

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

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

    2024年02月05日
    瀏覽(429)
  • Three.js--》實現(xiàn)3d汽車模型展覽搭建

    Three.js--》實現(xiàn)3d汽車模型展覽搭建

    目錄 項目搭建 初始化three.js基礎(chǔ)代碼 添加汽車模型展示 動態(tài)修改汽車模型 今天簡單實現(xiàn)一個three.js的小Demo,加強(qiáng)自己對three知識的掌握與學(xué)習(xí),只有在項目中才能靈活將所學(xué)知識運(yùn)用起來,話不多說直接開始。 項目搭建 本案例還是借助框架書寫three項目,借用vite構(gòu)建工具

    2024年02月06日
    瀏覽(379)
  • Three.js--》實現(xiàn)3d水晶小熊模型搭建

    Three.js--》實現(xiàn)3d水晶小熊模型搭建

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

    2024年02月06日
    瀏覽(100)
  • 微信小程序利用three.js展示3D模型部分問題

    微信小程序利用three.js展示3D模型部分問題

    由于小程序的內(nèi)存限制比較多,稍不注意就容易溢出,所以經(jīng)過測試后我選擇gltf模型。不用加載貼圖,而且這個格式較為通用,最關(guān)鍵的是真的很小。OBJ+PNG怎么轉(zhuǎn)GLTF格式在我上篇帖子內(nèi)有。 three.js有一個小程序?qū)S貌寮hreex,移植效果還不錯,但渲染出來的效果會差一點(diǎn),

    2024年02月08日
    瀏覽(91)
  • three.js加載3D模型,在網(wǎng)頁上展示3D模型(.glb.gltf.fbx格式)

    three.js加載3D模型,在網(wǎng)頁上展示3D模型(.glb.gltf.fbx格式)

    Three.js是一款開源的主流3D繪圖JS引擎,簡單點(diǎn),可以將它理解為three+js就可以了,three表示3D,js表示JavaScript的意思。 結(jié)構(gòu) ?.glb.gltf文件最好放在服務(wù)器上 放在本地容易報找不到的錯?.fbx格式文件可以在本地用3d看圖(win10自帶)打開另存為.glb格式 index.html代碼 js代碼 項目案例

    2024年02月11日
    瀏覽(101)
  • Three.js--》實現(xiàn)3D汽車展廳效果展示

    Three.js--》實現(xiàn)3D汽車展廳效果展示

    目錄 項目搭建 初始化three.js基礎(chǔ)代碼 加載汽車模型 設(shè)置展廳效果 設(shè)置GUI面板動態(tài)控制車身操作 車門操作與車身視角展示 設(shè)置手動點(diǎn)擊打開關(guān)閉車門 設(shè)置圖片背景 今天簡單實現(xiàn)一個three.js的小Demo,加強(qiáng)自己對three知識的掌握與學(xué)習(xí),只有在項目中才能靈活將所學(xué)知識運(yùn)用起

    2024年02月09日
    瀏覽(92)
  • Three.js--》實現(xiàn)圖片轉(zhuǎn)3D效果展示

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

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

    2024年02月08日
    瀏覽(88)
  • 微信小程序3D,使用Three.js在微信小程序中展示gltf模型,使用VisionKit展示AR能力

    微信小程序3D,使用Three.js在微信小程序中展示gltf模型,使用VisionKit展示AR能力

    本倉庫只開源gltf模型展示技術(shù),技術(shù)好的朋友有這些代碼就能幫助你解決很多問題了 如需要完整項目(基于若依框架開發(fā)的后端,AR能力前端)需另外付費(fèi)贊助, 聯(lián)系方式:QQ 790002517 微信公眾號:時不待我 https://github.com/zzy-life/Wechat3D Three.js Three.js is a JavaScript 3D library. thr

    2024年02月09日
    瀏覽(49)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包