Three.js初學(3)

Three.js初學(3)

  • 動畫渲染循環
    • 1. 請求動畫幀
    • 2. 旋轉動畫
  • Canvas畫布布局和全屏
  • 常見幾何體
  • 渲染器設置
  • GUI.js庫
    • 1. 庫的引入
    • 2. 如何使用
      • 初步調試
      • 進階調試
      • 界面分組

動畫渲染循環

1. 請求動畫幀

requestAnimationFrame實現周期性循環執行
requestAnimationFrame默認每秒鐘執行60次,但不一定能做到,要看代碼的性能,對于部分高刷新率的電腦硬件設備,也是有可能超過60次的。

let i = 0;
function render() {i+=1;console.log('執行次數'+i);requestAnimationFrame(render);//請求再次執行函數render
}
render();

2. 旋轉動畫

動畫說白了就是一張張照片,連起來依次展示,這樣就形成一個動畫效果,只要幀率高,人的眼睛就感覺不到卡頓,是連續的視頻效果。以下案例代碼會將幾何體沿著y軸旋轉。rotateY會影響幾何體旋轉的速度,你也寫成rotateX/Z

// 渲染函數
function render() {renderer.render(scene, camera); //執行渲染操作mesh.rotateY(0.01);//每次繞y軸旋轉0.01弧度requestAnimationFrame(render);//請求再次執行渲染函數render,渲染下一幀
}
render();

設置了渲染循環,相機控件OrbitControls就不用再通過事件change執行renderer.render(scene, camera);,畢竟渲染循環一直在執行。

Canvas畫布布局和全屏

threejs渲染輸出的結果就是一個Cavnas畫布,canvas畫布也是HTML的元素之一,這意味著three.js渲染結果的布局和普通web前端習慣是一樣的。

全屏布局

const width = window.innerWidth; //窗口文檔顯示區的寬度作為畫布寬度
const height = window.innerHeight; //窗口文檔顯示區的高度作為畫布高度
document.body.appendChild(renderer.domElement);

同時要注意全局的css樣式設置

<style>body{overflow: hidden;margin: 0px;}
</style>

常見幾何體

在這里插入圖片描述
three.js的材質默認正面可見,反面不可見,對于矩形平面PlaneGeometry、圓形平面如果你想看到兩面,可以設置side: THREE.DoubleSide

new THREE.MeshBasicMaterial({side: THREE.DoubleSide, //兩面可見
});

在這里插入圖片描述

渲染器設置

渲染器鋸齒屬性

可以使得渲染的幾何體質量更好更清晰一點。

const renderer = new THREE.WebGLRenderer({antialias:true,
});

設置設備像素比

如果你在渲染的過程中需要畫布顯示不清晰或者模糊的問題

// 獲取你屏幕對應的設備像素比.devicePixelRatio告訴threejs,以免渲染模糊問題
renderer.setPixelRatio(window.devicePixelRatio);

設置背景顏色

renderer.setClearColor(0x444444, 1); //設置背景顏色

效果如下圖所示:

在這里插入圖片描述

GUI.js庫

它是一個前端庫,對HTML、CSS和JavaScript進行了封裝,可以借助dat.gui.js快速創建控制三維場景的UI交互界面。

1. 庫的引入

github地址:https://github.com/dataarts/dat.gui

npm地址:https://www.npmjs.com/package/dat.gui

當然threejs官方案例擴展庫中也提供了gui.js

// 引入dat.gui.js的一個類GUI
import { GUI } from 'three/addons/libs/lil-gui.module.min.js';

2. 如何使用

初步調試

創建GUI對象

創建完成之后運行,就會發現右上角多了一個交互界面。

// 實例化一個gui對象
const gui = new GUI();

改變GUI界面默認的style屬性

//改變交互界面style屬性
gui.domElement.style.right = '0px';
gui.domElement.style.width = '300px';

.add()方法

執行gui.add()方法可以快速創建一個UI交互界面,可以用來改變一個JavaScript對象屬性的屬性值。
格式:.add(控制對象,對象具體屬性,其他參數)

