[Unity] 3D数学基础 - 坐标系、向量、矩阵
一、坐標(biāo)系
模型坐標(biāo)系:
物體自身的坐標(biāo)系,只描述自身各個(gè)頂點(diǎn)的情況。
在3D模型坐標(biāo)系中,z方向前向如果是負(fù)值,我們稱為右手坐標(biāo)系,如果是正值,我們稱為左手坐標(biāo)系。在3DMax中使用了右手坐標(biāo)系,Unity使用了左手坐標(biāo)系。
?
世界坐標(biāo)系:
系統(tǒng)的絕對(duì)坐標(biāo)系,在沒(méi)有建立用戶坐標(biāo)系之前畫(huà)面上所有點(diǎn)的坐標(biāo)都是以該坐標(biāo)系的原點(diǎn)來(lái)確定各自的位置的。
?
攝像機(jī)坐標(biāo)系:
攝像機(jī)坐標(biāo)系是和觀察者密切相關(guān)的坐標(biāo)系。攝像機(jī)坐標(biāo)系和屏幕坐標(biāo)系相似,差別在于攝像機(jī)坐標(biāo)系處于3D空間中而屏幕坐標(biāo)系在2D平面里。攝像機(jī)坐標(biāo)系能被看做是一種特殊的“物體”坐標(biāo)系,該“物體”坐標(biāo)系就定義在攝像機(jī)的屏幕可視區(qū)域。攝像機(jī)坐標(biāo)系中,攝像機(jī)在原點(diǎn),x軸向右,z軸向前(朝向屏幕內(nèi)或攝像機(jī)方向),y軸向上(不是世界的上方而是攝像機(jī)本身的上方)。
?
屏幕坐標(biāo)系:
屏幕投影過(guò)后的坐標(biāo)系。它是一個(gè)2D的坐標(biāo)系。投影分為兩種,透視投影(近大遠(yuǎn)小)和正交投影(不管物體的遠(yuǎn)近,大小不變)。
?
從以上四種坐標(biāo)系統(tǒng)來(lái)看,我們要演變它的過(guò)程到最后屏幕上我們能看到的畫(huà)面,需要經(jīng)過(guò)模型坐標(biāo)系、世界坐標(biāo)系、攝像機(jī)坐標(biāo)系,再投影到屏幕上的變換過(guò)程。
?
二、 向量
?
向量,就是有方向的量,只有方向和長(zhǎng)度,沒(méi)有位置信息。我們?cè)诳疾煜蛄繒r(shí),總是以世界坐標(biāo)系的原點(diǎn),向它所在的方向投射指定的長(zhǎng)度。
?
2D向量: (x, y)
3D向量: (x, y, z)
4D向量: (x, y, z, w)
?
存在4D向量主要是要和矩陣進(jìn)行計(jì)算。
?
向量加法: 將向量的各項(xiàng)分別相加。
?
V1 = (1, 0), V2 = (0.5, 0.5)
V3 = V1 + V2 = (1, 0) + (0.5, 0.5) = (1.5, 0.5)
?
向量減法: 將向量的各項(xiàng)分別相減。
?
V1 = (0.7, 1.5), V2 = (0.5, 0.5)
V3 = V1 + V2 = (0.7, 1.5) - (0.5, 0.5) = (0.2, 1.0)
?
向量和標(biāo)量的乘法: 把標(biāo)量和向量中的每個(gè)分量分別相乘。
?
V = (1, 2, 2), D = 2
R = V * D = 2 * (1, 2, 2) = (2, 4, 4)
?
向量點(diǎn)積: 發(fā)生在向量和向量之間。點(diǎn)積的結(jié)果是一個(gè)標(biāo)量值。
?
V1 = (1, 0)
V2 = (0.5, 0.866)
?
點(diǎn)積 = Dot(V1, V2) = V1 * V2 = (1, 0) * (0.5, 0.866) = (1*0.5 + 0*0.866) = 0.5
?
向量點(diǎn)積的幾何意義:
Dot(V1, V2) = ||V1|| * ||V2|| * cos(ɑ)
cos(ɑ) = Dot(V1, V2) / (|V1|| * ||V2||)
當(dāng)V1和V2都是規(guī)范化向量時(shí):
cos(ɑ) =V1*V2
ɑ = acos(V1*V2) = acos(0.5) = 60度
其實(shí)就是acos(點(diǎn)積)。
點(diǎn)積為1,角度為0度,點(diǎn)積為0,角度為90度。
?
通過(guò)此性值,我們可以知道兩個(gè)向量的夾角是多大。一般的情況是,只要夾角小于90度,他們的點(diǎn)積總是>0,如果夾角剛好是90度,點(diǎn)積則=0,如果夾角大于90度,點(diǎn)積會(huì)是一個(gè)負(fù)數(shù)。
?
向量叉積: 運(yùn)算結(jié)果還是一個(gè)向量。它的運(yùn)算法則是交叉相乘。
?
V1 = (1, 0, 0)
V2 = (0, 1, 0)
?
?
?
向量叉積的幾何意義
?
兩個(gè)向量的叉積得到了新的向量,它垂直于原來(lái)的兩個(gè)向量所在平面。當(dāng)某個(gè)向量垂直于一個(gè)平面,可以看作這個(gè)平面的法向量。
叉積運(yùn)算是有順序的, V1 x V2 和 V2 x V1 的叉積值是不一樣的。順序不同,新的法向量的方向是相反的。
?
?
三、矩陣
?
矩陣的維度和記法
矩陣是一個(gè)類(lèi)似于二維數(shù)組的東西,但在數(shù)學(xué)概念上是完全不一樣的。矩陣的下標(biāo)是(1, 1)開(kāi)始,數(shù)組是(0, 0)開(kāi)始。在數(shù)學(xué)上,我們一般用大寫(xiě)的M來(lái)表示矩陣。
?
?
?
矩陣的轉(zhuǎn)置
?
矩陣的轉(zhuǎn)置就是把矩陣的行變成列。比如把第一行變成第一列,第二行變成第二列。
?
向量也可以看作一種矩陣。有時(shí)候我們會(huì)說(shuō)行向量、列行量,其實(shí)我們是以矩陣的概念來(lái)看它。
?
矩陣和標(biāo)量的乘法
?
一個(gè)矩陣和標(biāo)量相乘,就是用標(biāo)量與矩陣每一個(gè)元素依次相乘。得到的矩陣與原矩陣的維度是一樣的。
?
矩陣和矩陣的乘法
?
用第一個(gè)矩陣的第一行的每個(gè)分量,與第二個(gè)矩陣的第一列的分量相乘,將結(jié)果相加,得到新的分量。
?
?
矩陣與矩陣相乘,其結(jié)果與兩個(gè)矩陣的順序是有關(guān)的,不同的順序,結(jié)果是不一樣的。
?
兩個(gè)內(nèi)部維度不同的矩陣是不能夠相乘的。
?
一個(gè) N * M階與S * T階矩陣相乘,必須滿足 M和S維度相同,乘法結(jié)果是一個(gè)N * T階矩陣。
?
?
一個(gè)列向量是不能與一個(gè)3x3矩陣相乘的,但一個(gè)3x3 矩陣可以乘以一個(gè)列向量。
一個(gè)行向量可以與一個(gè)3x3矩陣相乘。
一個(gè)行向量乘以一個(gè)3x3矩陣,結(jié)果與一個(gè)相同的3x3矩陣轉(zhuǎn)置后乘以相同的行向量一樣,結(jié)果是一個(gè)向量(但一個(gè)是行向量,一個(gè)是列向量)。
?
單位矩陣
?
在矩陣中,從左上角到右下角這樣的一條線我們稱為主對(duì)角線。在主對(duì)角線上所有元素的值都是1,其它元素為0的矩陣,我們稱為單位矩陣。
?
?
單位矩陣A乘以另一個(gè)矩陣B,結(jié)果矩陣為B。也就是說(shuō)單位矩陣乘以一個(gè)矩陣,它不會(huì)改變這個(gè)矩陣的元素。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangyxd/articles/5408441.html
總結(jié)
以上是生活随笔為你收集整理的[Unity] 3D数学基础 - 坐标系、向量、矩阵的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IoC组件Unity再续~根据类型字符串
- 下一篇: TCP/IP 网络编程 (三)