欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

WebGL高級變換之Matrix4使用介紹

 更新時間:2023年04月19日 14:28:59   作者:H_World  
這篇文章主要為大家介紹了WebGL高級變換之Matrix4使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

上一篇結(jié)尾的說到了按列矩陣,但是如果是按照最原始的方式變換的話,開發(fā)的成本其實是很高的,所以,只需要了解原理即可,在實際開發(fā)中,我們會用到封裝后的庫gl-matrix。

gl-matrix簡介

gl-matrix是一個JavaScript庫,用于處理線性代數(shù)中的向量和矩陣計算。它提供了許多常用的矩陣和向量計算函數(shù),如矩陣相乘、矩陣求逆、矩陣轉(zhuǎn)置、矩陣變換、向量點乘、向量叉乘、向量長度等等。

示例--旋轉(zhuǎn)矩陣變換

步驟:創(chuàng)建變換矩陣,并將變換矩陣傳給頂點著色器

WebGL按列矩陣

const VSHADER_SOURCE = `
  attribute vec4 a_position;
  uniform mat4 u_xformMatrix;
  void main(void){
    gl_Position=u_xformMatrix *  a_position;
  }
`

頂點著色器中定義了一個mat4類型的變量u_xformMatrix,然后新的頂點坐標(biāo)是矩陣和變換前坐標(biāo)的乘積

mat4vec4類型的區(qū)別?

  • mat4是一個4x4的矩陣,用于進(jìn)行3D變換的計算,例如旋轉(zhuǎn)、縮放和平移.
  • vec4是一個4維向量,用于表示空間中的點或方向
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")
  // 計算旋轉(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ù)以實現(xiàn)動態(tài)旋轉(zhuǎn)
  requestAnimationFrame(render)
}

mat3.create()創(chuàng)建了一個3*3的矩陣,mat3.fromRotation方法來計算旋轉(zhuǎn)矩陣。該方法接受一個3x3的矩陣作為第一個參數(shù),以及一個角度作為第二個參數(shù),返回一個旋轉(zhuǎn)矩陣。

復(fù)合變換

這兒的復(fù)合變換直接上gl-matrix庫下處理矩陣的代碼

效果

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;
  }
`

頂點著色器中設(shè)置頂點gl_Position,變換矩陣和原來頂點坐標(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ù)以實現(xiàn)動態(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;
  }
}

對于這些基礎(chǔ)矩陣到復(fù)雜變換再到復(fù)合變換,那么我們可以熟悉的做到圖形的變換了,并且用動畫的方式展示出來,之后進(jìn)入圖形的表面了,就是顏色和紋理了

以上就是WebGL高級變換之Matrix4使用介紹的詳細(xì)內(nèi)容,更多關(guān)于WebGL高級變換Matrix4的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • webpack學(xué)習(xí)--webpack經(jīng)典7分鐘入門教程

    webpack學(xué)習(xí)--webpack經(jīng)典7分鐘入門教程

    這篇文章主要介紹了webpack學(xué)習(xí)--webpack經(jīng)典7分鐘入門教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • JavaScript極簡入門教程(三):數(shù)組

    JavaScript極簡入門教程(三):數(shù)組

    這篇文章主要介紹了JavaScript極簡入門教程(二):數(shù)組,本文主要講解了數(shù)組的創(chuàng)建和length屬性的介紹,其它方法屬性都沒有介紹,需要的朋友可以參考下
    2014-10-10
  • 最好用的Bootstrap fileinput.js文件上傳組件

    最好用的Bootstrap fileinput.js文件上傳組件

    這篇文章主要為大家詳細(xì)介紹了最好用的Bootstrap fileinput.js文件上傳組件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 詳解在JavaScript中如何判斷變量類型

    詳解在JavaScript中如何判斷變量類型

    JavaScript是一個動態(tài)類型語言,在運(yùn)行時獲取變量類型是常用操作。本文將通過示例為大家詳細(xì)講講在JavaScript中如何判斷變量類型,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • JS如何監(jiān)聽div的resize事件詳解

    JS如何監(jiān)聽div的resize事件詳解

    這篇文章主要給大家介紹了關(guān)于JS如何監(jiān)聽div的resize事件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JS動態(tài)圖片的實現(xiàn)方法完整示例

    JS動態(tài)圖片的實現(xiàn)方法完整示例

    這篇文章主要介紹了JS動態(tài)圖片的實現(xiàn)方法,結(jié)合完整實例形式分析了JavaScript鼠標(biāo)響應(yīng)與頁面元素屬性動態(tài)變換相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • 原生JS仿QQ閱讀點擊展開、收起效果

    原生JS仿QQ閱讀點擊展開、收起效果

    這篇文章主要為大家詳細(xì)介紹了原生JS仿QQ閱讀點擊展開、收起效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • js中[]、{}、()區(qū)別示例淺析

    js中[]、{}、()區(qū)別示例淺析

    很多人都知道在js中[]表示的是數(shù)組對象,{}表示的是對象,但是這兩者的區(qū)別卻說不出來,下面這篇文章主要給大家介紹了關(guān)于js中[]、{}、()區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 基于js對象,操作屬性、方法詳解

    基于js對象,操作屬性、方法詳解

    下面小編就為大家?guī)硪黄趈s對象,操作屬性、方法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • TypeScript?Typeof運(yùn)算符的5個實用技巧詳解

    TypeScript?Typeof運(yùn)算符的5個實用技巧詳解

    這篇文章主要為大家介紹了TypeScript?Typeof運(yùn)算符的5個實用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評論