「C3dl」修訂間的差異
出自 MozTW Wiki
(→Vector 向量類別) |
(→Matrix 矩陣類別) |
||
行 48: | 行 48: | ||
* isVectorZero(vec) - '''判斷向量長度是否為 0,正確的說法: 判斷是否極接近 0,每個軸向誤差在 0.00001 以內''' | * isVectorZero(vec) - '''判斷向量長度是否為 0,正確的說法: 判斷是否極接近 0,每個軸向誤差在 0.00001 以內''' | ||
* getAngleBetweenVectors(vecOne, vecTwo) - '''計算兩向量間的夾角''' | * getAngleBetweenVectors(vecOne, vecTwo) - '''計算兩向量間的夾角''' | ||
+ | |||
+ | === Matrix 矩陣類別 === | ||
+ | c3dl 的矩陣在數學上是一個 4x4 的二維矩陣,但是在 Javascript 實作上是用一維陣列來表達,而不是二維陣列,其索引值如下: | ||
+ | |||
+ | +- -+ | ||
+ | | 0, 4, 8, 12 | | ||
+ | | 1, 5, 9, 13 | | ||
+ | | 2, 6, 10, 14 | | ||
+ | | 3, 7, 11, 15 | | ||
+ | |||
+ | * isValidMatrix(mat) - '''判斷是否為有效的矩陣''' | ||
+ | * makeIdentityMatrix() - '''產生單位矩陣,也就是斜對角都為 1 其餘為 0 的矩陣''' | ||
+ | * makeZeroMatrix() - '''產生全部是0 的矩陣''' | ||
+ | * makeMatrix(e00, e01, e02, e03, e10, e11, e12, e13, e20, e21, e22, e23, e30, e31, e32, e33) - '''利用參數產生矩陣,其索引值順序如上述,或由此處的宣告亦可得知''' | ||
+ | * matricesEqual(matrix1, matrix2) - '''判斷兩矩陣是否相等''' | ||
+ | * makePoseMatrix(vecLeft, vecUp, vecFrwd, vecPos) - '''位置矩陣,通常用來處理「手勢」,效果如下''': | ||
+ | +- -+ | ||
+ | | Left.x, Up.x, Fwd.x, Pos.x | | ||
+ | | Left.y, Up.y, Fwd.y, Pos.y | | ||
+ | | Left.z, Up.z, Fwd.z, Pos.z | | ||
+ | | 0.0, 0.0, 0.0, 1.0 | | ||
+ | +- -+ | ||
+ | * transposeMatrix(mat) - '''傳回轉置矩陣''': 型如 | ||
+ | +- -+ | ||
+ | | A, B, C, D | | ||
+ | | E, F, G, H | | ||
+ | | I, J, K, L | | ||
+ | | M, N, O, P | | ||
+ | +- -+ | ||
+ | 轉置結果為: | ||
+ | +- -+ | ||
+ | | A, E, I, M | | ||
+ | | B, F, J, N | | ||
+ | | C, G, K, O | | ||
+ | | D, H, L, P | | ||
+ | +- -+ | ||
+ | * inverseMatrix(mat) - '''計算並傳回 mat 的反矩陣,使得 res * mat = I, 其中 I 是單位矩陣,參考 [http://mathworld.wolfram.com/MatrixInverse.html 反矩陣]''' | ||
+ | * matrixDeterminant(mat) - '''計算並傳回 mat 的行列式,通常用來算面積或體積,其值為純量,參考 [http://en.wikipedia.org/wiki/Determinant 行列式]''' | ||
+ | * matrixAdjoint(mat) - '''不知道怎麼翻,伴隨矩陣?共軛矩陣?參考 http://www.ee.ic.ac.uk/hp/staff/dmb/matrix/property.html#adjoint adjoint matrix''' | ||
+ | * multiplyMatrixByScalar(mat, scalar) - '''每個元素都乘以 scalar''' | ||
+ | * divideMatrixByScalar(mat, scalar) - '''每個元素都除以 scalar''' | ||
+ | * multiplyMatrixByMatrix(matOne, matTwo) - '''矩陣乘法,結果亦為矩陣''' | ||
+ | * multiplyMatrixByVector(mat, vec) - '''將矩陣乘以向量,通常用來作向量的旋轉之類用途,結果亦為向量(其實是 4x4 矩陣與 4x1 矩陣相乘)''' | ||
+ | * addMatrices(matOne, matTwo) - '''兩矩陣相對應元素相加''' | ||
+ | * subtractMatrices(matOne, matTwo) - '''兩矩陣相對應元素相減''' |
於 2008年10月8日 (三) 14:16 的修訂
簡介
Canvas 3D JS Library (C3DL) 是 javascript 函式庫,也就是裡頭提供的全部是 Javascript, 必須安裝 Canvas3D extension of firefox, c3dl 程式碼在此。主要目的是讓你在 Firefox/Mozilla 平台用 Canvas/OpenGL 的方式撰寫 3D 的網路應用。
C3DL 提供一系列的數學、景觀、及3D物件類別,讓你在用 Canvas 會更有彈性,當然主要就是要縮短開發時間。
本專案開發人員
- Catherine Leung
- Mark Paruzel (CodeBot)
- Andrew Smith
- Chris Bishop (Javascript)
- Andor Salga
有用的連結
- 我們的網站
- 我們的 blog
- Our SVN Repo: svn://cdot.senecac.on.ca/canvas3d
- 在 Vlad's hg repo 中的 canvas3d 源碼
- OpenGL 文件
- Nehe 的 OpenGL 教學
- .off (object file format) format info
類別繼承圖
數學運算
Vector 向量類別
一個向量基本上就是在 3D 世界的 X, Y, Z 三個軸的座標系統描述一個「具備大小的方向」。3D 數學存在各種不同的座標系統,離開向量類別的封裝則不復存在所謂的 3D。向量類別具有下列的成員;
- isValidVector(vecArr) - 判斷參數是否為一有效的向量
- copyVector(srcVec) - 從 srcVec 複製並傳回
- copyVectorContents(srcVec, destVec) - 效果相當於(不等於,因為有多作判斷是否為有效向量) destVec = copyVector(srcVec);
- makeVector(newX, newY, newZ) - copyVector() 就是用這個函數實作向量複製
- normalizeVector(vec) - 計算與向量相同方向但長度為一的「單位向量」並傳回
- vectorDotProduct(vecOne, vecTwo) - 傳回兩向量的內積(點積),其值為純量
- vectorCrossProduct(vecOne, vecTwo, dest) - 將 vecOne 與 vecTwo 兩個向量做外積(叉積)後指定給 dest)
- vectorLength(vec) - 計算並傳回向量的長度(相當於與自己的內積開根號)
- vectorLengthSq(vec) - 計算向量長度的平方,相比於直接利用長度的運算上,少了一個根號後再平方的無用計算
- addVectors(vecOne, vecTwo, dest) - 相當於 dest = vecOne + vecTwo
- subtractVectors(vecOne, vecTwo, dest) - 相當於 dest = vecOne - vecTwo
- multiplyVector(vec, scalar, dest) - 相當於 dest = vec * scalar; 效果相當於將向量放大(scalar 小於1的正數則為縮小,負數則為反向)
- divideVector(vec, scalar, dest) - 相當於 dest = vec / scalar; 效果相當於將向量縮小(scalar 小於1的正數則為放大,負數則為反向)
- multiplyVectorByVector(vecOne, vecTwo, dest) - 既非內積也非外積,而是相當於 dest = [X1*X2, Y1*Y2, Z1*Z2]; 的乘法
- isVectorEqual(vecOne, vecTwo) - 判斷兩向量是否相等
- isVectorZero(vec) - 判斷向量長度是否為 0,正確的說法: 判斷是否極接近 0,每個軸向誤差在 0.00001 以內
- getAngleBetweenVectors(vecOne, vecTwo) - 計算兩向量間的夾角
Matrix 矩陣類別
c3dl 的矩陣在數學上是一個 4x4 的二維矩陣,但是在 Javascript 實作上是用一維陣列來表達,而不是二維陣列,其索引值如下:
+- -+ | 0, 4, 8, 12 | | 1, 5, 9, 13 | | 2, 6, 10, 14 | | 3, 7, 11, 15 |
- isValidMatrix(mat) - 判斷是否為有效的矩陣
- makeIdentityMatrix() - 產生單位矩陣,也就是斜對角都為 1 其餘為 0 的矩陣
- makeZeroMatrix() - 產生全部是0 的矩陣
- makeMatrix(e00, e01, e02, e03, e10, e11, e12, e13, e20, e21, e22, e23, e30, e31, e32, e33) - 利用參數產生矩陣,其索引值順序如上述,或由此處的宣告亦可得知
- matricesEqual(matrix1, matrix2) - 判斷兩矩陣是否相等
- makePoseMatrix(vecLeft, vecUp, vecFrwd, vecPos) - 位置矩陣,通常用來處理「手勢」,效果如下:
+- -+ | Left.x, Up.x, Fwd.x, Pos.x | | Left.y, Up.y, Fwd.y, Pos.y | | Left.z, Up.z, Fwd.z, Pos.z | | 0.0, 0.0, 0.0, 1.0 | +- -+
- transposeMatrix(mat) - 傳回轉置矩陣: 型如
+- -+ | A, B, C, D | | E, F, G, H | | I, J, K, L | | M, N, O, P | +- -+ 轉置結果為: +- -+ | A, E, I, M | | B, F, J, N | | C, G, K, O | | D, H, L, P | +- -+
- inverseMatrix(mat) - 計算並傳回 mat 的反矩陣,使得 res * mat = I, 其中 I 是單位矩陣,參考 反矩陣
- matrixDeterminant(mat) - 計算並傳回 mat 的行列式,通常用來算面積或體積,其值為純量,參考 行列式
- matrixAdjoint(mat) - 不知道怎麼翻,伴隨矩陣?共軛矩陣?參考 http://www.ee.ic.ac.uk/hp/staff/dmb/matrix/property.html#adjoint adjoint matrix
- multiplyMatrixByScalar(mat, scalar) - 每個元素都乘以 scalar
- divideMatrixByScalar(mat, scalar) - 每個元素都除以 scalar
- multiplyMatrixByMatrix(matOne, matTwo) - 矩陣乘法,結果亦為矩陣
- multiplyMatrixByVector(mat, vec) - 將矩陣乘以向量,通常用來作向量的旋轉之類用途,結果亦為向量(其實是 4x4 矩陣與 4x1 矩陣相乘)
- addMatrices(matOne, matTwo) - 兩矩陣相對應元素相加
- subtractMatrices(matOne, matTwo) - 兩矩陣相對應元素相減