Qt中的OpenGL (6)[坐標系統]

文章目錄

  • 文章說明
  • 學習目標
  • 目錄結構
  • 坐標系統
    • 局部空間
    • 世界空間
    • 觀察空間
    • 裁剪空間
      • 正射投影矩陣
      • 透視投影矩陣
  • 組合
  • 進入3D世界
    • 頂點數據
    • 著色器
    • 設置數據
    • 矩陣設置

文章說明

本文是學習OpenGL的筆記,主要參考大神JoeyDeVriesLearnOpenGL第八課《坐標系統》,并將教程中的代碼基于Qt進行實現。

學習目標

  • 掌握坐標系統中坐標空間以及轉換矩陣相關知識
  • 掌握如何使用坐標系統繪制圖形

目錄結構

|-
|-- HelloCoordinateSystems|--- hello_coordinate_systems.cpp|--- hello_coordinate_systems.h|--- main.cpp|--- CMakeLists.txt
|-- CMakeLists.txt

整個項目的全部CMakeLists.txt文件與上一篇《變換》中的內容基本一致,只需要將全部HelloTransformation替換成HelloCoordinateSystems就可以了。

坐標系統

在OpenGL中,坐標系統是圖形編程的基礎,理解它對于在屏幕上正確地繪制幾何圖形至關重要。OpenGL使用多個坐標系統來幫助開發者進行3D圖形的繪制與變換。這些坐標系統包括本地坐標(或稱物體坐標)、世界坐標、觀察坐標、裁剪坐標和屏幕坐標。將物體的坐標變換到幾個 過渡 坐標系(Intermediate Coordinate System)的優點在于,在這些特定的坐標系統中,一些操作或運算更加方便和容易。

為了將坐標從一個坐標系變換到另一個坐標系,需要用到幾個變換矩陣,最重要的幾個分別是 模型(Model)觀察(View)投影(Projection) 三個矩陣。頂點坐標起始于局部空間(Local Space),在這里它稱為局部坐標(Local Coordinate),它在之后會變為世界坐標(World Coordinate),觀察坐標(View Coordinate),裁剪坐標(Clip Coordinate),并最后以屏幕坐標(Screen Coordinate)的形式結束。

坐標系變換流程圖

局部空間

局部空間是指 物體所在的坐標空間 ,即對象最開始所在的地方。不管這個物體移動了什么位置物體的局部空間都是(0,0,0)。你的模型的所有 頂點都是在局部空間中 ,它們相對于你的物體來說都是局部的。

世界空間

如果將所有的物體導入到程序當中,它們有可能會全擠在世界的原點(0, 0, 0)上,因此,需要為每一個物體定義一個位置,從而能在更大的世界當中放置它們。世界坐標空間是指 頂點相對于規定的世界的坐標 ,物體的坐標將會從局部變換到世界空間變換是由模型矩陣(Model Matrix)實現的,模型矩陣是一種變換矩陣,它能通過對物體進行位移縮放以及旋轉來將它置于它本應該在的位置或朝向。

觀察空間

觀察空間經常被人們稱之OpenGL的 攝像機(Camera) 。觀察空間是將世界空間坐標轉化為用戶視野前方的坐標而產生的結果。因此觀察空間就是從攝像機的視角所觀察到的空間。而這通常是由一系列的位移和旋轉的組合來完成,平移/旋轉場景從而使得特定的對象被變換到攝像機的前方。這些組合在一起的變換通常存儲在一個觀察矩陣(View Matrix)里。

裁剪空間

在一個頂點著色器運行的最后,OpenGL期望所有的坐標都能落在一個特定的范圍內,且任何在這個范圍之外的點都應該被裁剪。被裁剪掉的坐標就會被忽略,所以剩下的坐標就將變為屏幕上可見的片段。這也就是裁剪空間(Clip Space)名字的由來。

如果需要被屏幕顯示被看到,需要定義一個 投影矩陣(Projection Matrix) 投影矩陣定義了可視化的區域,這個區域稱為 觀察箱 或被稱為 平截頭體(Frustum) ,平截頭體是一個有六個面、四個側面和兩個平行的底面(前面和后面)的幾何體。這個幾何體看起來像一個“錐體”被切去頂部的形狀,兩個平面分別稱為 近平面遠平面 ,兩個平面之間的范圍是可見范圍。

投影矩陣可以為兩種不同的形式包括:

  • 正射投影矩陣(Orthographic Projection Matrix)
  • 透視投影矩陣(Perspective Projection Matrix)

正射投影矩陣

把空間中的物體投射成某個平面的影像,把3D場景轉換為2D平面圖像,正射投影矩陣的平截頭體看上去就像是一個立方體而不是錐體,類似于平行光把物體投射到地面,由于是平行光因此不會有近大遠小的效果。

正射投影矩陣的設置需要指定 遠近平面距離 在Qt中設置如下(同glm):

