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操作之叠代器(scan和hscan)講解
edi 服務器 cursor redis scan 模式 att 情況 叠代器 當我們需要遍歷Redis所有key或者指定模式的key時,首先想到的是KEYS命令,但是如果redis數據非常大,並且key也非常多的情況下,查詢的時候很可能會很慢,造成整個redis阻塞,那麽
1.19.ARM彙編指令集7之儲存器訪問指令(LDR和STR)
ARM彙編指令集的儲存器訪問指令: LDR & STR & LDM & STM & SWP 這裡先總的介紹一下儲存器訪問指令,然後再詳解說前兩個(LDR&STR
mybatis之map傳參(List和物件)
map傳參在我們實際開發會經常用到,也是一種特別方便的傳參方式。 話不多說上程式碼 service層:、 Map<String, Object> params = new HashMap<String, Object>(); Lis
mysql小技巧之null值對映(IF和IFNULL)到其他有意義的值
資料庫關係模型建立者 - 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