vue three.js創(chuàng)建地面并設(shè)置陰影實(shí)現(xiàn)示例
正文
今天學(xué)習(xí)的是用vue和three.js創(chuàng)建一個(gè)地面,并設(shè)置地面上物體的陰影。
演示gif圖如下:

準(zhǔn)備一個(gè)容器
<div class="item">
<div id="THREE20"></div>
</div>
mounted方法
mounted() {
this.initThreejs();
},
下面是initThreejs的代碼:
定義參數(shù)并執(zhí)行方法
camera - 相機(jī)
scene - 場(chǎng)景
renderer - 渲染器
initThreejs() {
let camera, scene, renderer;
init();
animate();
function init() {
...
}
function animate() {
...
}
}
下面是init()的代碼
獲取容器
const container = document.getElementById("THREE20");
創(chuàng)建相機(jī)
透視相機(jī) - PerspectiveCamera(參數(shù):相機(jī)垂直方向的角度,相機(jī)圖像的長(zhǎng)寬比,視錐體近端面,視錐體遠(yuǎn)端面),網(wǎng)上隨便找了張圖示意一下,侵刪

同時(shí)設(shè)置該相機(jī)的位置為(-40,40,20)
camera = new THREE.PerspectiveCamera( 50, (window.innerWidth - 201) / window.innerHeight, 0.1, 500 ); camera.position.x = -40; camera.position.z = 40; camera.position.y = 20;
創(chuàng)建場(chǎng)景
創(chuàng)建一個(gè)背景顏色為淡藍(lán)色(0x8cc7de)的場(chǎng)景
scene = new THREE.Scene(); scene.background = new THREE.Color(0x8cc7de);
創(chuàng)建一個(gè)點(diǎn)光源
SphereGeometry - 創(chuàng)建了一個(gè)半徑為0.2的球體
添加球體是為了看見(jiàn)光源的位置
調(diào)整光功率的大小可以改變?cè)摴庠吹牧炼?/p>
const bulbGeometry = new THREE.SphereGeometry(0.2, 16, 8); // 球體
const bulbLight = new THREE.PointLight(0xffee88, 1, 100, 2); // 點(diǎn)光源
const bulbMat = new THREE.MeshStandardMaterial({
emissive: 0xffffee, // 材質(zhì)的放射(光)顏色,基本上是不受其他光照影響的固有顏色
emissiveIntensity: bulbLight.intensity / Math.pow(0.02, 2.0), // 放射光強(qiáng)度,將光源表面的強(qiáng)度轉(zhuǎn)換為輻照度
color: 0x000000,
});
bulbLight.add(new THREE.Mesh(bulbGeometry, bulbMat)); // 在光源的位置添加一個(gè)有反射光的球體
bulbLight.position.set(-14, 20, -14);
bulbLight.castShadow = true; // 這個(gè)光源照射的對(duì)象是否有陰影
bulbLight.power = 20000; // 光功率
scene.add(bulbLight);
創(chuàng)建一個(gè)半球光
創(chuàng)建一個(gè)天空發(fā)出0xddeeff淺藍(lán)色光源,大地發(fā)出0x0f0e0d黑色光源的半球光
半球光的光照強(qiáng)度越強(qiáng),整個(gè)環(huán)境就越亮
const hemiLight = new THREE.HemisphereLight(0xddeeff, 0x0f0e0d, 0.02); hemiLight.intensity = 5; // 半球光的光照強(qiáng)度 scene.add(hemiLight);
創(chuàng)建地面
創(chuàng)建一個(gè)長(zhǎng)300,寬300,高0.01的長(zhǎng)方體,將其旋轉(zhuǎn)90度作為地面
const floorMat = new THREE.MeshStandardMaterial({
color: 0xa9a9a9, // 材質(zhì)的顏色
});
const floorGeometry = new THREE.BoxGeometry(300, 300, 0.01, 1, 1, 1);
const floorMesh = new THREE.Mesh(floorGeometry, floorMat);
floorMesh.receiveShadow = true;
floorMesh.rotation.x = -Math.PI / 2.0;
scene.add(floorMesh);
創(chuàng)建一個(gè)立方體模型
創(chuàng)建一個(gè)邊長(zhǎng)為5的立方體模型,將其放置在地面上,并設(shè)置可顯示陰影
const cubeMat = new THREE.MeshStandardMaterial({
color: 0xff0000,
});
const boxGeometry = new THREE.BoxGeometry(5, 5, 5);
const boxMesh = new THREE.Mesh(boxGeometry, cubeMat);
boxMesh.position.set(-1, 2.49, -1);
boxMesh.castShadow = true; // 顯示陰影
scene.add(boxMesh);
創(chuàng)建渲染器
對(duì)應(yīng)參數(shù)的解釋都在代碼中注釋了,physicallyCorrectLights設(shè)置為true必不可少
renderer = new THREE.WebGLRenderer(); renderer.physicallyCorrectLights = true; // 是否使用物理上正確的光照模式 renderer.outputEncoding = THREE.sRGBEncoding; // 定義渲染器的輸出編碼 renderer.shadowMap.enabled = true; // 允許在場(chǎng)景中使用陰影 renderer.toneMapping = THREE.ReinhardToneMapping; renderer.setPixelRatio(window.devicePixelRatio); // 設(shè)置設(shè)備像素比 renderer.setSize(window.innerWidth - 201, window.innerHeight); // 將輸出canvas的大小調(diào)整為(width, height) renderer.toneMappingExposure = 0.2; // 色調(diào)映射的曝光級(jí)別 container.appendChild(renderer.domElement);
創(chuàng)建控制器
用鼠標(biāo)控制視角的變化
minDistance和maxDistance可以配合地面的長(zhǎng)寬以及相機(jī)的位置作修改
const controls = new OrbitControls(camera, renderer.domElement); controls.minDistance = 1; // 你能夠?qū)⑾鄼C(jī)向內(nèi)移動(dòng)多少 controls.maxDistance = 100; // 你能夠?qū)⑾鄼C(jī)向外移動(dòng)多少
以上init()的代碼結(jié)束
下面是animate()的代碼:
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}以上就是vue three.js創(chuàng)建地面并設(shè)置陰影實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于vue three.js創(chuàng)建地面設(shè)置陰影的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue利用vue meta info設(shè)置每個(gè)頁(yè)面的title與meta信息
這篇文章主要給大家介紹了關(guān)于vue如何利用vue meta info設(shè)置每個(gè)頁(yè)面的title與meta信息的相關(guān)資料,文中將實(shí)現(xiàn)的方法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-10-10
Vue 進(jìn)入/離開(kāi)動(dòng)畫(huà)效果
這篇文章主要介紹了Vue 進(jìn)入/離開(kāi)動(dòng)畫(huà)效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-12-12
Vue+Element的后臺(tái)管理框架的整合實(shí)踐
本文主要介紹了Vue+Element的后臺(tái)管理框架,在框架上,領(lǐng)導(dǎo)要用AdminLTE這套模板,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
vue在路由中驗(yàn)證token是否存在的簡(jiǎn)單實(shí)現(xiàn)
今天小編就為大家分享一篇vue在路由中驗(yàn)證token是否存在的簡(jiǎn)單實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
vue3中watch和watchEffect實(shí)戰(zhàn)梳理
這篇文章主要介紹了vue3中watch和watchEffect實(shí)戰(zhàn)梳理,watch和watchEffect都是vue3中的監(jiān)聽(tīng)器,但是在寫(xiě)法和使用上是有區(qū)別的。下文介紹他們之間的方法及區(qū)別,需要的朋友可以參考一下2022-07-07
Vue Object 的變化偵測(cè)實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue Object的變化偵測(cè)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
vue中如何實(shí)現(xiàn)拖拽調(diào)整順序功能
這篇文章主要介紹了vue中如何實(shí)現(xiàn)拖拽調(diào)整順序功能問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

