WebGL高級(jí)變換之Matrix4使用介紹
引言
上一篇結(jié)尾的說到了按列矩陣,但是如果是按照最原始的方式變換的話,開發(fā)的成本其實(shí)是很高的,所以,只需要了解原理即可,在實(shí)際開發(fā)中,我們會(huì)用到封裝后的庫(kù)gl-matrix。
gl-matrix簡(jiǎn)介
gl-matrix是一個(gè)JavaScript庫(kù),用于處理線性代數(shù)中的向量和矩陣計(jì)算。它提供了許多常用的矩陣和向量計(jì)算函數(shù),如矩陣相乘、矩陣求逆、矩陣轉(zhuǎn)置、矩陣變換、向量點(diǎn)乘、向量叉乘、向量長(zhǎng)度等等。
示例--旋轉(zhuǎn)矩陣變換
步驟:創(chuàng)建變換矩陣,并將變換矩陣傳給頂點(diǎn)著色器
WebGL按列矩陣
const VSHADER_SOURCE = ` attribute vec4 a_position; uniform mat4 u_xformMatrix; void main(void){ gl_Position=u_xformMatrix * a_position; } `
頂點(diǎn)著色器中定義了一個(gè)mat4
類型的變量u_xformMatrix
,然后新的頂點(diǎn)坐標(biāo)是矩陣和變換前坐標(biāo)的乘積
mat4
和vec4
類型的區(qū)別?
- mat4是一個(gè)4x4的矩陣,用于進(jìn)行3D變換的計(jì)算,例如旋轉(zhuǎn)、縮放和平移.
- vec4是一個(gè)4維向量,用于表示空間中的點(diǎn)或方向
let angle = 60 const radian = Math.PI * angle / 180 const cosB = Math.cos(radian) const sinB = Math.sin(radian) const xformMatrix = new Float32Array([ cosB, sinB, 0.0, 0.0, -sinB, cosB, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, ]) const u_xformMatrix = webgl.getUniformLocation(webgl.program, 'u_xformMatrix') webgl.uniformMatrix4fv(u_xformMatrix, false, xformMatrix)
由于按列矩陣的特性,可以把xformMatrix
當(dāng)作成4*4的矩陣,然后通過方法uniformMatrix4fv
進(jìn)行數(shù)據(jù)的地址賦值即可變換。
gl-matrix 旋轉(zhuǎn)矩陣
const render = () => { const matrixUniformLocation = webgl.getUniformLocation(webgl.program, "matrix") // 計(jì)算旋轉(zhuǎn)矩陣 const angle = performance.now() / 2000 * Math.PI const rotationMatrix = mat3.fromRotation(mat3.create(), angle) // 將矩陣傳遞給著色器程序 webgl.useProgram(webgl.program) webgl.uniformMatrix3fv(matrixUniformLocation, false, rotationMatrix) // 繪制三角形 webgl.clear(webgl.COLOR_BUFFER_BIT) webgl.drawArrays(webgl.TRIANGLES, 0, 3) // 循環(huán)調(diào)用渲染函數(shù)以實(shí)現(xiàn)動(dòng)態(tài)旋轉(zhuǎn) requestAnimationFrame(render) }
mat3.create()
創(chuàng)建了一個(gè)3*3的矩陣,mat3.fromRotation
方法來計(jì)算旋轉(zhuǎn)矩陣。該方法接受一個(gè)3x3的矩陣作為第一個(gè)參數(shù),以及一個(gè)角度作為第二個(gè)參數(shù),返回一個(gè)旋轉(zhuǎn)矩陣。
復(fù)合變換
這兒的復(fù)合變換直接上gl-matrix
庫(kù)下處理矩陣的代碼
效果
const vertexShaderSource = ` attribute vec3 aPosition; attribute vec3 aColor; varying vec3 vColor; uniform mat4 uModelMatrix; void main() { gl_Position = uModelMatrix * vec4(aPosition, 1.0); vColor = aColor; } `
頂點(diǎn)著色器中設(shè)置頂點(diǎn)gl_Position
,變換矩陣和原來頂點(diǎn)坐標(biāo)的乘積
const render = () => { webgl.clear(webgl.COLOR_BUFFER_BIT) const rotation = Date.now() * rotationSpeed / 10 // 設(shè)置放縮變換矩陣 let scaleMatrix = mat4.create() mat4.scale(scaleMatrix, scaleMatrix, [scale, scale, scale]) // 設(shè)置旋轉(zhuǎn)變換矩陣 let rotationMatrix = mat4.create() mat4.rotateZ(rotationMatrix, rotationMatrix, rotation) // 將旋轉(zhuǎn)和放縮變換矩陣相乘 let transformMatrix = mat4.create() mat4.multiply(transformMatrix, rotationMatrix, scaleMatrix) // 將變換矩陣傳遞給uniform變量 webgl.uniformMatrix4fv(matrixUniformLocation, false, transformMatrix) // 繪制正方形 webgl.clearColor(0.0, 1.0, 1.0, 1.0) webgl.drawArrays(webgl.TRIANGLE_STRIP, 0, 4) // 更新放縮因子 updateScale() // 循環(huán)調(diào)用渲染函數(shù)以實(shí)現(xiàn)動(dòng)態(tài)旋轉(zhuǎn) requestAnimationFrame(render) }
- 先用
mat4.create()
創(chuàng)建矩陣,然后設(shè)置矩陣數(shù)據(jù); scale
設(shè)置縮放數(shù)據(jù),rotateZ
設(shè)置物體繞z
軸旋轉(zhuǎn)mat4.multiply()
將旋轉(zhuǎn)和放縮變換矩陣相乘uniformMatrix4fv
將變換矩陣傳遞給uniform變量- 繪制圖形
放縮因子
const matrixUniformLocation = webgl.getUniformLocation(webgl.program, "uModelMatrix") const rotationSpeed = 0.005 let scale = 1.0 let delta = 0.005 let direction = 1 const updateScale = () => { scale += delta * direction; if (scale >= 1.2 || scale <= 0.5) { direction = -direction; } }
對(duì)于這些基礎(chǔ)矩陣到復(fù)雜變換再到復(fù)合變換,那么我們可以熟悉的做到圖形的變換了,并且用動(dòng)畫的方式展示出來,之后進(jìn)入圖形的表面了,就是顏色和紋理了
以上就是WebGL高級(jí)變換之Matrix4使用介紹的詳細(xì)內(nèi)容,更多關(guān)于WebGL高級(jí)變換Matrix4的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
webpack學(xué)習(xí)--webpack經(jīng)典7分鐘入門教程
這篇文章主要介紹了webpack學(xué)習(xí)--webpack經(jīng)典7分鐘入門教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06JavaScript極簡(jiǎn)入門教程(三):數(shù)組
這篇文章主要介紹了JavaScript極簡(jiǎn)入門教程(二):數(shù)組,本文主要講解了數(shù)組的創(chuàng)建和length屬性的介紹,其它方法屬性都沒有介紹,需要的朋友可以參考下2014-10-10最好用的Bootstrap fileinput.js文件上傳組件
這篇文章主要為大家詳細(xì)介紹了最好用的Bootstrap fileinput.js文件上傳組件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12JS動(dòng)態(tài)圖片的實(shí)現(xiàn)方法完整示例
這篇文章主要介紹了JS動(dòng)態(tài)圖片的實(shí)現(xiàn)方法,結(jié)合完整實(shí)例形式分析了JavaScript鼠標(biāo)響應(yīng)與頁(yè)面元素屬性動(dòng)態(tài)變換相關(guān)操作技巧,需要的朋友可以參考下2020-01-01TypeScript?Typeof運(yùn)算符的5個(gè)實(shí)用技巧詳解
這篇文章主要為大家介紹了TypeScript?Typeof運(yùn)算符的5個(gè)實(shí)用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10