【ThreeJS Basics 06】Camera

文章目錄

  • Camera 相機
  • PerspectiveCamera 透視相機
  • 正交相機
  • 用鼠標控制相機
    • 大幅度轉動(可以看到后面)
  • 控制組件
    • FlyControls 飛行組件控制
    • FirstPersonControls 第一人稱控制
    • PointerLockControls 指針鎖定控制
    • OrbitControls 軌道控制
    • TrackballControls 軌跡球控制
    • TransformControls 變換控制組件
    • 拖拽組件
  • 嘗試引入并使用控件:OrbitControls 軌道
    • 導入
  • DAMPING 阻尼


Camera 相機

以下是幾種常見的相機簡介

  • ArrayCamera : 數組相機
  • StereoCamera:雙眼相機,可以使用兩個相機來渲染場景,類似 VR,以及雙人成行的屏幕分開的雙人游戲
  • CubeCamera:立方體相機,有 6 個相機,分別渲染 6 個面,ThreeJS 可以用它來渲染環境,貼圖,反射,折射陰影
  • OrthographicCamera:正交相機,RTS 游戲,相對于透視相機(透視相機更接近人眼的觀察效果)
  • PerspectiveCamera:透視相機

PerspectiveCamera 透視相機

參數如下圖所示

在這里插入圖片描述
第一個參數是視野:建議的值在 45~75

在這里插入圖片描述

如果視野足夠大的話,那么規則的立方體可能被擠壓變形,類似這樣的效果

在這里插入圖片描述
第二個參數是:橫縱比,一般是畫布的長/寬

const sizes = {width: 800,height: 600
}const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)

第三個和第四個參數 nearfar

默認值是 1, 1000,意味著:
任何比近處更近,或者比遠處更遠的物體,都不會顯示出來

選擇合適的取值范圍,如果遠端有山莊,山脈,云朵之類的,可以取合適的值來判斷是否渲染它們。


正交相機

正交相機有六個參數,前四個是位置,左右上下,第五個和第六個跟透視相機的參數類似,遠近的渲染
在這里插入圖片描述

const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 100)

在這里插入圖片描述
上面的形狀并不規則,因為渲染的比例不對,我們獲取


const aspectRatio = sizes.width / sizes.height
// Camera 
// const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
const camera = new THREE.OrthographicCamera(-1 * aspectRatio, 1 * aspectRatio, 1, -1, 0.1, 100)
  • 正交相機不受透視影響,能保證物體形狀不因深度而發生變化,適合 2D、UI、地圖等場景。
  • 乘以 aspectRatio 讓視口匹配屏幕比例,確保物體不會在不同設備下發生拉伸變形。
  • 如果你需要準確控制幾何形狀或在屏幕上保持形狀固定,正交相機是更好的選擇。

用鼠標控制相機

獲取坐標位置,并處理坐標值的范圍在 [-0.5, 0.5]

/*** Cursor*/
const cursor = {x: 0,y: 0,
}
window.addEventListener('mousemove', (event) => {cursor.x = event.clientX / sizes.width - 0.5cursor.y = event.clientY / sizes.height - 0.5console.log('cursor:>>', cursor)
})

之后再 tick 函數里更改相機的位置

const tick = () => {const elapsedTime = clock.getElapsedTime()// Update objects//   mesh.rotation.y = elapsedTimecamera.position.x = cursor.x * 10camera.position.y = cursor.y * 10camera.lookAt(mesh.position )// Renderrenderer.render(scene, camera)// Call tick again on the next framewindow.requestAnimationFrame(tick)
}

但是這里會有奇怪的問題, 似乎 x 軸跟 y 軸的邏輯是反著的

在這里插入圖片描述

所以改變一下 cursor.y 的值,整體取值負數,這樣x,y軸都是反方向的了

在這里插入圖片描述
或者 x 軸取負數,這樣就是類似跟隨鼠標的效果
在這里插入圖片描述
但是這樣有個問題:我看不到物體的后面,那么,如何才能看到后面呢?或者說讓相機旋轉起來


大幅度轉動(可以看到后面)

const tick = () => {const elapsedTime = clock.getElapsedTime()// Update objects//   mesh.rotation.y = elapsedTimecamera.position.x = Math.sin(cursor.x * Math.PI * 2) * 3camera.position.z = Math.cos(cursor.x * Math.PI * 2) * 3camera.position.y = cursor.y * 5camera.lookAt(mesh.position)// Renderrenderer.render(scene, camera)// Call tick again on the next framewindow.requestAnimationFrame(tick)
}

