three.js場景三元素

three.js是一個基于WebGL的輕量級、易于使用的3D庫。它極大地簡化了WebGL的復雜細節,降低了學習成本,同時提高了性能。

three.js的三大核心元素:

  1. 場景(Scene)

    • 場景是一個三維空間,是所有物品的容器。可以將其想象成一個空房間,里面可以放置要呈現的物體、相機、光源等。
    • 使用方法:通過new THREE.Scene()來創建一個新的場景。
/**1. 創建場景  -- 放置物體對象的環境*/
const scene = new THREE.Scene();
  1. 相機(Camera)
    相機用來確定觀察位置、方向、角度。相機看到的內容,就是最終在屏幕上看到的內容。
    three.js中常用的相機類型包括:
    透視投影相機(PerspectiveCamera):模擬人眼看到的效果,近大遠小。通過指定視野(Field of View,FOV)、長寬比、近端渲染距離和遠端距離來創建。
    例如:new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000)
/** 2.創建相機(這里是 透視攝像機--用來模擬人眼所看到的景象)*/
const camera = new THREE.PerspectiveCamera(75, // 視野角度window.innerWidth / window.innerHeight, // 長寬比0.1, // 進截面1000 // 遠截面
);
// 設置相機位置
camera.position.set(0, 0, 10);
scene.add(camera); // 將相機添加到場景中

在這里插入圖片描述

  • 使用THREE.PerspectiveCamera構造函數創建一個新的透視相機實例。
  • 75:視野角度(Field of View,簡稱FOV),表示相機“看到”的角度范圍。這里設置為75度。
  • window.innerWidth / window.innerHeight:相機的縱橫比(Aspect Ratio),通常設置為窗口的寬度與高度的比值,以確保渲染的圖像不會拉伸或壓縮。
  • 0.1:近裁剪面(Near Clipping Plane),表示相機能夠“看到”的最近距離。小于這個距離的物體將不會被渲染。
  • 1000:遠裁剪面(Far Clipping Plane),表示相機能夠“看到”的最遠距離。大于這個距離的物體將不會被渲染。
  • 使用camera.position.set()方法設置相機的位置。這里的坐標是(0, 0, 10),意味著相機位于世界坐標的原點上方10個單位的位置(在Z軸上)。在3D空間中,這通常意味著相機是“俯視”場景的。
    正交投影相機(OrthographicCamera):遠近都是一樣的大小,三維空間中平行的線,投影到二維空間也一定是平行的。
    在程序運行過程中,可以調整相機的位置、方向、角度。
// 假設你已經有一個場景(scene)對象  // 創建正交相機  
const camera = new THREE.OrthographicCamera(  left, // 相機左平面  right, // 相機右平面  top, // 相機上平面  bottom, // 相機下平面  near, // 近裁剪面  far // 遠裁剪面  
);  // 設定相機位置(對于正交相機來說,這不是必需的,但通常你需要設置它以獲得期望的視角)  
camera.position.set(0, 0, 10);  // 將相機添加到場景中(注意:相機通常不直接添加到場景中,而是由渲染器使用)  
// 但在這里,如果你只是為了存儲它或做其他操作,你可以這樣做  
// scene.add(camera); // (這通常是不必要的)  

為了設置正交相機的參數,你需要定義六個值:

  • left:相機左平面與視圖的左邊界的距離。
  • right:相機右平面與視圖的右邊界的距離。
  • top:相機上平面與視圖的上邊界的距離。
  • bottom:相機下平面與視圖的下邊界的距離。
  • near:近裁剪面,相機能夠“看到”的最近距離。
  • far:遠裁剪面,相機能夠“看到”的最遠距離。
    在實際使用中,你可能需要根據你的場景大小和所需的視圖范圍來計算這些值。例如,如果你想要一個與窗口寬度和高度匹配的正交視圖,你可以這樣設置:
const aspectRatio = window.innerWidth / window.innerHeight;  
const width = 10; // 假設你想要的視圖寬度為10個單位  
const height = width / aspectRatio; // 計算視圖高度以保持相同的寬高比  const camera = new THREE.OrthographicCamera(  -width / 2, // left  width / 2, // right  height / 2, // top  -height / 2, // bottom  1, // near  1000 // far  
);

