1. 程式人生 > >Shader學習基礎之二數學基礎(向量和矩陣)

Shader學習基礎之二數學基礎(向量和矩陣)

基礎篇(二)

向量

點,向量和標量的區別
點是一個沒有大小之分的空間中的位置
向量是一個有模有方向但是沒有位置的量
標量是一個只有模沒有方向的量

向量和向量的加法:
A+B = (Ax+bx,Ay+By)
向量和向量的減法:
A-B = (Ax-bx,Ay-By)
注意:向量不能和標量相加減,不能和維度不一樣的向量相加減
向量和標量的除法:
A/a = (Ax/a,Ay/a)
向量和標量的乘法:
A*a = (Ax*a,Ay*a)
對於加減法:我們有三角形法則求距離
對於乘除法:我們可以求縮放
向量的模:
|A| = 每個分量的平方和然後開平方
向量的點積:


A.B = Ax.Bx+Ay.By+Az.Bz
意義:A點乘B向量代表B在A上面的投影,當結果大於0,方向為正,反之,方向為反
A.B=|A|.|B|[email protected]
我們可以通過角度的餘弦值,來知道兩個向量之間的方向關係
向量的叉積:
AxB = (AyBz-AzBy,AzBx-AxBz,AxBy-AyBx)
叉乘用來求垂直於AB平面的向量,求副切線

矩陣

矩陣在shader中的應用

float2 centerUV = float2(0.5,0.5);//中心點
float rotaNormalAngle =(_BumpAngle * PI)/180
;//旋轉角度 float CosNormalAngle = cos(rotaNormalAngle);//餘弦值 float SinNormalAngle = sin(rotaNormalAngle);//正弦值 float2 uvnormal = (mul(float3(i.uvnormal-centerUV,1),float3x3(1,0,0,0,1,0,_BumpShiftX,_BumpShiftY,1))).xy;//這是處理uv座標,所以使用的是3維的平移矩陣 uvnormal = mul(uvnormal,float2x2(_BumpRepeat,0,0,_BumpRepeat));//2維縮放矩陣
uvnormal = mul(uvnormal,float2x2(CosNormalAngle,-SinNormalAngle,SinNormalAngle,CosNormalAngle)) + centerUV;//2維旋轉矩陣

矩陣是3D數學的重要基礎,它主要用來描述兩個座標系統之間的關係,通過定義一種運算而將一個座標系中的向量轉換到另一個座標系。
向量是標量的陣列,矩陣是向量的陣列
矩陣的維度

這裡寫圖片描述

矩陣的維度被定義為它包含了多少行和多少列,上面這個矩陣為4x3的矩陣,我們表示矩陣當中的某個元素,一般用Mij來表示,i表示行,j表示列。
方陣
行數和列數相同的矩陣被稱為是方陣

這裡寫圖片描述

方陣行數和列數一樣的元素被稱為對角線元素,其他元素均為非對角線元素
對角矩陣:如果所有非對角線元素都為0
單位矩陣:一種特殊的對角矩陣,n維單位矩陣記作In,是nxn的矩陣,對角線的元素為1,其他元素為0.單位矩陣非常特殊,他是矩陣的乘法單位元,基本性質是用任意一個矩陣乘以單位矩陣,都將得到原來的矩陣。

注意:對角線的元素只有一條,並不包括另外一條.

轉置
矩陣的轉置就是把矩陣沿x軸旋轉180度,然後沿z軸順時針旋轉90度
(書上寫的沿著矩陣的對角線翻折)

這裡寫圖片描述
定理
1.對於任意矩陣,將一個矩陣轉置一次,再轉置一次便會得到原來的矩陣,這條法則也適用於向量
2.對於任意對角矩陣,都有這個矩陣的轉置矩陣等於它自己

矩陣的運算
矩陣和標量的乘法
矩陣M和標量k相乘
這裡寫圖片描述

簡而言之,就是用k去乘以矩陣中的每個元素,矩陣樣式不變
矩陣與矩陣的乘法:
條件:矩陣M和矩陣N相乘,M的行數必須和N的列數一樣,否則,乘法無意義
這裡寫圖片描述

c1 = a1*b1 + a2*b4
行和列相乘
注意事項
矩陣乘法不滿足交換律
矩陣乘法滿足結合律
矩陣積的轉置等於先轉置矩陣然後以相反的方向乘

