OpenGL之yaw、pitch、fov 和 lookAt

在 3D 圖形學中,yawpitchfov?和?lookAt?都是控制攝像機(Camera)行為的關鍵參數,但它們的?作用層級?和?使用場景?不同。

1.?yawpitchfov?的作用

(1)?yaw(偏航角)

  • 作用:控制攝像機?左右旋轉(繞世界坐標系的?Y 軸)。

  • 影響

    • yaw = 0:默認朝向?+Z 軸(OpenGL 的初始視角)。

    • yaw = -90:朝向?-X 軸(常用于 FPS 游戲的默認視角)。

  • 計算

    cpp

    front.x = cos(yaw) * cos(pitch);
    front.z = sin(yaw) * cos(pitch);

(2)?pitch(俯仰角)

  • 作用:控制攝像機?上下旋轉(繞攝像機的?X 軸)。

  • 影響

    • pitch = 0:水平向前。

    • pitch > 0:向上看(如看向天空)。

    • pitch < 0:向下看(如看向地面)。

  • 計算

    cpp

    front.y = sin(pitch);

(3)?fov(視野范圍,Field of View)

  • 作用:控制?透視投影的視角寬度(類似人眼的視野)。

  • 影響

    • fov?越大,視野越廣(類似廣角鏡頭,但可能變形)。

    • fov?越小,視野越窄(類似望遠鏡)。

  • 典型值

    • 45.0f(默認自然視角)。

    • 90.0f(更廣的視野)。

2.?lookAt?的作用

lookAt?是一個?矩陣計算函數(如?glm::lookAt),用于直接定義攝像機的?位置、目標點和上方向,而不需要手動計算?yaw?和?pitch

函數原型(GLM)

cpp

glm::mat4 view = glm::lookAt(glm::vec3(cameraPos),   // 攝像機位置 (x,y,z)glm::vec3(cameraTarget),// 看向的目標點 (x,y,z)glm::vec3(0.0f, 1.0f, 0.0f) // 上方向 (通常取世界Y軸)
);

lookAt?的特點

  1. 直接指定目標點,不需要計算?yaw?和?pitch

  2. 適用于固定視角(如第三人稱跟隨攝像機)。

  3. 內部自動計算?攝像機的?frontrightup?向量。

3.?yaw/pitch/fov?vs?lookAt?的區別

特性yaw/pitch/fovlookAt
控制方式通過角度計算方向直接指定目標點
適用場景第一人稱游戲(FPS)、自由攝像機固定視角(如RPG、第三人稱)
計算復雜度需要手動計算?front?向量自動計算方向
靈活性適合動態旋轉(如鼠標控制視角)適合靜態或跟隨目標
典型應用WASD?移動 + 鼠標旋轉攝像機看向角色

第一人稱與第三人稱游戲的核心區別:在于視角范圍和沉浸感。
第一人稱以角色主觀視角呈現,視野受限但代入感強,常見于射擊類游戲;第三人稱以旁觀視角展現角色全身及環境,視野開闊且操作靈活,多用于動作冒險類游戲。
核心差異
1)視角范圍
第一人稱:僅顯示角色視線范圍內的場景,類似現實視野(水平約110度),無法觀察角色自身或后方環境。
第三人稱:可顯示角色全身及周圍更廣范圍(約270度視野),支持通過調整鏡頭觀察掩體后或側方動態。
2)沉浸感與操作
第一人稱:通過限制視野強化代入感,如《使命召喚》中核爆場景直接傳遞角色瀕死體驗,但快速鏡頭移動易引發3D眩暈。
第三人稱:允許分離操控角色移動與鏡頭轉向,更適合復雜動作場景(如《古墓麗影》攀爬跳躍),但情感共鳴較弱。
?

4. 如何結合使用?

(1) 用?yaw/pitch?計算?front,再用?lookAt

cpp

// 計算前向向量
glm::vec3 front;
front.x = cos(yaw) * cos(pitch);
front.y = sin(pitch);
front.z = sin(yaw) * cos(pitch);
front = glm::normalize(front);// 使用 lookAt
view = glm::lookAt(cameraPos, cameraPos + front, glm::vec3(0, 1, 0));

(2) 直接用?lookAt?控制

cpp