在這里插入圖片描述


控制組件

FlyControls 飛行組件控制

演示地址點我: https://threejs.org/examples/#misc_controls_fly

FirstPersonControls 第一人稱控制

https://threejs.org/examples/#webgl_geometry_terrain

PointerLockControls 指針鎖定控制

https://threejs.org/examples/#misc_controls_pointerlock

OrbitControls 軌道控制

https://threejs.org/examples/#misc_controls_orbit

TrackballControls 軌跡球控制

https://threejs.org/examples/#misc_controls_trackball


TransformControls 變換控制組件

https://threejs.org/examples/#misc_controls_transform

在這里插入圖片描述

拖拽組件

https://threejs.org/examples/#misc_controls_drag

在這里插入圖片描述


嘗試引入并使用控件:OrbitControls 軌道

導入

OrbitControls 它不在 THREE 這個變量中,需要手動的導入

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'const controls = new OrbitControls(camera, canvas)

兩句話,就可以有下圖的使用效果了

在這里插入圖片描述

DAMPING 阻尼

拖拽的時候有些生澀,加入阻尼之后,會有一定的加速度

在這里插入圖片描述
但是會有些奇怪,因為需要再每一幀上更新控件才能正常的顯現,在 tick 函數中添加更新 controls.update()

在這里插入圖片描述

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

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

相關文章

Linux | Ubuntu 與 Windows 雙系統安裝 / 高頻故障 / UEFI 安全引導禁用

注:本文為 “buntu 與 Windows 雙系統及高頻故障解決” 相關文章合輯。 英文引文,機翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何將 Ubuntu 20.04 和雙啟動與 Windows 10 一起安裝 Dave’s RoboShack Published in…

在 C++ 中,通常會使用 `#define` 來定義宏,并通過這種方式發出警告或提示。

在 C++ 中,通常會使用 #define 來定義宏,并通過這種方式發出警告或提示。 如何實現 GBB_DEPRECATED_MSG 宏: 你可以通過以下方式定義一個宏,顯示棄用警告: #include <iostream>// 定義一個宏,用來打印棄用警告 #define GBB_DEPRECATED_MSG(msg

el-tree右鍵節點動態位置展示菜單;el-tree的節點圖片動態根據節點屬性color改變背景色;加遮罩層(opacity)

一、el-tree右鍵節點動態位置展示菜單 關鍵:@node-contextmenu="handleRightClick"與@node-click=“handleNodeClick” <div class="content"><el-tabs class="tabs" @tab-click="handleClick" v-model="Modal"…

Leetcode 378-有序矩陣中第 K 小的元素

給你一個 n x n 矩陣 matrix &#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩陣中第 k 小的元素。 請注意&#xff0c;它是 排序后 的第 k 小元素&#xff0c;而不是第 k 個 不同 的元素。 你必須找到一個內存復雜度優于 O(n2) 的解決方案。 示例 1&#xff1…

【二.提示詞工程與實戰應用篇】【3.Prompt調優:讓AI更懂你的需求】

最近老張在朋友圈秀出用AI生成的國風水墨畫,隔壁王姐用AI寫了份驚艷全場的年終總結,就連樓下小賣部老板都在用AI生成營銷文案。你看著自己跟AI對話時滿屏的"我不太明白您的意思",是不是懷疑自己買了臺假電腦?別慌,這可能是你的打開方式不對。今天咱們就聊聊這個…

UNIAPP前端配合thinkphp5后端通過高德API獲取當前城市天氣預報

如何通過 UniApp 前端項目與 ThinkPHP5 后端結合高德天氣 API 獲取天氣預報信息。我們將分為前端和后端兩部分進行實現。以下是一個完整的代碼. 一、項目結構 project/ ├── frontend/ (UniApp 項目) │ ├── pages/ │ │ └── weather/ │ │ ├── in…

藍橋杯C組真題——巧克力

題目如下 思路 代碼及解析如下 謝謝觀看

CSDN博客寫作教學(五):從寫作到個人IP的體系化構建(完結篇)

導語 (第一篇)Markdown編輯器基礎 (第二篇)Markdown核心語法 (第三篇)文章結構化思維 (第四篇)標題優化與SEO實戰 通過前四篇教程,你已掌握技術寫作的“術”——排版、標題、流量與數據。但真正的價值在于將技能升維為“道”:用技術博客為支點,撬動個人品牌與職業發…

Elasticsearch簡單學習

1、依賴的導入 <!--ES依賴--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2、客戶端鏈接 RestHighLevelClient client new RestHigh…