向量和矩陣的乘法
1.行向量左乘矩陣,結果是行向量
2.列向量右乘矩陣,結果是列向量
反之,則無定義
DirectX使用的是行向量
等式中使用列向量更好
OpenGL使用列向量

矩陣的幾何解釋
矩陣是如何變換向量的?
這裡寫圖片描述

如果把矩陣的行解釋為座標系的基向量,那麼乘以該矩陣就相當於執行了一次座標變換,如果有aM =b,那麼我們就說M將a轉換到b.

矩陣的形式:
矩陣的每一行都能理解為轉換之後的基向量

矩陣和線性變換:
變換物體和變換座標系
變換物體:將一個物體順時針旋轉90度,意味著旋轉物體上的點,座標移動到了一個新的位置
變換座標系:當我們旋轉座標系的時候,物體本身並沒有移動,只是我們在另外一個座標系中描述它
兩種變換實際上是等價的,將物體變換一個量,等價於將座標系變換一個相反的量

旋轉矩陣的推導
這裡寫圖片描述
我們可以根據三角函式cosθ = x/斜邊,而且我們知道斜邊的長度為1,所以x = cosθ
同理y = sinθ,因此p點的座標可以表示為p(cosθ,sinθ).
同理,我們也可以用三角函式求得q的座標q(-sinθ,cosθ).
然後我們可以組合一個2D的旋轉矩陣
這裡寫圖片描述

這裡只是列舉了2d旋轉矩陣的推導,3d的旋轉矩陣也差不多,只不過繞某個軸旋轉的時候,保持這個軸不動就行。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

繞任意軸n,角度θ的旋轉矩陣

縮放矩陣的推導:
這裡寫圖片描述

如果要對p點進行縮放,那麼我們直接改變的就是在p的基礎座標上進行縮放,只需要在p的座標乘或者除以某個係數既可
由此我們可以推導二維縮放矩陣:
這裡寫圖片描述
矩陣N對二維向量進行縮放,縮放係數為x,y

這裡寫圖片描述
擴充的三維縮放矩陣

這裡寫圖片描述
沿著3d任意軸的縮放矩陣,n為方向,k為縮放因子

平移矩陣
平移不屬於線性變換
因為平移不會改變方向,所以我們需要增加一個維度,對當前的向量進行平移操作
這裡寫圖片描述

相關推薦

Shader學習基礎數學基礎向量矩陣

基礎篇(二) 向量 點,向量和標量的區別: 點是一個沒有大小之分的空間中的位置 向量是一個有模有方向但是沒有位置的量 標量是一個只有模沒有方向的量 向量和向量的加法: A+B = (Ax+bx,Ay+By) 向量和向量的減法: A-B =

數學基礎向量矩陣

原文地址:OpenGL 變換 原文 Transformations 作者 JoeyDeVries 翻譯 Django, Krasjet, BLumia

MyBatis學習筆記--關聯關係一對一一對多

首先給大家推薦幾個網頁: http://blog.csdn.net/isea533/article/category/2092001 沒事看看 - MyBatis工具:www.mybatis.tk http://www.mybatis.org/mybatis-3/zh/gettin

JavaScript 面向物件 —— 函式上下文call() apply()

本系列文章根據《愛前端邵山歡老師深入淺出的js面向物件》視訊整理歸納 call() 和 apply() 這兩個都是函式的方法,只有函式能夠通過點方法呼叫call()、apply(),表示用指定的上下文執行這個函式。 如下,定義一個函式 fun,當 fun 函式裡

Linux 基礎 高階網路配置 網路橋接

一、網路橋接 網路橋接用網路橋實現共享上網主機和客戶機除了利用軟體外,還可以用XP自帶的網路橋建立連線用雙網絡卡的機器做主機。 橋接: 一般的交換機,網橋就有橋接作用。就交換機來說,本身有一個埠與mac的對映表,通過這些,隔離了衝突域(collision)。 簡單的說就是通過網橋可以把

Linux基礎 高階網路配置 鏈路聚合

一、鏈路聚合 簡介: 鏈路聚合(Link Aggregation)是一個計算機網路術語,指將多個物理埠匯聚在一起,形成一個邏輯埠,以實現出/入流量吞吐量在各成員埠的負荷分擔,交換機根據使用者配置的埠負荷分擔策略決定網路封包從 哪個成員埠傳送到對端的交換機。當交換機檢測到其中一個成員埠的鏈路發

