【GAMES101】觀測變換

?圖形學不等于 OpenGL,不等于光線追蹤,而是一套生成整個虛擬世界的方法

記得有個概念叫光柵化,就是把三維虛擬世界的事物顯示在二維的屏幕上,這里就涉及到觀察變換

觀察變換,叫viewing transformation,包括視圖變換和投影變換,投影變換又分為正交投影變換和透視投影變換

目錄

視圖變換

投影變換

正交投影變換

透視投影變換


視圖變換

怎么理解這個視圖變換呢,閆神舉了個例子,比如說要拍張照片,那么把人物和場景擺放好就是模型變換,而找一個好位置放好攝像機并調好角度就是視圖變換,而最后拍照成像的這個過程就是投影變換

怎么實現這個視圖變換呢?我們首先來規定好攝像機的擺放參數,有一個位置,攝像機的朝向(往左往右看),還有一個向上的方向(類似于歪頭)

為了方便,于是約定俗成的把這個攝像機的位置放在原點處,然后讓攝像機朝向z軸的負方向,向上的方向為y軸正方向

那么如何把一個攝像機移到原點并且旋轉到我們需要的方向呢?

我們可以先平移在旋轉,平移這個簡單,直接就能寫出變換矩陣來

旋轉呢?如果直接考慮從g旋轉到-z,t旋轉到y,以及g×t旋轉到x,這個比較復雜,但是反過來旋轉就比較簡單的可以寫出變換矩陣,所以我們需要的變換矩陣就是這個簡單變換矩陣的逆矩陣,又因為旋轉矩陣是正交矩陣,正交矩陣的逆矩陣就是其本身的轉置矩陣,所以這個簡單的旋轉矩陣轉置就是我們需要的旋轉矩陣

投影變換

投影變換就是為了實現將三維的事物展示在二維上

這個透視投影呢就是近大遠小,而正交投影就是相當于這個攝像機放在無限遠處,那么這樣近處和遠處的大小看起來也是一樣的了

正交投影變換

正交投影變換就是相當于把所有的點都移到XoY這個平面上,相當于這個z坐標不要了

為了顯示所有的點,我們將所有的點都限制在[-1,1]里面來

但是這樣分不清遠近,因此我們希望限制在一個正方體里面去,這個叫做標準的正方體,記為

?[l, r] x [b, t] x [f, n]

這個l和r是left和right,就是x方向的左右,b和t呢是bottom和top,對應y方向的上下,而這個f<n是far和near,對應z方向的遠近,那為什么遠比近小呢?這是因為我們的攝像機是看向-z方向的

因此對于一個場景,我們通過平移和縮放兩種變換就可以把它限制在這個標準的正方體里面去

透視投影變換

透視投影比較常見,歐幾里得說過,在一個平面中,永不相交的兩條直線是平行線,但是透視投影卻使得平行線可以看起來是相交的

在我們開始之前,我們再回顧一下,在齊次坐標系中,對于一個點而言,如果我們直接對每個維度都乘以某個不為0的系數,那么這個點是不變的,這個點還是這個點對吧

那我們怎么來做這個投影變換呢?

實際上,我們想做的就是把這個截錐體給擠壓成這個長方體,然后再做一次正交投影就行了

怎么擠壓呢,我們可以取某個點來分析,這里用到相似三角形的原理,相似三角形的一切對應線段(對應高、對應中線、對應角平分線、外接圓半徑、內切圓半徑等)的比等于相似比

我們先取x和y做分析哈,那么擠壓后的這個x和y就可以通過先前近平面的n和遠平面的z的比值乘以x和y得到

?

因此我們就可以找到一個這么一個對應關系使得這個點擠壓過去,但是這個z會變成什么樣我們還不清楚

那么現在這個從透視投影變換到正交投影的變換矩陣已經有了雛形了

?

怎么解決第三行呢?

我們注意到近平面上的點在擠壓后是不會發生變換的,同時遠平面上的點的z坐標也不會發生變化

