成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

計(jì)算機(jī)圖形學(xué):變換矩陣

開(kāi)發(fā) 前端
通常我們會(huì)用升維的 3x3 矩陣,來(lái)表示一個(gè)變換矩形,因?yàn)樽詈笠恍杏肋h(yuǎn)都是 [0, 0, 1],所以我們的函數(shù)只需要傳矩陣的前兩行,共 6 個(gè)值。比如 Canvas 的 ctx.transform 也是只接受 6 個(gè)值。

大家好,我是前端西瓜哥。今天我們來(lái)學(xué)變換矩陣。

線性變換

矩陣乘法是來(lái)自線性代數(shù)的內(nèi)容。

首先我們有一個(gè)二維的向量 (x, y),它在線性代數(shù)中,我們會(huì)這么表示:

圖片

向量在幾何中會(huì)用一條起始于原點(diǎn)的箭頭表示。

圖片

向量我們也常常看作一個(gè)點(diǎn)。因?yàn)楫?dāng)有大量向量要繪制時(shí),箭頭就會(huì)非常的多,會(huì)讓畫(huà)面非常混亂,所以要簡(jiǎn)化為點(diǎn)。

向量加法:對(duì)應(yīng)位置進(jìn)行相加即可,在幾何中可以將多個(gè)向量頭尾相連,最終的路徑就是加法的結(jié)果:

圖片

數(shù)乘:或者叫標(biāo)量乘法,指的是將向量和一個(gè)常量數(shù)字進(jìn)行相乘,也是對(duì)應(yīng)位置相乘,在幾何中表現(xiàn)為對(duì)向量縮放:

圖片

有了上面兩個(gè)概念,我們得到對(duì)于一個(gè)二維向量,它是 x 軸上和 y 軸上的單位向量(一種 基向量)進(jìn)行縮放后組合而成:

圖片

然后就是我們主角 線性變換了。

線性變換的 “變換”,指的是 “函數(shù)”,它接受一個(gè)向量,然后返回一個(gè)向量。在幾何中,它表示了一個(gè)向量是怎么從原來(lái)的指向變換(縮放旋轉(zhuǎn)等過(guò)程)成另一個(gè)指向。

線性變換的 “線性”,指的是這個(gè)變換是符合一些特性的,首先是直線變換后還是直線,然后就是原點(diǎn)保持在原來(lái)的位置。

圖片

線性變換,一種理解為,矩形的每列改變了對(duì)應(yīng)基向量的值。

比如上面的公式,我們的 (x, y) 向量原來(lái)是基于 i 向量 (1, 0) 和 j 向量 (0, 1) 進(jìn)行數(shù)乘得到的。

但通過(guò)一個(gè)矩陣,我們的 i 和 j 分別變成了(a, c) 和 (b, d),即標(biāo)準(zhǔn)換了,基于這個(gè)新標(biāo)準(zhǔn)得到的新的值就是線性變換的輸出向量。

下面我們看一些常見(jiàn)的變換矩陣。

縮放

縮放,就是將一個(gè)向量(或者點(diǎn))的 x 和 y 各自進(jìn)行指定比例的縮放。

假設(shè) x 方向縮放比例為 sx,y 方向縮放比例為 sy。簡(jiǎn)單的算法就是:

x2 = x * sx;
y2 = y * sy;

二維 2x2 縮放矩陣為:

圖片

二維矩陣運(yùn)算過(guò)程為:

圖片

實(shí)際上我們會(huì)使用三維縮放矩陣,原因會(huì)在下面平移中講解。

三維縮放矩陣為:

圖片

下邊和右邊各加上 0 0 1 即可。

平移

平移,就是將一個(gè)向量(或者點(diǎn))的 x 和 y 各自移動(dòng)一段距離。

假設(shè) x 方向移動(dòng) dx 距離,y 方向移動(dòng) dy 距離。

直接用幾何的描述:

x2 = x + dx;
y2 = y + dy;

我們無(wú)法用一個(gè)二維矩陣來(lái)表示平移變換,為此我們需要升維,升到三維,通過(guò)額外的一個(gè) z 軸的基向量的斜切來(lái)模擬二維中的平移。

輸入向量也需要升維,加多一個(gè)值為 1 的第三維度:

圖片

三維平移矩陣為:

圖片

運(yùn)算過(guò)程:

圖片


為了減少計(jì)算量,我們會(huì)使用 復(fù)合矩陣,就是將多個(gè)變換矩陣通過(guò)結(jié)合律計(jì)算出來(lái)的矩陣。