// 讓攝像機始終看向某個目標(如玩家角色)
view = glm::lookAt(cameraPos, playerPos, glm::vec3(0, 1, 0));

5. 總結

  • yaw/pitch/fov

    • 適用于?自由攝像機(如FPS游戲),通過角度控制方向。

    • 需要手動計算?front?向量。

  • lookAt

    • 適用于?固定目標攝像機(如RPG、第三人稱),直接指定看向的位置。

    • 自動計算方向,無需處理?yaw/pitch

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

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

相關文章

STM32-第一節-新建工程,GPIO,點亮LED,蜂鳴器

一、新建工程&#xff1a; 1.Keil中新建工程&#xff0c;選擇開發板型號。 2.工程文件夾建立Start&#xff0c;Library等分類&#xff0c;復制模版工程中的文件到工程文件夾中。 3.在Keil中添加分組&#xff0c;添加文件。 4.工程選項設置&#xff1a; c/c中&#xff1a;Inc…

Rust標量、復合類型與自定義類型、第三方并發結構

以下是 Rust 中標量類型、對象類型&#xff08;含結構體、復合類型、堆分配類型&#xff09;以及常用第三方并發數據結構的完整分類、示例和區別對比&#xff0c;幫助你系統掌握它們的本質異同&#xff1a; &#x1f7e2; 一、標量類型&#xff08;Scalar Types&#xff0c;存儲…

基于STM32溫濕度檢測—串口顯示

基于STM32溫濕度檢測 &#xff08;仿真&#xff0b;程序&#xff09; 功能介紹 具體功能&#xff1a; 1.使用DHT11檢測溫濕度&#xff1b; 2.單片機處理完控制LCD1602顯示溫濕度&#xff1b; 3.單片機也通過串口顯示檢測到的溫濕度&#xff1b; 添加圖片注釋&#xff0c;不…

Windows 10 查詢 Nginx 進程教程

1. 打開命令提示符&#xff08;CMD&#xff09; 按 Win R&#xff0c;輸入 cmd&#xff0c;回車。或者在開始菜單搜索欄輸入“cmd”&#xff0c;選擇“命令提示符”。 2. 查看是否有正在運行的 Nginx 進程 輸入命令&#xff1a; tasklist | findstr nginx這個命令會列出所有…

使用 Kafka 優化物流系統的實踐與思考

使用 Kafka 優化物流系統的實踐與思考 在現代物流系統中&#xff0c;訂單處理、倉儲管理、運輸調度等環節復雜且實時性要求高。為了滿足異步解耦、高吞吐、高可用、事件驅動和數據可靠性等需求&#xff0c;Kafka 作為分布式消息隊列和流處理平臺&#xff0c;成為了我們的首選。…

Rust中模式匹配let Some(gas_price) = tx.gas_price用法

你問得非常好&#xff0c;let Some(gas_price) tx.gas_price 是 Rust 中的一種模式匹配寫法&#xff0c;它用于從 Option 類型中提取值。 ? 背景知識&#xff1a;什么是 Option&#xff1f; 在 Rust 中&#xff0c;如果一個值可能存在也可能不存在&#xff0c;就會用 Option…

什么是LLM大語言模型

什么是LLM大語言模型 LLM的全稱是&#xff0c;Large Language Model&#xff0c;簡稱LLM&#xff0c;翻譯為大語言模型&#xff0c;其核心是模擬人類語言的復雜規律&#xff0c;實現語義理解、推理分析、文本生成等任務&#xff0c;主要目的是實現能讀懂和說出人類語言的模型。…

雜談-架構時代演進

關于未來 5-10 年軟件系統演化方向 1. 云原生 ? 超云原生&#xff08;Post Cloud Native&#xff09; Kubernetes 平臺自治化&#xff1a; K8s Operator 日益強大&#xff0c;逐步具備自愈、自動擴縮容、自動調優能力。 云廠商與企業私有云逐步融合為一體…

如何查看服務器的運行日志?

&#x1f7e2; 一、Linux服務器 Linux日志都在**/var/log**目錄下&#xff0c;最常用的有&#xff1a; &#x1f4c2; 常用日志文件 文件內容/var/log/messages大部分系統日志&#xff08;CentOS常見&#xff09;/var/log/syslog系統消息日志&#xff08;Ubuntu/Debian常見&a…

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫 編譯環境&#xff1a; RV1106G3 Linux luckfox-rv1106 5.10.160 #3 Fri Jun 27 14:16:20 AWST 2025 armv7l GNU/Linux BusyBox v1.36.1 gcc version 14.2.0 (GCC) GNU ld (GNU Binutils) 2.44 GNU Make 4.4 n…

