最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue three.js創(chuàng)建地面并設(shè)置陰影實(shí)現(xiàn)示例

 更新時(shí)間:2022年08月31日 10:52:23   作者:djlun  
這篇文章主要為大家介紹了vue three.js創(chuàng)建地面并設(shè)置陰影實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jì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的球體

添加球體是為了看見光源的位置

調(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)文章

  • 詳解HTTP4種方法(GET、POST、 PUT和DELETE)

    詳解HTTP4種方法(GET、POST、 PUT和DELETE)

    本文介紹了HTTP協(xié)議中的四種方法:GET、POST、PUT和DELETE,分別用于不同的操作,GET用于獲取數(shù)據(jù),POST用于提交數(shù)據(jù),PUT用于創(chuàng)建或更新資源,DELETE用于刪除資源,每種方法都有其特點(diǎn)和適用場(chǎng)景,了解這些方法有助于更好地進(jìn)行數(shù)據(jù)交互和開發(fā),感興趣的朋友一起看看吧
    2025-02-02
  • Vue3動(dòng)態(tài)組件component不生效問題解決方法

    Vue3動(dòng)態(tài)組件component不生效問題解決方法

    動(dòng)態(tài)組件component是Vue中非常實(shí)用的一個(gè)功能,它可以根據(jù)條件動(dòng)態(tài)切換不同的組件,在Vue3中使用方法和Vue2基本一致,在vue3使用component動(dòng)態(tài)組件展示組件時(shí),組件就是不展示顯示空白,所以本文記錄了Vue3動(dòng)態(tài)組件component不生效問題解決方法,需要的朋友可以參考下
    2024-08-08
  • vue實(shí)現(xiàn)頁面內(nèi)容禁止選中功能,僅輸入框和文本域可選

    vue實(shí)現(xiàn)頁面內(nèi)容禁止選中功能,僅輸入框和文本域可選

    今天小編就為大家分享一篇vue實(shí)現(xiàn)頁面內(nèi)容禁止選中功能,僅輸入框和文本域可選,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 解決VUEX的mapState/...mapState等取值問題

    解決VUEX的mapState/...mapState等取值問題

    這篇文章主要介紹了解決VUEX的mapState/...mapState等取值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue3中如何使用Pinia實(shí)現(xiàn)數(shù)據(jù)持久化操作

    vue3中如何使用Pinia實(shí)現(xiàn)數(shù)據(jù)持久化操作

    使用vue3中的pinia,我們可以在多個(gè)頁面間共享數(shù)據(jù),但是一旦我們關(guān)閉或刷新頁面,這些數(shù)據(jù)就會(huì)丟失,因此,我們需要有一種數(shù)據(jù)持久化的解決方案,下面我們就來看看具體如何解決的吧
    2023-10-10
  • vue.js 實(shí)現(xiàn)圖片本地預(yù)覽 裁剪 壓縮 上傳功能

    vue.js 實(shí)現(xiàn)圖片本地預(yù)覽 裁剪 壓縮 上傳功能

    這篇文章主要介紹了vue.js 實(shí)現(xiàn)圖片本地預(yù)覽裁剪壓縮上傳功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-03-03
  • Vue必學(xué)知識(shí)點(diǎn)之forEach()的使用

    Vue必學(xué)知識(shí)點(diǎn)之forEach()的使用

    在前端開發(fā)中,經(jīng)常會(huì)遇到一些通過遍歷循環(huán)來獲取想要的內(nèi)容的情形,這時(shí)候就需要用到forEach()了,下面這篇文章主要給大家介紹了關(guān)于Vue必學(xué)知識(shí)點(diǎn)之forEach()使用的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • vue項(xiàng)目中axios如何捕捉http狀態(tài)碼為401錯(cuò)誤問題

    vue項(xiàng)目中axios如何捕捉http狀態(tài)碼為401錯(cuò)誤問題

    這篇文章主要介紹了vue項(xiàng)目中axios如何捕捉http狀態(tài)碼為401錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 解決VUE mounted 鉤子函數(shù)執(zhí)行時(shí) img 未加載導(dǎo)致頁面布局的問題

    解決VUE mounted 鉤子函數(shù)執(zhí)行時(shí) img 未加載導(dǎo)致頁面布局的問題

    這篇文章主要介紹了解決VUE mounted 鉤子函數(shù)執(zhí)行時(shí) img 未加載導(dǎo)致頁面布局的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue與django(drf)實(shí)現(xiàn)文件上傳下載功能全過程

    vue與django(drf)實(shí)現(xiàn)文件上傳下載功能全過程

    最近簡(jiǎn)單的學(xué)習(xí)了django和drf上傳文件(主要是圖片),做一個(gè)記錄,下面這篇文章主要給大家介紹了關(guān)于vue與django(drf)實(shí)現(xiàn)文件上傳下載功能的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論

肃南| 南江县| 汕头市| 连州市| 攀枝花市| 盐边县| 尚义县| 白城市| 建始县| 宽城| 海林市| 苏尼特右旗| 砀山县| 阜南县| 虎林市| 化隆| 龙南县| 涟水县| 布尔津县| 永年县| 聊城市| 锡林郭勒盟| 昆明市| 平遥县| 云浮市| 班戈县| 大埔区| 巩义市| 叙永县| 油尖旺区| 社旗县| 莫力| 太仆寺旗| 松溪县| 漳州市| 渭南市| 赤峰市| 竹溪县| 襄城县| 正镶白旗| 台南市|