//創建一個對象,對象屬性的值可以被GUI庫創建的交互界面改變
const obj = {x: 30,y: 60,z: 30,
};
// gui界面上增加交互界面,改變obj對應屬性
gui.add(obj, 'x', 0, 100); 
gui.add(obj, 'y', 0, 100);
gui.add(obj, 'z', 0, 100);

后面的兩個參數,代表著這個拖動條的區間范圍數值。但這個時候拖動只有數值變化,幾何體位置依然不變,如果想要變化,就將obj對象換成mesh.position或者可以使用onchange方法。

gui.add(mesh.position, 'x', 0, 100);
gui.add(obj, 'x', 0, 100).onChange(function(value){mesh.position.x = value;// 你可以寫任何你想跟著obj.x同步變化的代碼
});

光照強度的調試

在調試場景渲染效果的時候,比如光照的強度,人大腦的CPU是沒有能力通過光照參數算出來模型渲染效果的,一般來說你先大概給一個經驗值,然后通過gui在這個大概值的基礎上下浮動可視化調試。

// 光照強度屬性.intensity
console.log('ambient.intensity',ambient.intensity);
// 通過GUI改變mesh.position對象的xyz屬性
gui.add(ambient, 'intensity', 0, 2.0);

ambient是我們之前所設置的環境光,詳情可看我的 另一篇博客

進階調試

.name()方法

在創建的交互界面之后,會默認顯示所改變屬性的名字,為了通過交互界面更好理解你改變的某個對象屬性,可以通過.name()方法改變gui生成交互界面顯示的內容。

gui.add(ambient, 'intensity', 0, 100.0).name('環境光強度');
gui.add(pointLight, 'intensity', 0, 10.0).name('點光源強度');
gui.add(directionalLight, 'intensity', 0, 50.0).name('平行光強度');

步長.step()方法

可以設置交互界面每次改變屬性值間隔是多少。

gui.add(mesh.position, 'x', 0, 100).name('X軸').step(1.0);
gui.add(mesh.position, 'y', 0, 100).name('Y軸').step(1.0);
gui.add(mesh.position, 'z', 0, 100).name('Z軸').step(1.0);

.addColor()顏色值改變

生成幾何體顏色值改變的交互界面。

const obj = {color:0xff0000,
};
// .addColor()生成顏色值改變的交互界面
gui.addColor(obj, 'color').onChange(function(value){mesh.material.color.set(value);
});

.add()方法進階

之前我們所提到的.add()方法,后面的參數不僅僅可以是數字,還可以是數組,布爾值甚至是對象。

  • 數組
const obj = {scale: 0,
};
// 參數3數據類型:數組(下拉菜單)
gui.add(obj, 'scale', [-100, 0, 100]).name('y坐標').onChange(function (value) {mesh.position.y = value;
});
  • 布爾值
const obj = {bool: false,
};
gui.add(obj, 'bool').name('旋轉動畫');// 渲染循環
function render() {// 當gui界面設置obj.bool為true,mesh執行旋轉動畫if (obj.bool) mesh.rotateY(0.01);renderer.render(scene, camera);requestAnimationFrame(render);
}
render();
  • 對象
const obj = {scale: 0,
};
// 參數3數據類型:對象(下拉菜單)
gui.add(obj, 'scale', {left: -100,center: 0,right: 100// 左: -100,//可以用中文// 中: 0,// 右: 100
}).name('位置選擇').onChange(function (value) {mesh.position.x = value;
});

界面分組

當GUI交互界面需要控制的屬性比較多的時候,為了避免混合,可以適當分組管理,這樣更清晰。

通過gui對象的.addFolder()方法可以創建一個子菜單,當你通過GUI控制的屬性比較多的時候,可以使用.addFolder()進行分組。

