Three.js 快速入門教程【二】透視投影相機

請添加圖片描述

系列文章目錄

系列文章目錄

Three.js 快速入門教程【一】開啟你的 3D Web 開發之旅
Three.js 快速入門教程【二】透視投影相機
Three.js 快速入門教程【三】渲染器
Three.js 快速入門教程【四】三維坐標系
Three.js 快速入門教程【五】動畫渲染循環
Three.js 快速入門教程【六】相機控件 OrbitControls
Three.js 快速入門教程【七】常見幾何體類型


文章目錄

  • 系列文章目錄
  • 系列文章目錄
  • 一、前言
  • 二、創建透視投影相機
  • 三、位置設置
  • 四、方向控制
  • 五、旋轉相機
  • 六、牛刀小試
  • 總結


一、前言

????在 Three.js 創建的 3D 虛擬世界中,相機是我們觀察場景的窗口。而透視投影相機(PerspectiveCamera)是 Three.js 里常用的相機類型之一,它模擬了人眼觀察物體的方式,即近大遠小,能為場景帶來逼真的深度感。本篇文章將介紹透視投影相機在 Three.js 中的使用。


二、創建透視投影相機

// 創建一個透視相機
const camera = new THREE.PerspectiveCamera(75, // 視場角(FOV)window.innerWidth / window.innerHeight, // 寬高比0.1, // 近裁剪面2000 // 遠裁剪面
);

PerspectiveCamera( fov, aspect, near, far )參數介紹:

參數說明默認值
fov視野角度(Field of View),指垂直方向上的視角,單位是度。通常設置為 45 - 75 度,類似人眼的視角范圍,能讓場景看起來自然。數值越大,視角越廣,場景中的物體看起來越小;數值越小,視角越窄,物體看起來越大50
aspect寬高比,即渲染區域的寬度與高度之比。一般設置為Canvas畫布寬高比width / height,確保場景在不同尺寸屏幕上正確顯示1
near近裁剪面,相機能看到的最近距離。小于此距離的物體不會被渲染。設置過小可能導致近處物體出現閃爍或錯誤,需根據場景大小合理調整0.1
far遠裁剪面,相機能看到的最遠距離。大于此距離的物體不會被渲染。設置過大可能影響性能,因為 GPU 需要處理更多遠處的物體。2000

ps:表格中提到的Canvas畫布指的是3d場景在網頁上渲染的dom節點,它是個canvas,可通過渲染器的domElement屬性獲取。

//創建渲染器
const renderer = new THREE.WebGLRenderer();
//獲取dom
const canvas=renderer.domElement

三、位置設置

改變相機在3D場景中位置

1、通過camera.position.set(x,y,z),其中x,y,z分別代表3維坐標系中x軸、y軸、z軸坐標向量

camera.position.set(5, 10, 30);

2、通過camera.position.屬性設置,camera.position是一個THREE.Vector3對象(三維向量),有x、y、z三個屬性

camera.position.x = 5;
camera.position.y = 10;
camera.position.z = 30;

ps:相機默認位置在原點(0,0,0)


四、方向控制

設置相機方向,使得它的正前方指向某個方向。

通過camera.lookAt(x,y,z),讓相機看向某個點

camera.lookAt(0,10,30);

或傳入一個三維向量對象

const target = new THREE.Vector3( 0, 10, 30 );
camera.lookAt( target );

看向場景中一個物體:

const mesh= new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1),new THREE.MeshStandardMaterial({ color: 0x00ff00 })
);
scene.add(mesh);
camera.lookAt(mesh.position);

始終保持看向該物體:

function animate() {requestAnimationFrame(animate);camera.lookAt(mesh.position);renderer.render(scene, camera);
}
animate();

ps:相機方向默認看向z軸負方向

知識點提前了解:z軸方向跟css z-index方向是一致的,人眼睛跟電腦屏幕垂直方向即為z軸,
向屏幕內為負,向屏幕外為正,屏幕寬方向為x軸,高方向為y軸

五、旋轉相機

1、通過camera.rotation.set(x,y,z);

入參x,y,z以弧度為單位

// 設置相機繞z軸旋轉45度(轉換為弧度),x軸和y軸不旋轉
camera.rotation.set(0,0,Math.PI / 4,);

2、通過rotation屬性旋轉相機

rotation屬性包含三個值,分別是繞 X、Y、Z 軸的旋轉角度(以弧度為單位)

//繞著x軸旋轉45度
camera.rotation.x=Math.PI/4;
//繞著y軸旋轉90度
camera.rotation.y=Math.PI/2;
//繞著z軸旋轉60度
camera.rotation.z=Math.PI/3;

旋轉順序:默認XYZ(可通過camera.rotation.order修改)

camera.rotation.order='YZX';

六、牛刀小試

下面實現一個小案例:通過鼠標滾輪實現相機縮放功能