void QMatrix4x4::ortho(float left, float right, float bottom, float top, float nearPlane, float farPlane);
  • 設置正射投影矩陣
    • left:視景體左邊界在 x 軸坐標 0 的位置,可以設置成NDC坐標-1.0
    • right:視景體右邊界在 x 軸坐標 800 的位置,可以設置成NDC坐標1.0
    • bottom:視景體下邊界在 y 軸坐標 0 的位置,可以設置成NDC坐標-1.0
    • top:視景體上邊界在 y 軸坐標 600 的位置,可以設置成NDC坐標1.0
    • nearPlane:近裁剪面距離觀察者 0.1 個單位,在該平面之前的物體不會被渲染
    • farPlane:遠裁剪面距離觀察者 100 個單位,在該平面之后的物體不會被渲染

透視投影矩陣

透視投影則會使物體在被渲染的時候更接近真實世界中看物體的樣子即會產生近大遠小效果,在Qt中設置如下(同glm):

void QMatrix4x4::perspective(float verticalAngle, float aspectRatio, float nearPlane, float farPlane);
  • 設置透視投影矩陣
    • verticalAngle:垂直方向的視野角度(Field of View,FOV),單位為度。該參數決定了相機垂直方向上能看到的范圍大小。
    • aspectRatio:視口的寬高比,即窗口寬度與高度的比值。這個參數用于確保渲染的圖形不會因窗口的寬高變化而發生拉伸或壓縮變形。
    • nearPlane:近裁剪面距離觀察者 0.1 個單位,在該平面之前的物體不會被渲染
    • farPlane:遠裁剪面距離觀察者 100 個單位,在該平面之后的物體不會被渲染

透視投影矩陣的平截頭體示意圖如下:

透視投影矩陣示意圖

組合

V c l i p = M p r o j e c t i o n ? M v i e w ? M m o d e l ? V l o c a l V_{clip} = M_{projection} \cdot M_{view} \cdot M_{model} \cdot V_{local} Vclip?=Mprojection??Mvie

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

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

相關文章

Spring Aop @After (后置通知)的使用場景?

核心定義 After 是 Spring AOP 中的另一種通知(Advice)類型,通常被稱為“后置通知”或“最終通知”。 它的核心作用是: 無論目標方法是正常執行完成,還是在執行過程中拋出了異常,After 通知中的代碼 總是…

UNet改進(4):交叉注意力(Cross Attention)-多模態/多特征交互

在計算機視覺領域,UNet因其優異的性能在圖像分割任務中廣受歡迎。本文將介紹一種改進的UNet架構——UNetWithCrossAttention,它通過引入交叉注意力機制來增強模型的特征融合能力。 1. 交叉注意力機制 交叉注意力(Cross Attention)是一種讓模型能夠動態地…

C#里從CSV文件加載BLOB數據字段到數據庫的處理

大量的數據保存在CSV文件, 當需要把這些數據加載到數據庫,然后使用數據庫來共享出去。 就需要把CSV文件導入數據庫, 怎么樣快速地把CSV文件導入數據庫呢? 這個就需要使用類MySqlBulkLoader,它是mariadb數據庫快速導入的方式。 一般使用SQL語句導入是10秒,那么使用這種方…

【后端】負載均衡

長期不定期更新補充。 定義 負載均衡(Load Balancing)是指將來自客戶端的請求合理分發到多個服務器或服務節點,以提高系統性能、可用性與可靠性。 分工 前端不做負載均衡,前端只發請求,不知道請求去哪臺服務器。 負…

記錄一次:Java Web 項目 CSS 樣式/圖片丟失問題:一次深度排查與根源分析

記錄一次:Java Web 項目 CSS 樣式/圖片丟失問題:一次深度排查與根源分析 **記錄一次:Java Web 項目 CSS 樣式丟失問題:一次深度排查與根源分析****第一層分析:資源路徑問題****第二層分析:服務端跳轉邏輯**…

torchmd-net開源程序是訓練神經網絡潛力

?一、軟件介紹 文末提供程序和源碼下載 TorchMD-NET 提供最先進的神經網絡電位 (NNP) 和訓練它們的機制。如果有多個 NNP,它可提供高效、快速的實現,并且它集成在 GPU 加速的分子動力學代碼中,如 ACEMD、OpenMM 和 …

在Docker上安裝Mongo及Redis-NOSQL數據庫