Go語言中map[string]interface{} 和 map[string]string的區別

在 Go 語言中&#xff0c;map[string]interface{} 和 map[string]string 是兩種不同類型的 map&#xff0c;它們的主要區別在于值的類型以及這種差異帶來的使用場景和靈活性的不同。 1. 值的類型 map[string]interface{}&#xff1a;這里的 interface{} 表示 Go 中的空接口類型…

AdGuard Home 安裝及使用

AdGuard Home 是 AdGuard 開源的一個私人 DNS 服務端,只需在網關部署,即可實現全局域網的廣告攔截與隱私反追蹤。在 DNS 解析的過程中,匹配規則庫內的 URL 進行攔截,同時在客戶端中,還可以通過自定義過濾規則實現網頁 DOM 的攔截。 基于 Golang 編寫的 AdGuard Home,官方…

繞過 GraphQL 暴力破解保護

題目要求&#xff1a; 本實驗的用戶登錄機制由 GraphQL API 提供支持。API 終端節點有一個速率限制器&#xff0c;如果它在短時間內收到來自同一源的太多請求&#xff0c;則會返回錯誤。 要解決實驗問題&#xff0c;請暴力破解登錄機制以 .使用身份驗證實驗室密碼列表作為密碼…

C/C++ 使用rapidjson庫 操作Json格式文件(創建、插入、解析、修改、刪除)

目錄 一、前言 1.簡介 2.兼容性 3.下載 4.安裝 5.官方文檔 6.自述 二、封裝Json 1. 創建一個 Document 對象 2. "key":"value" 3. { } 4. [ ] 5. [ { }, { } ] 6. [ [ ], [ ] ] 7. { [ ], [ ] } 8. { { }, { } } 9. 將Document轉換為字符串…

免安裝一鍵修復網絡診斷 + 權限修復!打印機共享錯誤工具適配 Win7/10/11

各位打印小能手們&#xff01;你們有沒有遇到過共享打印機出問題&#xff0c;搞得自己焦頭爛額的情況&#xff1f;比如系統一更新&#xff0c;打印機就連不上&#xff0c;打印任務失敗&#xff0c;真的是讓人崩潰啊&#xff01;別慌&#xff0c;今天就給大家全面介紹一款打印機…

電腦分屏快捷鍵5

按window右箭頭&#xff1a; 按window左箭頭&#xff1a;

nt!CcFlushCache函數分析之nt!CcFindBcb

nt!CcFindBcb函數分析 第一部分&#xff1a; 1: kd> p nt!CcAcquireByteRangeForWrite0x377: 80a13c49 e866e4ffff call nt!CcFindBcb (80a120b4) 1: kd> t nt!CcFindBcb: 80a120b4 55 push ebp 1: kd> kc # 00 nt!CcFindBcb 01 nt!CcAcqu…

矩陣及矩陣快速冪

一.矩陣與模板 【模板】矩陣求和 時間限制&#xff1a;1秒 內存限制&#xff1a;128M 題目描述 給出兩個&#x1d45b;行&#x1d45a;列的矩陣&#xff0c;求兩個矩陣的和 輸入描述 第一行輸入兩個以空格分隔的整數&#x1d45b;,&#x1d45a;&#xff0c;表示矩…

rk3588獲取探維雷達數據

可以在上期部署完 FASTLIO 的工作空間內&#xff0c;繼續部署探維雷達的驅動程序。不要問為什么不用 mid360&#xff0c;因為我手上只有探維雷達。 探維雷達的驅動鏈接&#xff1a;https://github.com/TanwayLab/tanwaylidar_view/blob/main/README.md 下載驅動并編譯 因為沿…

HTML簡介,初步了解HTML

<html> <body> <h1>我的第一個標題</h1> <p1>我的第一個段落</p1> </body> </html> 什么是HTML HTML是用來描述網頁的一種語言。 HTML指的是超文本標記語言。 HTML不是一種編程語言&#xff0c;而是一種標記語言。 標記語…