因此對于一個點(x,y,n,1)在擠壓后應該還是(x,y,n,1),那么乘以z,也就是乘以n,這個第三行的結果應該是n2,那么這樣的話,第三行應該長成(0,0,A,B)這個樣,只有這樣計算出來的結果才會和x和y沒有關系

那么再加上遠平面上的點擠壓后z不變的結果,我們可以得到一個二元一次方程組

進而可以得到A和B的解,那么這個變化矩陣就找到了

這節課的最后,閆神留了個問題,在擠壓的過程中,這個z坐標會如何變化,是變遠呢還是變近了呢,還是不變呢?

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

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

相關文章

1、關于前端js-ajax繞過

1、Ajax知識 、js--Ajax 傳統請求跟js--Ajax請求的差別 在實例中用的上js-ajax的有 表單驗證&#xff1a; 在用戶填寫表單時&#xff0c;可以使用 Ajax 在不刷新頁面的情況下驗證表單字段&#xff0c;并提供即時反饋。 實時搜索&#xff1a; 在搜索框中輸入內容時&#xff0…

Gateway

網關的作用&#xff1a; 可以對訪問的用戶進行身份認證和權限校驗還可以服務路由&#xff0c;負載均衡還可以進行請求限流 網關本身也是微服務的一部分&#xff0c;所以需要使用nacos進行服務注冊和發現 網關路由的配置 路由id&#xff1a;路由唯一標識uri&#xff1a;路由…

使用STM32 HAL庫進行GPIO控制的實例

?作者簡介&#xff1a;熱愛科研的嵌入式開發者&#xff0c;修心和技術同步精進&#xff0c; 代碼獲取、問題探討及文章轉載可私信。 ? 愿你的生命中有夠多的云翳,來造就一個美麗的黃昏。 &#x1f34e;獲取更多嵌入式資料可點擊鏈接進群領取&#xff0c;謝謝支持&#xff01;…

獨立服務器的主要應用方向有什么_Maizyun

獨立服務器的主要應用方向有什么&#xff1f; 獨立服務器是指托管單一應用程序或網站的單臺服務器。隨著互聯網的發展&#xff0c;獨立服務器已經成為許多企業和個人用戶的重要選擇&#xff0c;因為它提供了更高的靈活性和控制權。本文將探討獨立服務器的主要應用方向。 一、…

利用R語言heatmap.2函數進行聚類并畫熱圖

數據聚類然后展示聚類熱圖是生物信息中組學數據分析的常用方法&#xff0c;在R語言中有很多函數可以實現&#xff0c;譬如heatmap,kmeans等&#xff0c;除此外還有一個用得比較多的就是heatmap.2。最近在網上看到一個筆記文章關于《一步一步學heatmap.2函數》&#xff0c;在此與…

計算機存儲結構分析(寄存器,內存,緩存,硬盤)

https://blog.csdn.net/bemodesty/article/details/81476906 前言 一個計算機包含多種存儲器比如&#xff1a;寄存器、高速緩存、內存、硬盤、光盤等&#xff0c;為啥有這么多種存儲方式&#xff0c;對于不太了解的人&#xff0c;總是覺得云里霧里的&#xff0c;搞不明白原因…

java-兩個列表進行比較,判斷那些是需要新增的、刪除的、和更新的

文章目錄 前言兩個列表進行比較&#xff0c;判斷那些是需要新增的、刪除的、和更新的 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實…

SpringIOC之@Configuration

博主介紹&#xff1a;?全網粉絲5W&#xff0c;全棧開發工程師&#xff0c;從事多年軟件開發&#xff0c;在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰&#xff0c;博主也曾寫過優秀論文&#xff0c;查重率極低&#xff0c;在這方面有豐富的經驗…

Django的logging-日志模塊的簡單使用方法

擴展閱讀&#xff1a; Python-Django的“日志功能-日志模塊(logging模塊)-日志輸出”的功能詳解 現在有下面的Python代碼&#xff1a; # -*- coding: utf-8 -*-def log_out_test(content_out):print(content_out)content1 "i love you01" log_out_test(content1)現…

云服務器Centos中安裝Docker