應用環境 Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-139-generic x86_64) Docker version 28.1.1, build 4eba377 文章目錄 一、部署Mongo1. 拉取容器鏡像2. 生成Run腳本2.1 準備條件2.2 參數解讀2.3 實例腳本 3. 實例操作3.1 Mongo bash控制臺3.2 庫表操作 4. MongoDB Compass (G…

Java 編程之責任鏈模式

一、什么是責任鏈模式? 責任鏈模式(Chain of Responsibility Pattern) 是一種行為型設計模式,它讓多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,沿著這條…

1、做中學 | 一年級上期 Golang簡介和安裝環境

一、什么是golang Golang,通常簡稱 Go,是由 Google 公司的 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年創建的一種開源編程語言,并在 2009 年正式對外公布。 已經有了很多編程語言,為什么還要創建一種新的編程語言&…

Linux--迷宮探秘:從路徑解析到存儲哲學

上一篇博客我們說完了文件系統在硬件層面的意義,今天我們來說說文件系統在軟件層是怎么管理的。 Linux--深入EXT2文件系統:數據是如何被組織、存儲與訪問的?-CSDN博客 🌌 引言:文件系統的宇宙觀 "在Linux的宇宙中…

淘寶商品數據實時獲取方案|API 接口開發與安全接入

在電商數據獲取領域,除了官方 API,第三方數據 API 接入也是高效獲取淘寶商品數據的重要途徑。第三方數據 API 憑借豐富的功能、靈活的服務,為企業和開發者提供了多樣化的數據解決方案。本文將聚焦第三方數據 API 接入,詳細介紹其優…

什么是防抖和節流?它們有什么區別?

文章目錄 一、防抖(Debounce)1.1 什么是防抖?1.2 防抖的實現 二、節流(Throttle)2.1 什么是節流?2.2 節流的實現方式 三、防抖與節流的對比四、總結 在前端開發中,我們經常會遇到一些高頻觸發的…

Springboot集成阿里云OSS上傳

Springboot集成阿里云OSS上傳 API 接口描述 DEMO提供的四個API接口,支持不同方式的文件和 JSON 數據上傳: 1. 普通文件上傳接口 上傳任意類型的文件 2. JSON 字符串上傳接口 上傳 JSON 字符串 3. 單個 JSON 壓縮上傳接口 上傳并壓縮 JSON 字符串…

刪除大表數據注意事項

數據庫是否會因刪除操作卡死,沒有固定的 “安全刪除條數”,而是受數據庫配置、表結構、操作方式、當前負載等多種因素影響。以下是關鍵影響因素及實踐建議: 一、導致數據庫卡死的核心因素 硬件與數據庫配置 CPU / 內存瓶頸:刪除…

Redis 是單線程模型?|得物技術

一、背景 使用過Redis的同學肯定都了解過一個說法,說Redis是單線程模型,那么實際情況是怎樣的呢? 其實,我們常說Redis是單線程模型,是指Redis采用單線程的事件驅動模型,只有并且只會在一個主線程中執行Re…

[特殊字符] AIGC工具深度實戰:GPT與通義靈碼如何徹底重構企業開發流程

🔍 第一模塊:理念顛覆——為什么AIGC不是“玩具”而是“效能倍增器”? ▍企業開發的核心痛點圖譜(2025版) ??研發效能瓶頸??:需求膨脹與交付時限矛盾持續尖銳,傳統敏捷方法論已觸天花板?…

(LeetCode 面試經典 150 題) 169. 多數元素(哈希表 || 二分查找)

題目&#xff1a;169. 多數元素 方法一&#xff1a;二分法&#xff0c;最壞的時間復雜度0(nlogn)&#xff0c;但平均0(n)即可。空間復雜度為0(1)。 C版本&#xff1a; int nnums.size();int l0,rn-1;while(l<r){int mid(lr)/2;int ans0;for(auto x:nums){if(xnums[mid]) a…

(17)java+ selenium->自動化測試-元素定位大法之By css上

1.簡介 CSS定位方式和xpath定位方式基本相同,只是CSS定位表達式有其自己的格式。CSS定位方式擁有比xpath定位速度快,且比CSS穩定的特性。下面詳細介紹CSS定位方式的使用方法。相對CSS來說,具有語法簡單,定位速度快等優點。 2.CSS定位優勢 CSS定位是平常使用過程中非常重要…

【軟考高級系統架構論文】企業集成平臺的技術與應用

論文真題 企業集成平臺是一個支持復雜信息環境下信息系統開發、集成和協同運行的軟件支撐環境。它基于各種企業經營業務的信息特征,在異構分布環境(操作系統、網絡、數據庫)下為應用提供一致的信息訪問和交互手段,對其上運行的應用進行管理,為應用提供服務,并支持企業信息…

i.MX8MP LVDS 顯示子系統全解析:設備樹配置與 DRM 架構詳解

&#x1f525; 推薦&#xff1a;《Yocto項目實戰教程&#xff1a;高效定制嵌入式Linux系統》 京東正版促銷&#xff0c;歡迎支持原創&#xff01; 鏈接&#xff1a;https://item.jd.com/15020438.html i.MX8MP LVDS 顯示子系統全解析&#xff1a;設備樹配置與 DRM 架構詳解 在…