三維向量筆記

2021-10-09 16:50:30 字數 2887 閱讀 5766

筆記

一、1)三維向量vec3的使用:

(1)vec3: cocos定義的乙個三維向量的類,在cc模組中;

(2)向量在每個座標軸的分量: x、y、z:

(3)構造乙個向量的3種方式:

new vec3(v: vec3): new了乙個vec3的例項出來,然後我們的例項裡面的x,y,z–>v的分量一樣;

new vec3(x,y,z): new vec3的例項,例項xyz分別是這個引數;

cc模組也為我們定義了乙個函式: cc.v3(x,y,z)

xyz是可選的,可以全都不填

(4)vec3定義了一些常用的靜態常量(只用就行,不要修改他們)

uint_x: readonly (1,0,0)

uint_y: readonly (0,1,0)

uint_z: readonly (0,0,1)

zero: (0,0,0)

one: readonly (1,1,1)

neg_one: readonly (-1,-1,-1)

(5)常用向量的靜態方法

向量長度: 開根號(xx + yy + z*z)

vec3.len() -->靜態方法求

v4.length–>直接通過方法搞

加減法:

加法:v4.add(***)

vec3.add(xx, xx, xx)-->不改變向量結果,儲存到另外乙個變數

減法:v4.subtract(xx)

vec3.subtract(v3, xx, xx)-->不改變向量結果,儲存到另外乙個變數

加減法的本質: 三角形法則 四邊形法則 c = a+b b = c-a

應用: 相對於座標原點,由從a點運動到b點, a到b的方向 向量怎麼求呢? dir=b-a即可得到這個方向向量

2個向量點的距離:

(x1,y1,z1) (x2,y2,z2) --> (x2-x1平方 + y2-y1的平方 + z2-z1的平方)-->開平方

vec3.distance(v4, v3)

2個點之間: 向量的線性插值:

(x1,y1,z1), (x2,y2,z2) --> 從a到b的點-->[0,1]這個範圍-->a = a1 + t*(a2-a1)

這個結果變為:修改自己的向量,因為返回的是this

vec3.lerp(v3, v1, v4, 0.3): v3 = v1 + 0.3 * (v4-v1)

v1.lerp(v4, 0.3)-->修改到自己v1上

向量的點乘(得到乙個數值,不是向量):

理論:a(x1,y1,z1) b(x2,y2,z2)-->a*b = x1*x2 + y1*y2+ z1*z2

a*b = |a| * |b| * cos(夾角)-->得到了2個向量的余弦值出來

夾角:2個向量之間,較小的哪個角度[0, 180]

cocos中計算:

靜態方法: vec3.dot(v1, v4)-->是乙個number數值

向量的叉積(返回的是乙個向量):

理論:axb = (y1*z2-y2*z1, -(x1*z2 - x2*z1), x1*y2-x*2y1)

叉積的幾何意義:ab 2個向量 和 原點構成平面的法向量

垂直向上: axb

垂直向下: bxa

cocos計算:

vec3.cross(v3,v1,v4)-->v3 = v1xv4

v1.cross(v4)-->讓v1被修改了 v1 = v1 * v4

向量的單位化(單位向量: 方向相同,長度為1):

理論:方向相同的向量有n多個

特點:同乙個方向的,成比例 x1/x2 = y1/y2 = z1/z2 = len1/len2

cocos中計算:

vec3.normalize(v3, v4) v3 = v4的單位向量

v4.normalize()

(6)將乙個標量分解到對應的向量上

已知方向向量dir, 速度為100,距離為100–>dir這個方向上;

x/x_new = len / 100 --> x_new = 100 * x / len–>dir為1, x_new = speed * x;

含義與運用: 已知乙個物體的速度大小和方向,沿著這個方向走–>沿著x走這個多,沿著y走這麼多(同時修改x和y即可);

其實就是初中物理的: 運動的分解; 高中物理叫做:正交分解

之所以能分解,那麼就是根據這個等式計算得到的;

二、let v: vec3 = cc.v3(3, 4, 5);

let v1 = new vec3(0, 0, 0);

let v3 = new vec3(v);

console.log(vec3.unit_x, vec3.unit_y, vec3.unit_z, vec3.zero, vec3.one, vec3.neg_one);

let v4 = new vec3(vec3.unit_x);

console.log(v4);

console.log(vec3.len(v4));

console.log(v4.length());

v4.add(vec3.unit_y);

vec3.add(v3, vec3.one, vec3.neg_one);

console.log(v3);

v4.subtract(vec3.unit_x);

let len: number = vec3.distance(v4, v3);

vec3.lerp(v3, v1, v4, 0.3);

vec3.dot(v1, v4);

v1.cross(v4);

v4.normalize();

三維向量類

還是在讀書的時候幫外專業朋友做作業,用gdi實現三維空間的立方體繪製和旋轉的操作,那個時候自己根據 線性代數與空間解析幾何 以及 計算機圖形學 等課程的相關知識寫了乙個三維向量類。後來做了些二維和三維的東西發現用向量操作會使很多問題變得簡單直觀,尤其是在opengl程式設計的時候這種感覺尤為明顯。經...

Unity三維數學(向量)

什麼是向量?乙個數字列表,表示各個維度上有向位移向量的形式 乙個有大小有方向的物理量 大小就是向量的模長 方向描述了空間中向量的指向 可以表示物體的位置方向 向量的大小 向量各分量平方和的平方根 公式 x y z 再平方根 api float dis vertor.magnitude 模的平方 ve...

三維視覺學習筆記

0.引言 怎麼獲得3d資訊?用2d相機 距離感測器 在3d世界獲得3d資訊?從相機中進行2d 3d重建 用kinect感測器,雷射距離感測器直接3d獲取 感測器思維?用陣列相機 1.2d到3d的重構 可以利用小孔成像或雙目攝像原理實現2d到3d的重構。通過特徵來對應關係,如果相機移動了,就要找到對應...