macOS Sequoia 15.3 M3 Pro芯片 iOS 開發環境配置記錄(最新)

進行如下工作之前首先確保終端已翻墻&#xff0c;在ClashX選擇“復制終端代理命令”&#xff0c;在終端進行粘附并執行。 安裝 homebrew Homebrew 是 Mac 平臺的一個包管理工具&#xff0c;提供了許多Mac下沒有的Linux工具等。 /bin/bash -c "$(curl -fsSL https://raw…

迷你世界腳本組隊接口:Team

組隊接口&#xff1a;Team 彼得兔 更新時間: 2023-04-26 10:19:04 具體函數名及描述如下: 序號 函數名 函數描述 1 getNumTeam(...) 當前隊伍數量 2 getTeamPlayerNum(...) 獲取指定隊伍玩家數量 3 getTeamPlayers(...) 獲取指定隊伍玩家 4 random…

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和視頻都在說&#xff0c;使用 Deepseek 和 kimi 能快速生成精美的 ppt&#xff0c;畢竟那都是別人說的&#xff0c;只有自己嘗試一次才知道結果。 具體操作 第一步&#xff1a;訪問 deepseek 我們訪問 deepseek &#xff0c;把我們想要輸入的內容告訴…

初始提示詞(Prompting)

理解LLM架構 在自然語言處理領域&#xff0c;LLM&#xff08;Large Memory Language Model&#xff0c;大型記憶語言模型&#xff09;架構代表了最前沿的技術。它結合了存儲和檢索外部知識的能力以及大規模語言模型的強大實力。 LLM架構由外部記憶模塊、注意力機制和語…

【IDEA】IDEA常用的VM配置,優化配置讓開發過程更順暢

日常開發中&#xff0c;如果使用IDEA卡頓、卡死&#xff0c;一般是需要根據自己電腦的實際性能調整VM參數&#xff0c;才能有更好的開發體驗。 設置方法 選擇Help>Edit Custom VM Options&#xff0c;粘貼以下內容&#xff0c;重啟 IntelliJ IDEA使配置生效。 idea64.exe.…

【Python爬蟲】利用代理IP爬取跨境電商AI選品分析

引言 隨著DeepSeek的流行&#xff0c;越來越多的用戶開始嘗試將AI工具融入到日常工作當中&#xff0c;借助AI的強大功能提高工作效率。最近又掀起了一波企業出海的小高潮&#xff0c;那么如果是做跨境電商業務&#xff0c;怎么將AI融入工作流中呢&#xff1f;在做跨境電商的時候…

【Flink銀行反欺詐系統設計方案】1.短時間內多次大額交易場景的flink與cep的實現

【flink應用系列】1.Flink銀行反欺詐系統設計方案 1. 經典案例&#xff1a;短時間內多次大額交易1.1 場景描述1.2 風險判定邏輯 2. 使用Flink實現2.1 實現思路2.2 代碼實現2.3 使用Flink流處理 3. 使用Flink CEP實現3.1 實現思路3.2 代碼實現 4. 總結 1. 經典案例&#xff1a;短…

C語言——鏈表

大神文獻&#xff1a;https://blog.csdn.net/weixin_73588765/article/details/128356985 目錄 一、鏈表概念 1. 什么是鏈表&#xff1f; 1.1 鏈表的構成 2. 鏈表和數組的區別 數組的特點&#xff1a; 鏈表的特點&#xff1a; 二者對比&#xff1a; 二…

Spring框架自帶的定時任務:Spring Task詳解

文章目錄 一、基本使用1、配置&#xff1a;EnableScheduling2、觸發器&#xff1a;Scheduled 二、拓展1、修改默認的線程池2、springboot配置 三、源碼分析參考資料 一、基本使用 1、配置&#xff1a;EnableScheduling import org.springframework.context.annotation.Config…

數據庫事務、樂觀鎖及悲觀鎖

參考&#xff1a;node支付寶支付及同步、異步通知、主動查詢支付寶訂單狀態 以下容結合上述鏈接查看 1. 什么是數據庫事務&#xff1f; 1.1. 連續執行數據庫操作 在支付成功后&#xff0c;我們在自定義的paidSuccess里&#xff0c;依次更新了訂單狀態和用戶信息。也就說這里…

Android 創建一個全局通用的ViewModel

&#xff08;推薦&#xff09;使用ViewModelStore 代碼示例&#xff1a; class MyApplication : Application(), ViewModelStoreOwner {private val mViewModelStore ViewModelStore()override fun onCreate() {super.onCreate()}override val viewModelStore: ViewModelSto…