它是多種矩陣的組合體,但相比對(duì)一個(gè)向量一個(gè)個(gè)進(jìn)行矩陣乘法,符合矩陣能一次計(jì)算出來(lái)。因?yàn)槠揭频奶厥庑裕晕覀兺ǔ2粫?huì)使用 2x2 矩陣來(lái)表示一個(gè)變換矩陣,而是用 3x3 矩陣,來(lái)和平移矩陣做兼容。

旋轉(zhuǎn)

點(diǎn)沿原點(diǎn)逆時(shí)針旋轉(zhuǎn)指定角度,得到新的坐標(biāo)點(diǎn),有以下公式:

圖片

三維旋轉(zhuǎn)矩陣:

圖片

逆時(shí)針旋轉(zhuǎn) 90度,可以看作是給基變量做旋轉(zhuǎn):

圖片

斜切

斜切,其實(shí)就是固定一個(gè)基向量不變,改變另一條基向量。斜切是有方向的。

水平斜切:

圖片

或垂直斜切:

圖片

水平斜切動(dòng)圖:

圖片

代碼實(shí)現(xiàn)

interface IVector {
x: number;
y: number;
}

/**
* a c e
* b d f
* 0 0 1
*/
type ITransfrom = [
a: number,
b: number,
c: number,
d: number,
e: number,
f: number
];

/**
* 變換矩陣
*/
export function transform(
{ x, y }: IVector,
[a, b, c, d, e, f]: ITransfrom
): IVector {
return {
x: x * a + y * c + e,
y: x * b + y * d + f,
};
}

通常我們會(huì)用升維的 3x3 矩陣,來(lái)表示一個(gè)變換矩形,因?yàn)樽詈笠恍杏肋h(yuǎn)都是 [0, 0, 1],所以我們的函數(shù)只需要傳矩陣的前兩行,共 6 個(gè)值。比如 Canvas 的 ctx.transform 也是只接受 6 個(gè)值。

結(jié)尾

本文簡(jiǎn)單講了一下變換矩陣。

責(zé)任編輯:姜華 來(lái)源: 前端西瓜哥
相關(guān)推薦

2016-01-22 11:09:40

計(jì)算機(jī)圖形學(xué)虛擬現(xiàn)實(shí)三維建模

2021-04-20 10:28:49

計(jì)算機(jī)互聯(lián)網(wǎng) 技術(shù)

2020-03-19 16:00:05

計(jì)算機(jī)互聯(lián)網(wǎng) 技術(shù)

2020-03-03 14:42:40

AI 數(shù)據(jù)人工智能

2023-08-05 13:53:34

2023-05-05 13:10:16

3D數(shù)字人

2022-08-30 09:24:47

數(shù)據(jù)算法

2020-12-11 07:59:50

AI

2022-10-30 17:33:58

前端圖形學(xué)vue3

2017-11-15 09:41:14

數(shù)據(jù)可視化數(shù)據(jù)科大數(shù)據(jù)

2025-01-23 09:23:41

2023-12-01 09:00:00

NeRF技術(shù)人工智能

2023-04-27 08:27:29

WebGL變形矩陣

2012-01-09 09:51:04

2011年度IT博客大IT博客大賽2011年度十大杰出I

2024-09-30 13:50:00

2014-04-10 09:40:51

System 360計(jì)算機(jī)計(jì)算機(jī)系統(tǒng)

2021-02-20 20:55:06

USB接口總線

2021-01-27 14:18:17

量子計(jì)算傳統(tǒng)計(jì)算量子機(jī)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久91| 四虎海外| www.亚洲区| 国产中文字幕在线 | 99精品久久久久久中文字幕 | 在线播放精品视频 | 精品九九| 99成人 | 亚洲精品一区二区二区 | 亚洲视频一区 | 九九热在线免费视频 | 黄色片免费 | 亚洲欧美视频一区 | 波多野结衣在线观看一区二区三区 | 欧美激情第一区 | 国产精品高潮呻吟久久久久 | 在线成人av | 久久精品中文 | 9porny九色视频自拍 | 午夜一区 | 99亚洲精品视频 | 9久9久9久女女女九九九一九 | 国产日韩欧美二区 | 国产精品一区二区在线免费观看 | 亚洲高清久久 | 欧美久久久网站 | 日本午夜视频 | 免费观看日韩精品 | 日韩欧美在线视频 | 中文字幕观看 | 国产成人在线一区二区 | 91精品久久久久久久久 | 91精品国产综合久久婷婷香蕉 | 精品久久久久久久 | 亚洲国产成人在线观看 | 青青草一区二区三区 | 亚洲精品一区中文字幕 | 久久久久国产精品人 | 中文字幕在线观看www | 国产精品视频网 | 九七午夜剧场福利写真 |