在這里插入圖片描述

  1. 渲染器(Renderer)

    • 渲染器是用來通過相機把畫面渲染到屏幕上的組件。
    • 使用方法:創建一個WebGL渲染器實例,設置渲染的尺寸大小,然后將渲染器的canvas內容添加到HTML文檔的body中。
    • 例如:使用new THREE.WebGLRenderer()來創建一個WebGL渲染器,并通過renderer.setSize(width, height)設置渲染尺寸,最后使用document.body.appendChild(renderer.domElement)將渲染的canvas添加到頁面中。
      以下是如何創建一個THREE.WebGLRenderer并將其添加到HTML文檔中的基本步驟:
      1.創建渲染器實例:
      使用new THREE.WebGLRenderer()來創建一個新的WebGL渲染器實例。
      2.設置渲染器尺寸:
      使用renderer.setSize(width, height)方法來設置渲染器的寬度和高度。這通常與HTML元素的尺寸相匹配,例如元素。
      3.將渲染器的DOM元素添加到HTML文檔中:
      渲染器會創建一個canvas元素,你可以通過renderer.domElement訪問它。將這個canvas元素添加到HTML文檔的某個位置,通常是body元素內。
      4.渲染場景:
      使用renderer.render(scene, camera)方法來渲染場景。這個方法需要兩個參數:場景(Scene)和相機(Camera)。它會將相機視角下的場景內容渲染到渲染器的canvas元素上。
      下面是一個簡單的示例代碼:
// 假設你已經有了場景(scene)和相機(camera)// 1. 創建渲染器實例
const renderer = new THREE.WebGLRenderer();// 2. 設置渲染器尺寸(通常與canvas元素或窗口大小匹配)
renderer.setSize(window.innerWidth, window.innerHeight);// 3. 將渲染器的DOM元素添加到HTML文檔中
document.body.appendChild(renderer.domElement);// 4. 渲染場景
renderer.render(scene, camera);// 注意:你可能還需要一個動畫循環來持續更新和渲染場景
function animate() {requestAnimationFrame(animate); // 請求下一個動畫幀// 更新場景中的物體(如果需要)// ...// 渲染場景renderer.render(scene, camera);
}
animate();// 另外,你可能還需要處理窗口大小變化事件來更新渲染器尺寸
window.addEventListener('resize', onWindowResize, false);
function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight; // 更新相機縱橫比(如果需要)camera.updateProjectionMatrix(); // 更新投影矩陣renderer.setSize(window.innerWidth, window.innerHeight); // 更新渲染器尺寸
}

在這個示例中,animate函數使用requestAnimationFrame來創建一個動畫循環,該循環在每個動畫幀中更新場景并渲染它。同時,還添加了一個事件監聽器來處理窗口大小變化事件,以確保渲染器的尺寸與窗口尺寸保持一致。

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

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

相關文章

安卓速度下載v1.0.5/聚合短視頻解析下載

功能特色 短視頻下載與高級管理 – 支持短視頻下載,為您提供一系列高級視頻管理功能包括視頻內容提取、智能防重復技術、視頻體積壓縮以及視頻轉換成GIF圖片等; 磁-力鏈接下載升級 – 現支持磁力鏈接下載,實現邊下載邊播放的便捷體驗&#x…

構建基于LLMs混合型大模型的先進事實性問答系統架構

1.引言 傳統搜索系統基于關鍵字匹配,缺少對用戶問題理解和答案二次處理能力。本文探索使用大語言模型(Large Language Model, LLM),通過其對自然語言理解(Natural Language Understanding,NLU)…

阿里云常用的操作

阿里云常見的產品和服務 容器服務 可以查看容器日志、監控容器cpu和內存, 日志服務 SLS 可以查看所有服務的日志, Web應用防火墻 WAF 可以查看 QPS. 阿里云查看集群: 點擊 “產品和服務” 中的 容器服務,可以查看 集群列表&…

linux server下人臉檢測與識別服務程序的系統架構設計

一、緒論 1.1 定義 1.2 研究背景及意義 1.3 相關技術綜述 二、人臉檢測與識別技術概述 2.1 人臉檢測原理與算法 2.2 人臉識別技術及方法 2.3 人臉識別過程簡介 三、人臉檢測與識別服務程序的系統架構 3.1 系統架構設計 3.2 技術實現流程 四、后續設計及經驗瞎談 4.…

解釋Java中的抽象類、接口、重載和重寫等核心概念

Java中的抽象類、接口、重載和重寫等核心概念詳解 在Java編程中,抽象類、接口、重載和重寫是面向對象編程的四個核心概念。這些概念不僅構成了Java編程語言的基礎,也是面試官在面試過程中經常考察的要點。下面,我將從技術難點、面試官關注點…

字符串

對應練習題&#xff1a;力扣平臺 14. 最長公共前綴 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string strs1strs[0];//初始前綴字符串for (int i 1; i < strs.size(); i) {while(strs[i].find(strs1)!0)//遍歷找到共同最長前…

第五節:如何使用其他注解方式從IOC中獲取bean(自學Spring boot 3.x的第一天)

大家好&#xff0c;我是網創有方&#xff0c;上節我們實踐了通過Bean方式聲明Bean配置。咱們這節通過Component和ComponentScan方式實現一個同樣功能。這節實現的效果是從IOC中加載Bean對象&#xff0c;并且將Bean的屬性打印到控制臺。 第一步&#xff1a;創建pojo實體類studen…

Android進階之路 - DialogFragment有沒有了解的必要?