const pos = gui.addFolder("位置");
pos.add(mesh.position, 'x', 0, 100).name('X軸').step(1.0);
pos.add(mesh.position, 'y', 0, 100).name('Y軸').step(1.0);
pos.add(mesh.position, 'z', 0, 100).name('Z軸').step(1.0);const lightFolder = gui.addFolder('光源');
lightFolder.add(ambient, 'intensity', 0, 100.0).name('環境光強度').step(1.0);
lightFolder.add(pointLight, 'intensity', 0, 10.0).name('點光源強度').step(1.0);
lightFolder.add(directionalLight, 'intensity', 0, 50.0).name('平行光強度').step(1.0);

子菜單都可以用代碼控制交互界面關閉或開展狀態。

gui.close();//關閉菜單
gui.open(); //打開菜單

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697189.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode | 整數反轉 C語言

Problem: 7. 整數反轉 文章目錄 思路解題方法Code結果 思路 運算部分 while(x > 0) {y x % 10;y * 10;x / 10; } y / 10;對于大于32位的數要用long int類型的變量保存用pow算-2的31次方和2的31次方-1。 解題方法 由思路得 Code int reverse(long int x){long int y …

web前端安全性——iframe安全問題

1、概念 iframe安全問題可稱作界面劫持&#xff0c;像點擊劫持、拖放劫持、觸屏劫持。就是我們的點擊&#xff0c;拖放&#xff0c;觸屏操作被劫持了&#xff0c;而去操作了其它的透明隱藏的界面。 **原理是利用透明層iframe,使用了CSS中的opacity或z-index等屬性&#xff0c;…

快速構建 Debezium MySQL Example 數據庫

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

突破編程_C++_面試(指針(1))

面試題 1 &#xff1a;什么是空指針&#xff1f; 在 C 中&#xff0c;空指針是一個特殊的指針值&#xff0c;它不指向任何有效的內存地址。空指針通常用于表示指針不指向任何對象或函數。在C11及以后的版本中&#xff0c; nullptr 是表示空指針的推薦方式。 nullptr 是一個指針…

AI繪畫與修圖:重塑數字藝術的新紀元

文章目錄 一、AI繪畫與修圖的原理二、AI繪畫的應用三、AI修圖的優勢四、面臨的挑戰五、未來發展趨勢《AI繪畫與修圖實戰&#xff1a;PhotoshopFirefly從入門到精通 輕松玩轉AI繪畫與修圖實戰》亮點內容簡介作者簡介 隨著人工智能技術的飛速發展&#xff0c;AI繪畫與修圖已經成為…

如何理解和區分訓練集、測試集和驗證集

如何理解和區分訓練集、測試集和驗證集 &#x1f308; 個人主頁&#xff1a;高斯小哥 &#x1f525; 高質量專欄&#xff1a;Matplotlib之旅&#xff1a;零基礎精通數據可視化、Python基礎【高質量合集】 &#x1f4a1; 創作高質量博文&#xff0c;分享更多關于深度學習、PyTor…

靡語IT:Vue精講(一)

Vue簡介 發端于2013年的個人項目&#xff0c;已然成為全世界三大前端框架之一&#xff0c;在中國大陸更是前端首選。 它的設計思想、編碼技巧也被眾多的框架借鑒、模仿。 紀略 2013年&#xff0c;在Google工作的尤雨溪&#xff0c;受到Angular的啟發&#xff0c;從中提取自…

soc(十七) SOC市場分類

桌面服務器集中式服務器架構和基于ARM微服務器架構的存儲差別在哪&#xff1f; http://www.dostor.com/p/54167.html 手機飛行器汽車家庭監控安防路由器

【前端素材】推薦優質后臺管理系統Protable平臺模板(附源碼)

一、需求分析 后臺管理系統是一種用于管理和監控網站、應用程序或系統的在線工具。它通常是通過網頁界面進行訪問和操作&#xff0c;用于管理網站內容、用戶權限、數據分析等。當我們從多個層次來詳細分析后臺管理系統時&#xff0c;可以將其功能和定義進一步細分&#xff0c;…

華為配置CAPWAP雙棧覆蓋業務示例

配置CAPWAP雙棧覆蓋業務示例 組網圖形 圖1 配置CAPWAP雙棧覆蓋業務示例組網圖 業務需求組網需求數據規劃配置思路配置注意事項操作步驟配置文件 業務需求 企業用戶接入WLAN網絡&#xff0c;以滿足移動辦公的最基本需求。且在覆蓋區域內移動發生漫游時&#xff0c;不影響用戶的業…

解決 PLC QModbusTcpClient 通信自動斷開

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 例如&#xff1a;項目場景&#xff1a;QModbusTcpClient 通信 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1a; QModbusTcpClient 連接后&#xff0c;稍微停一段時間&#xff0c;就…

LeetCode10. Regular Expression Matching——完全背包

文章目錄 一、題目二、題解 一、題目 Given an input string s and a pattern p, implement regular expression matching with support for ‘.’ and ‘*’ where: ‘.’ Matches any single character.???? ‘*’ Matches zero or more of the preceding element. The…

【selenium】三大切換 iframe 彈窗alert 句柄window 和 鼠標操作

目錄 一、iframe 1、切換方式&#xff1a; 1、第一種情況&#xff1a; 2、第二種情況&#xff1a; 方式1: 先找到iframe&#xff0c;定位iframe元素&#xff08;可以通過元素定位的各種方式&#xff1a;xpath&#xff0c;css等等&#xff09;&#xff0c;用對象接收&…

MyBatis Plus中的動態表名實踐

隨著數據庫應用的不斷發展&#xff0c;面對復雜多變的業務需求&#xff0c;動態表名的處理變得愈發重要。在 MyBatis Plus&#xff08;以下簡稱 MP&#xff09;這一優秀的基于 MyBatis 的增強工具的支持下&#xff0c;我們可以更便捷地應對動態表名的挑戰。本文將深入研究如何在…

美創新一代數據安全管理平臺宣傳片「龍」重登場

美創新一代數據安全管理平臺&#xff08;DSM Cloud&#xff09;產品宣傳片 國產化、混合多云環境催生愈加復雜的數據安全防護、管理及可持續運營挑戰。 美創新一代數據安全管理平臺&#xff08;DSM Cloud&#xff09;&#xff0c;圍繞韌性數據安全體系&#xff0c;聚焦全域數據…

[HTML]Web前端開發技術27(HTML5、CSS3、JavaScript )JavaScript基礎——喵喵畫網頁

希望你開心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你點贊&#xff01; 最后的最后&#xff0c;關注喵&#xff0c;關注喵&#xff0c;關注喵&#xff0c;佬佬會看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你對我真的…

activeMq將mqtt發布訂閱轉成消息隊列

1、activemq.xml置文件新增如下內容 2、mqttx測試發送&#xff1a; 主題&#xff08;配置的模糊匹配&#xff0c;為了并發&#xff09;&#xff1a;VirtualTopic/device/sendData/12312 3、mqtt接收的結果 4、程序處理 package comimport cn.hutool.core.date.DateUtil; imp…

ReactNative進階(二十三)error: no type or protocol named ‘RCTBridgeModule’問題修復

文章目錄 一、前言三、拓展閱讀 一、前言 Jenkins組包RN技術棧實現的iOS應用時&#xff0c;遇到以下錯誤提示信息&#xff1a; error: no type or protocol named ‘RCTBridgeModule’ interface RCTEventDispatcher : NSObject <RCTBridgeModule>error: cannot find i…

【AIGC】基于深度學習的圖像生成與增強技術

摘要&#xff1a; 本論文探討基于深度學習的圖像生成與增強技術在圖像處理和計算機視覺領域的應用。我們綜合分析了主流的深度學習模型&#xff0c;特別是生成對抗網絡&#xff08;GAN&#xff09;和變分自編碼器&#xff08;VAE&#xff09;等&#xff0c;并就它們在實際應用中…

嵌入式linux開發 (三十四) 內存管理2.0(6) 各種段(.code .rodata .data .bss .stack .heap)的含義

我們知道, 邏輯程序在連接的時候在elf 文件中會有 .code .rodata .data 然后在內存中才會有 .code .rodata .data那么為什么鏈接器在鏈接生成的elf文件中會有這些段呢?這涉及到鏈接器的歷史問題