云服務器Centos中安裝Docker 1 簡介DockerCentosCentos和Ubuntu區別 2 安裝3 測試hello-world的鏡像測試 1 簡介 Docker Docker是一個開源的應用容器引擎&#xff0c;利用操作系統本身已有的機制和特性&#xff0c;可以實現遠超傳統虛擬機的輕量級虛擬化。它支持將軟件編譯成…

Hive 淺析

Hive是一個簡單的LUA沙盒&#xff0c;除了基本的LUA解釋器的功能以外&#xff0c;還提供了諸如熱加載等功能。 了解HIVE的工作原理有利于了解Lua虛擬機的底層實現機理。 本文從是什么-怎么用-為什么三個維度介紹HIVE。 Hive Hive是什么 hive是一個簡單的LUA應用框架,目前基于…

Mybatis Plus詳解【一】

一、簡介 MybatisPlus可以節省大量時間&#xff0c;所有的CRUD代碼都可以自動化完成。MyBatis-Plus是一個MyBatis的增強工具&#xff0c;在 MyBatis 的基礎上只做增強不做改變&#xff0c;為簡化開發、提高效率而生。 特性&#xff1a; 無侵入&#xff1a;只做增強不做改變&…

Windows 12 和 AI 計算機

據商業時報消息 &#xff0c;微軟計劃于 2024 年 6 月發布Windows 12。 新版本的操作系統將伴隨集成人工智能。 該數據基于廣達首席執行官林百里和宏基陳杰森在中國臺北醫療科技展上的發言。 雖然這篇文章沒有直接引用微軟高管的話&#xff0c;但它是根據他們的評論得出的結…

IDEA 社區版 add GitLab Account

問題 IntelliJ IDEA Community Edition 2023.3&#xff08;社區版&#xff09;在使用GitLab連接時&#xff0c;使用個人訪問令牌出現報錯&#xff0c;代碼&#xff1a; GraphQL error:[No such type ProjectMember,so it cant be a fraggment condition,Field id doesnt exis…

2023年最新prometheus + grafana搭建和使用

一、安裝prometheus 1.1 安裝 prometheus官網下載地址 sudo -i mkdir -p /opt/prometheus #移動解壓后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #創建一個專門的prometheus用戶&#xff1a; -M 不創建家目錄&#xff0c; -s 不讓登錄 useradd…

Navicat 技術指引 | 適用于 GaussDB 分布式的數據遷移工具

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

單例模式---餓漢式、懶漢式

一、什么是單例模式 單例模式&#xff0c;指的是一個類中的對象只能有一個&#xff0c;它在內存中只會創建一次對象的設計模式。 二、餓漢式 public class SingleTon {// 私有的構造方法private SingleTon() {};// 1. 餓漢式private static SingleTon instance new SingleTon…

整數以及浮點數在內存中的存儲

一.整數在內存當中的存儲 數據在內存中是以十六進制補碼的形式進行存儲的。 原碼表示法簡單易懂&#xff0c;適用于乘法&#xff0c;但用原碼表示的數進行加減運算比較復雜&#xff0c;當兩數相加時&#xff0c;如果同號則數值相加&#xff0c;但是進行減法時要先比較絕對值的…

認知覺醒(六)

認知覺醒(六) 第二節 感性&#xff1a;頂級的成長竟然是“憑感覺” 人類生存于世&#xff0c;比拼的是腦力思維&#xff0c;但極少有人知道&#xff0c;我們的身體里還有一個更高級的系統&#xff0c;若能善用&#xff0c;成就非凡。 1941年&#xff0c;德軍對英國本土進行…

Neo4j介紹

1、Neo4j介紹 Neo4j 是一個圖數據庫管理系統&#xff0c;它專注于存儲和處理圖形結構的數據。圖數據庫是一類特殊的數據庫&#xff0c;用于有效地管理圖形數據模型&#xff0c;其中數據以節點、關系和屬性的形式存儲。 2、Neo4j特點 圖數據庫&#xff1a; Neo4j 是一種 NoSQ…