91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Three.js中使用矩陣和向量

發布時間:2021-05-17 18:04:58 來源:億速云 閱讀:628 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關怎么在Three.js中使用矩陣和向量,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

首先,我們要創建三個幾何體:

var box_geometry = new THREE.BoxGeometry();
var sphere_geometry = new THREE.SphereGeometry(0.5, 32, 32);
var cylinder_geometry = new THREE.CylinderGeometry(0.1, 0.1, 0.5);

var material = new THREE.MeshLambertMaterial({color: new THREE.Color(0.9, 0.55, 0.4)})

這三個幾何體分別是盒子、球和圓柱體。

然后去創建三個網格,并將它們置入場景。

var box = new THREE.Mesh(box_geometry, material);
var sphere = new THREE.Mesh(sphere_geometry, material);
sphere.position.y += 1;
var cylinder = new THREE.Mesh(cylinder_geometry, material);
cylinder.position.y += 1.75;
scene.add(box);
scene.add(sphere);
scene.add(cylinder);

這段代碼將生成如下場景:

怎么在Three.js中使用矩陣和向量

雖然不那么美觀,但作為示例已經足夠了,現在我希望這堆物體尺寸減半。通常我會把物體的scale屬性減半,像這樣:

box.scale.multiplyScalar(0.5); 
sphere.scale.multiplyScalar(0.5);
cylinder.scale.multiplyScalar(0.5);

怎么在Three.js中使用矩陣和向量

和想象中的有些偏差。我的本意是讓這一組物體進行一個整體的縮放,并不想讓它們彼此偏離,為了修正這件事,我需要根據其他對象的縮放重新計算每個對象的位置。但這并不是一件很難解決的問題,three.js提供了一種優雅的方式,來處理這個問題。我們可以定義一個空對象,然后將三個對象放在其中,然后將比例應用于父對象。

var pile = new THREE.Object3D();
pile.scale.multiplyScalar(0.5);
pile.add(box);
pile.add(sphere);
pile.add(cylinder);
scene.add(pile);

怎么在Three.js中使用矩陣和向量

接下來我們做一點更有趣的事。

我將在這個物體組合里添加旋轉,讓我們嘗試圍繞球體表面旋轉的那個圓柱體,就像他將要滑落一樣。

怎么在Three.js中使用矩陣和向量

它變成了這樣,很明顯,這不是我想要的東西。我們在這里有兩個做法可供選擇:第一,通過數學計算算出圓柱相對于球體的正確位置;第二,創建另一個Object3D,將圓柱和球放進去并旋轉。這聽上去挺復雜的,而且也很不酷。

所以,我們可以嘗試自己去計算矩陣。

首先,我需要將屬性maxtrixAutoUpdate設置為false,然后我就不能再通過position,scale和rotation去修改矩陣。

box.matrixAutoUpdate = false;
sphere.matrixAutoUpdate = false;
cylinder.matrixAutoUpdate = false;

現在,我將用applyMatrix方法來解決這個問題。具體做法是:為每個對象創建一個Matrix4,然后我們將矩陣與該矩陣相乘以應用后續操作。

var sphere_matrix = new THREE.Matrix4().makeTranslation(0.0, 1.0, 0.0); 
sphere.applyMatrix(sphere_matrix);
var cylinder_matrix = sphere_matrix.clone(); cylinder_matrix.multiply(new THREE.Matrix4().makeTranslation(0.0, 0.75, 0.0)); 
cylinder.applyMatrix(cylinder_matrix);

這幾步下來,可以讓我們解鎖很多知識,來看看這里發生了什么。

首先,我們把盒子單獨留下,因為它不需要動。

接著,我創建了一個平移矩陣并把它應用到了球對象上。

最后,在圓柱體上,我clone了球的矩陣信息,并在此基礎上又創建了一個新的平移矩陣,圓柱體將移動1.75。

怎么在Three.js中使用矩陣和向量

理解了上面幾步,你就會知道最后一步該做什么了。

只需要一行代碼,作用在球上:

sphere_matrix.multiply(new THREE.Matrix4().makeRotationZ(-Math.PI * 0.25));

怎么在Three.js中使用矩陣和向量

達成了想要的效果,很酷。

示例中用到的方法

在上面的示例中,我將球和圓柱體分別沿y軸移動了一定的距離,并使用了makeTranslation這個方法。這個方法的作用是創建了一個平移矩陣。緊接著,我又使用到了applyMatrix的方法。這個方法的作用是把平移矩陣作用在球和圓柱體上。

那么什么是平移矩陣?它又是如何完成一次平移呢?

Three.js中最常見的一種4x4的矩陣,被稱為變換矩陣,它所表示的變換類型包括平移、旋轉和縮放。

用一個簡單的數學題來說明變換矩陣:

怎么在Three.js中使用矩陣和向量

有一個起始點,用向量來表示即為Vector3(20,20,0);現在,我要把它移動到另一個位置,Vector3(30,60,0)。

接下來,我設置一個平移矩陣,來表示向量依照什么方式去移動。

t = |1 0 0 10|
 |0 1 0 40|
 |0 0 1 0 |
 |0 0 0 1 |

最后,用起始的向量去乘以變換矩陣的向量。

|20| |1 0 0 10| |30|
|20| x |0 1 0 40| = |60|
|0 | |0 0 1 0 | |0 |
|1 | |0 0 0 1 | |1 |

變換公式如下:

transformedVector = vector * transformationMatrix

最終的變換向量 = 原始向量 * 變換矩陣

用我們上面例子中的方法來還原這個公式,即:

var vector = new THREE.Vector3(20, 20, 0);
var matrix = new THREE.Matrix4();
matrix.makeTranslation(10, 40, 0);
vector.applyMatrix4(matrix);

除了平移,Three的API中還提供了rotation和scale,scale變化很簡單,它將使用makeScale(x, y, z)這個方法來表示縮放。

而旋轉則相對復雜許多,Three.js提供以下旋轉方法:

matrix.makeRotationX(angle);
matrix.makeRotationY(angle);
matrix.makeRotationZ(angle);
matrix.makeRotationAxis(axis, angle);
matrix.makeRotationFromEuler(euler);
matrix.makeRotationFromQuaternion(quaternion);

前三個方法分別代表的是繞X、Y、Z三個軸旋轉,無需贅述。

第四個方法是前三個方法的整合版,第一個參數表示的是代表xyz的THREE.Vector3,第二個參數是旋轉的弧度。下面兩行代碼是等價的:

matrix.makeRotationX(Math.PI);
matrix.makeRotationAxis(new THREE.Vector3(1, 0, 0), Math.PI);

第五個方法表示圍繞x、y和z軸的旋轉,這是表示旋轉最常用的方式;第六個方法是一種基于軸和角度表示旋轉的替代方法。

最后,Three.js api提供了一種方法來創建表示平移,旋轉和縮放的組合的矩陣 -- matrix.compose:

var translation = new THREE.Vector3();
var rotation = new THREE.Quaternion();
var scale = new THREE.Vector3();
var matrix = new THREE.Matrix4();
matrix.compose(translation, rotation, scale);

矩陣相乘

矩陣乘法的意義在于疊加。

怎么在Three.js中使用矩陣和向量

上圖表示了三個變化:旋轉、縮放和移動。

通過按次序相乘,三個變化矩陣可以得出一個最終的變化矩陣:

combinedMatrix = rotationMatrix * scaleMatrix * translationMatrix;

Three.js里提供了兩種矩陣相乘的方法:

  • matrix.multiply(otherMatrix)

  • matrix.multiplyMatrices(matrixA, matrixB)

第一種方法表示將矩陣乘以另一個矩陣;而第二種方法代表的是將矩陣設置為matrixA * matrixB的結果。

我們在示例中也使用到了第一個方法:將圓柱體的矩陣乘以新的平移矩陣,和將球的矩陣乘以一個旋轉矩陣。

需要注意的是,乘法交換律不適用于矩陣乘法,矩陣乘法是具有次序的,先旋轉再移動和先移動再旋轉的結果是完全不同的。

矩陣的逆

在數字的運算里,除法相當于是乘法的“撤銷”操作:

4 x 5 = 20
20 / 5 = 4

但是在矩陣計算里,這個守則同樣是不適用的。我們不能用向量去除一個矩陣,我們只能用向量去乘以一個矩陣的逆矩陣,來完成“撤銷”的操作。

變化后的向量 = 原始向量 * 變化矩陣;
逆矩陣 = 變化矩陣.inverse();
原始向量 = 變化后的向量 * 逆矩陣;

逆矩陣表示的是相反的變換。

Three.js里提供了一種計算逆矩陣的方法:

var matrix = new THREE.Matrix4();
var inverseMatrix = new THREE.Matrix4();
matrix.getInverse(inverseMatrix);

關于怎么在Three.js中使用矩陣和向量就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁国市| 合江县| 台东县| 上犹县| 东兴市| 曲松县| 泸西县| 沁阳市| 辽中县| 福海县| 红安县| 壶关县| 安阳市| 卓尼县| 新安县| 大姚县| 泾川县| 寿宁县| 岑溪市| 丽江市| 杭州市| 大余县| 铜梁县| 玉树县| 渭南市| 重庆市| 水富县| 洪雅县| 余干县| 太仓市| 星子县| 桦川县| 翁牛特旗| 张家川| 阜宁县| 明星| 上饶县| 收藏| 江安县| 襄垣县| 卢氏县|