18.C#基礎不安全程式碼在整理當中

     前面有寫到過,核心C#語言沒有將指標引入它所支援的資料型別,從而與C和C++有著顯著的區別。作為代替,C#提供了各種引用型別,並能建立可由垃圾回收器管理的物件。這就使得C#比C或C++安全的多。      在核心C#語言中,乾脆就不可能有

Linux 基礎 pxe 系統安裝 網線安裝系統

一、PXE簡介          PXE(preboot execute environment,預啟動執行環境)是由Intel公司開發的最新技術,工作於Client/Server的網路模式,支援工作站通過網路從遠端

13. Java基礎之類型信息RTTI反射

getmethod 類型 void import 得到 攜程 表達 返回 現在 一. 背景 並不是所有的Class都能在編譯時明確,因此在某些情況下需要在運行時再發現和確定類型信息(比如:基於構建編程,),這就是RTTI(Runtime Type Info

JavaScript 面向物件 —— 函式上下文this的指向

本系列文章根據《愛前端邵山歡老師深入淺出的js面向物件》視訊整理歸納 函式上下文 在 JavaScript 中,函式的上下文是有規律可循的,基本可以分為以下幾項: 規律一:函式用圓括號呼叫,函式上下文是 window 物件。 如下,函式 function f

學習筆記——前景檢測演算法未完待續

    這段時間,本人主要對視訊前景提取演算法進行了學習,在此寫下學習筆記~希望與各位看客多交流學習(本學習筆記部分來自我的三位師弟的調研報告~由於保密隱私,不在此公開,但是非常感謝三位師弟~),好下面進入正題 前景是影象或視訊場景中可見性、顯著性更強的部分。前

MyBatis學習筆記三--關聯關係多對多

MyBatis學習筆記(三) 關聯關係 首先給大家推薦幾個網頁: http://blog.csdn.net/isea533/article/category/2092001 沒事看看 - MyBatis工具:www.mybatis.tk http://www.mybatis.o

Linux Framebuffer驅動框架軟體架構未完待續

/************************************************************************************************************************************/

redis操作叠代器scanhscan講解

edi 服務器 cursor redis scan 模式 att 情況 叠代器 當我們需要遍歷Redis所有key或者指定模式的key時,首先想到的是KEYS命令,但是如果redis數據非常大,並且key也非常多的情況下,查詢的時候很可能會很慢,造成整個redis阻塞,那麽

1.19.ARM彙編指令集7儲存器訪問指令LDRSTR

ARM彙編指令集的儲存器訪問指令: LDR & STR & LDM & STM & SWP 這裡先總的介紹一下儲存器訪問指令,然後再詳解說前兩個(LDR&STR

mybatismap傳參List物件

map傳參在我們實際開發會經常用到,也是一種特別方便的傳參方式。 話不多說上程式碼 service層:、 Map<String, Object> params = new HashMap<String, Object>(); Lis

mysql小技巧null值對映IFIFNULL到其他有意義的值

資料庫關係模型建立者 - E.F.Codd博士在關係資料庫理論中引入了NULL概念。 根據Dr.E.C.F.Codd的表述,NULL表示未知值或缺少資訊。其中mysql還支援NULL表示缺少或不適用資訊的概念。所以在資料庫表中,我們可能會儲存包含NULL值的資料。但是如果以報

學習筆記shell指令碼基礎

Shell----if&for 判斷檔案是否存在 [[email protected] ~]# vi 1.sh [[email protected] ~]# bash -x 1.sh + l=123/121 + '[' '!' -e

頻率域濾波基礎讀數字影象處理學習halcon

二維離散傅立葉(DFT)變化及其反傅立葉變換(IDFT) 傅立葉變換通用形式 對通用形式來講,c=1,s=-1即為傅立葉變化(影象空間域轉頻域);c=1/MN,s=1即為逆變換(頻域轉空間域) halcon運算元fft_generic(Image : ImageFFT

python大法-一些基礎

計算機編程 python 獨立博客 hello 解釋器 個人獨立博客出處:http://www.xbman.cn/出處:http://www.xbman.cn/article/3Python是一種解釋性計算機編程語言。采用縮進式語法,寫起來的感覺有點像排了版的shell,這裏要註意寫pyt