代碼示例:

import * as THREE from "three";
//創建場景
const scene = new THREE.Scene();
//設置黑色背景色
scene.background = new THREE.Color(0x000000);//創建一個球體
const geometry = new THREE.SphereGeometry(5);
//創建一個基礎材質
const material = new THREE.MeshBasicMaterial({color: "#ff00ff",
});
//創建一個網格對象
const mesh = new THREE.Mesh(geometry, material);
//設置網格對象位置
mesh.position.set(0, 0, 0);
//添加到場景中
scene.add(mesh);//創建相機
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);
//設置相機位置
camera.position.set(0, 10, 30);
//相機默認看向網格對象
camera.lookAt(mesh.position);//創建渲染器
const renderer = new THREE.WebGLRenderer();
//設置渲染器尺寸為頁面寬高
renderer.setSize(document.documentElement.clientWidth,document.documentElement.clientHeight
);
//將渲染器的 DOM 元素添加到頁面中
document.body.appendChild(renderer.domElement);// 循環動畫
function animate() {// 定時刷新requestAnimationFrame(animate);renderer.render(scene, camera);
}
// 執行動畫
animate();//監聽滾輪事件
window.addEventListener("wheel", (event) => {const speed = 1;if (event.deltaY > 0) {//縮小camera.position.z += speed;} else {//放大camera.position.z -= speed;}
});

運行效果:

請添加圖片描述

說明:監聽wheel事件,根據滾輪滾動方向調整相機的position.z值,position.z值越大相機離我們眼睛越近,離物體越遠呈現視覺效果就是物體在縮小,反之在放大。

總結

??????透視投影相機是 Three.js 創建逼真 3D 場景的重要工具。通過掌握其創建、位置與方向控制以及與場景的交互,我們能為用戶帶來更豐富、沉浸式的 3D 體驗。在實際應用中,需根據場景需求和用戶體驗,不斷調整相機參數和交互邏輯,創造出令人滿意的 3D 作品。

更多three.js入門知識點請關注該系列教程后續的更新。

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

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

相關文章

IntelliJ IDEA 控制臺輸出中文出現亂碼

IntelliJ IDEA 控制臺輸出中文出現亂碼通常是由于編碼設置不一致導致的。以下是常見原因及解決方法 1. 項目編碼設置 檢查路徑:File → Settings → Editor → File Encodings 確保 Project Encoding、Global Encoding 和 Default Encoding for Properties Files 均…

C#初級教程(7)——初級期末檢測

練習 1:計算圓的周長和面積 改編題目:編寫一個 C# 程序,讓用戶輸入圓的半徑,然后計算并輸出該圓的周長和面積,結果保留兩位小數。 using System;class CircleCalculation {static void Main(){const double pi 3.14…

Java 集合:單列集合和雙列集合的深度剖析

引言 在 Java 編程中,集合是一個非常重要的概念。它就像是一個容器,能夠存儲多個數據元素,幫助我們更方便地管理和操作數據。Java 集合框架主要分為單列集合和雙列集合兩大類,它們各自有著獨特的特點和適用場景。接下來&#xff0…

layui 遠程搜索下拉選擇組件(多選)

模板使用&#xff08;lay-module/searchSelect&#xff09;&#xff0c;依賴于 jquery、layui.dist 中的 dropdown 模塊實現&#xff08;所以data 格式請參照 layui文檔&#xff09; <link rel"stylesheet" href"layui-v2.5.6/dist/css/layui.css" /&g…

通俗易懂的DOM1級標準介紹

前言 在前端開發中&#xff0c;DOM&#xff08;文檔對象模型&#xff09;是我們操作網頁內容的核心工具。前面的文章我們介紹了DOM0級、DOM2級事件模型&#xff0c;沒有DOM1級事件模型這種概念&#xff0c;但有DOM1級標準。今天我們就來討論DOM1級標準&#xff0c;看看它到底做…

python~http的請求參數中攜帶map

背景 調試 http GET請求的 map 參數&#xff0c;鏈路攜帶參數一直有問題&#xff0c;最終采用如下方式攜帶map 解決 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…

(java/Spring boot)使用火山引擎官方推薦方法向大模型發送請求

首先在maven里面引入官方依賴 <dependency><groupId>com.volcengine</groupId><artifactId>volcengine-java-sdk-ark-runtime</artifactId><version>LATEST</version></dependency>然后我們編寫測試類 package com.volcengin…

Scrum方法論指導下的Deepseek R1醫療AI部署開發

一、引言 1.1 研究背景與意義 在當今數智化時代&#xff0c;軟件開發方法論對于項目的成功實施起著舉足輕重的作用。Scrum 作為一種廣泛應用的敏捷開發方法論&#xff0c;以其迭代式開發、快速反饋和高效協作的特點&#xff0c;在軟件開發領域占據了重要地位。自 20 世紀 90 …

LeetCode 熱題 100_搜索插入位置(63_35_簡單_C++)(二分查找)(”>>“ 與 “/” 對比)

LeetCode 熱題 100_搜索插入位置&#xff08;63_35&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;二分查找&#xff09;&#xff1a; 代碼實現代碼實現&#xff08;思路一&#xff08;二分查找&#xff09…

藍橋與力扣刷題(藍橋 交換瓶子)

題目&#xff1a;有 N 個瓶子&#xff0c;編號 1 ~ N&#xff0c;放在架子上。 比如有 5 個瓶子&#xff1a; 2 1 3 5 4 要求每次拿起 2 個瓶子&#xff0c;交換它們的位置。 經過若干次后&#xff0c;使得瓶子的序號為&#xff1a; 1 2 3 4 5 對于這么簡單的情況&#x…

HTTPS 通信流程

HTTPS 通信流程時序圖&#xff1a; #mermaid-svg-HWoTbFvfih6aYUu6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-icon{fill:#552222;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-text{fill:#…

Spring AutoWired與Resource區別?

大家好&#xff0c;我是鋒哥。今天分享關于【Spring AutoWired與Resource區別?】面試題。希望對大家有幫助&#xff1b; Spring AutoWired與Resource區別? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在 Spring 中&#xff0c;Autowired 和 Resource 都是用于…

什么是HTTP/2協議?NGINX如何支持HTTP/2并提升網站性能?

HTTP/2是一種用于在Web瀏覽器和服務器之間進行通信的協議&#xff0c;旨在提高網站性能和加載速度。它是HTTP/1.1的繼任者&#xff0c;引入了許多優化和改進&#xff0c;以適應現代Web應用的需求。HTTP/2的主要目標是減少延遲、提高效率&#xff0c;以及更好地支持并發請求。 …

【Bluedroid】AVRCP 連接源碼分析(一)

一、AVRCP協議簡介 AVRCP(Audio/Video Remote Control Profile)是藍牙協議棧中的一個重要部分,它定義了藍牙設備之間的音視頻傳輸控制的流程和特點。AVRCP使得用戶可以通過一個藍牙設備(如手機)遠程控制另一個藍牙設備(如藍牙耳機或音箱)上的音視頻播放,如播放、暫停、…

【QT中的一些高級數據結構,持續更新中...】

QT中有一些很精妙、便捷的設計&#xff0c;在了解這些數據的同時&#xff0c;我們可以學到如何更好的設計代碼。本貼持續更新中&#xff0c;歡迎關注和收藏 一 QScopedPointer主要特點&#xff1a;示例代碼 二 Q_DISABLE_COPY 一 QScopedPointer QScopedPointer 是 Qt 中的一種…

行業分析---對自動駕駛規控算法的思考

1 前言 隨著自動駕駛端到端大模型的興起&#xff0c;小鵬、華為、理想、蔚來、小米等公司都對自動駕駛業務部進行了組織架構的調整&#xff0c;準備應對新的或者更高級別的自動駕駛研發任務。 近幾年由于自動駕駛技術的快速發展&#xff0c;不少從業者覺得相關職業的未來充滿了…

C++ 設計模式-模板方法模式

文件處理 #include <iostream>// 抽象基類&#xff1a;定義模板方法和抽象步驟 class DataProcessor { public:// 模板方法&#xff08;固定流程&#xff09;void Process() {OpenFile();ProcessData(); // 由子類實現CloseFile();}protected:virtual void ProcessData…

Deepseek快速做PPT

背景: DeepSeek大綱生成 → Kimi結構化排版 → 數據審查,細節調整 DeepSeek 擁有深度思考能力,擅長邏輯構建與內容生成,它會根據我們的問題進行思考,其深度思考能力當前測試下來,不愧為國內No.1,而且還會把中間的思考過程展示出來,大多時候會給出很多我們意想不到的思…

【多語言生態篇一】【DeepSeek×Java:Spring Boot微服務集成全棧指南 】

(手把手帶你從零實現AI能力調用,萬字長文預警,建議收藏實操) 一、環境準備:別輸在起跑線上 1.1 硬件軟件全家桶 JDK版本:必須 ≥17(Spring Boot 3.2+強制要求,低版本直接報錯)IDE推薦:IntelliJ IDEA終極版(社區版缺Spring AI插件支持)構建工具:Maven 3.9+ / Grad…

【YOLOv8】損失函數

學習視頻&#xff1a; yolov8 | 損失函數 之 5、類別損失_嗶哩嗶哩_bilibili yolov8 | 損失函數 之 6、定位損失 CIoU DFL_嗶哩嗶哩_bilibili 2.13、yolov8損失函數_嗶哩嗶哩_bilibili YOLOv8 的損失函數由類別損失和定位損失構成 類別損失&#xff1a;BCE Loss 定位損失…