幾個月前寫到了彈框業務&#xff0c;以前經常用Dialog、ButtomDialog 、popupWindow 組件&#xff0c;為了契合項目結構參考了原有的 DialogFragment 組件&#xff0c;特此予以記錄 我一般在項目中寫彈框組件的話&#xff0c;主要用到 alertDialog、popupWindow 組件&#xff0…

面試經驗分享 | 滲透測試工程師(實習崗)

所面試的公司&#xff1a;某安全廠商 所在城市&#xff1a;南京 面試職位&#xff1a;滲透測試工程師實習崗位 面試過程&#xff1a; 騰訊會議&#xff08;視頻&#xff09; 面試過程&#xff1a;整體流程就是自我介紹加上一些問題問題balabalabala。。。由于面的崗位是滲透…

用GPT-4糾錯GPT-4 OpenAI推出CriticGPT模型

根據OpenAI周四&#xff08;6月27日&#xff09;發布的新聞稿&#xff0c;該公司新推出了一個基于GPT-4的模型——CriticGPT&#xff0c;用于捕獲ChatGPT代碼輸出中的錯誤。CriticGPT的作用相當于讓人們用GPT-4來查找GPT-4的錯誤。該模型可以對ChatGPT響應結果做出批評評論&…

有沒有能用藍牙的游泳耳機,性能超凡的4大游泳耳機力薦

在現代科技的推動下&#xff0c;越來越多具備藍牙功能的游泳耳機正在改變游泳愛好者的體驗方式。這些創新產品不僅在防水性能上有了顯著提升&#xff0c;還能讓您在水中享受到高質量的音樂。然而&#xff0c;選擇一款優秀的藍牙游泳耳機并不簡單&#xff0c;需要考慮到防水等級…

【秋招突圍】2024屆秋招筆試-科大筆試題-01-三語言題解(Java/Cpp/Python)

&#x1f36d; 大家好這里是清隆學長 &#xff0c;一枚熱愛算法的程序員 ? 本系計劃跟新各公司春秋招的筆試題 &#x1f4bb; ACM銀牌&#x1f948;| 多次AK大廠筆試 &#xff5c; 編程一對一輔導 &#x1f44f; 感謝大家的訂閱? 和 喜歡&#x1f497; 文章目錄 &#x1f4d6…

基于SSM的大學生家教管理系統【附源碼+LW】

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本大學生家教平臺就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信息&a…

c語言--指針

前言 歡迎來到我的博客 個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客 本文整理c語言中指針的相關知識點。 指針概念 指針存儲的就是數據的地址。 直觀理解: 李華家是北洋路130號1單元101 用變量處理數據: 我們去李華家拿數據。 用指針處理數據: 我們去北洋路130號1單元101拿數據…

Paragon NTFS與Tuxera NTFS有何區別 Mac NTFS 磁盤讀寫工具選哪個好

macOS系統雖然以穩定、安全系數高等優點著稱&#xff0c;但因其封閉性&#xff0c;不能對NTFS格式磁盤寫入數據常被人們詬病。優質的解決方案是使用磁盤管理軟件Paragon NTFS for Mac&#xff08;點擊獲取激活碼&#xff09;和Tuxera NTFS&#xff08;點擊獲取激活碼&#xff0…

2024年科技型中小企業申報指南

01 什么是科技型中小企業 科技型中小企業是指依托一定數量的科技人員從事科學技術研究開發活動&#xff0c;取得自主知識產權并將其轉化為高新技術產品或服務&#xff0c;從而實現可持續發展的中小企。 02 申請“科技型中小企業”的好處 一、政策扶持與優惠 1.稅收減免&…

Vue2組件傳值(通信)的方式

1.父傳后代 ( 后代拿到了父的數據 ) 1. 父組件引入子組件&#xff0c;綁定數據 <List :str1‘str1’></List> 子組件通過props來接收props:{str1:{type:String,default:}}***這種方式父傳子很方便&#xff0c;但是父傳給孫子輩分的組件就很麻煩&#xff08;父》子…

《GPT模型揭秘:數據驅動AI的核心概念與GPT系列對比分析》

DS&#xff1a;《What Are the Data-Centric AI Concepts behind GPT Models?通過三個數據為中心的人工智能目標(訓練數據開發、推理數據開發和數據維護)揭示GPT模型背后的數據為中心的人工智能概念》解讀—GPT-1/GPT-2/GPT-3系列對比(語料大小參數量解碼層數上下文長度隱藏層…

技術學習的奧秘與樂趣

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 在當今快速發展的科技時代&#xff0c;學習技術已經成為了許多人追求的重要目標之一。無論是為了個人發展&#…

并發編程基礎概念

相關概念 并行 并行是指同一個時刻&#xff0c;多個任務同時進行。只有在多核CPU下才會發生。 并發 并發是指單個CPU在不同任務之間來換切換工作&#xff0c;但是同一時刻只有一個任務在工作。由于CPU的切換速度很快&#xff0c;給人的感受是多個任務在一起運行。 串行 串行…