webgl第12課-圖形的變換之平移
阿新 • • 發佈:2018-12-28
需要原始碼可以Q群:828202939 或者點選這裡 希望可以和大家一起學習、一起進步!!純手打!!
書籍是PDF電子檔,也在Q群裡,所有的課程原始碼在我上傳的資源裡面,本來想設定開源,好像不行!
如有錯別字或有理解不到位的地方,可以留言或者加微信15250969798,在下會及時修改!!!!!
前面我們學習了一些點、三角形、矩形等一些基礎的圖形的繪製的方法
本節課開始我們開始學習對圖形的操作,比如平移、縮放、旋轉等
先來說說平移
初中數學應該是有學習座標軸,我們移動一個點就是在這個點的座標的基礎上加減一個移動的量
比如說我把原點(0,0)的座標移動到(2,3),那麼這個點移動的量就是x軸移動的量=(x1-x0)=2,
y軸移動的量=(y1-y0)=3;
在webgl中,一個圖形是有多個三角形組成,一個三角形由3個頂點組成,每個頂點都有X,Y座標(這裡先講2維的圖形),
如果移動一個三角形,我們只要移動這個三角形的頂點即可
回頭給你們上圖
上程式碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>影象變換-三角形平移</title> <body onload="main()"> <canvas id="webgl" width="400" height="400"> Please use a browser that supports "canvas" </canvas> </body> <script src="../lib/webgl-utils.js"></script> <script src="../lib/webgl-debug.js"></script> <script src="../lib/cuon-utils.js"></script> <script src="TranslatedTriangle.js"></script> </head> </html>
//頂點著色器 var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + 'uniform vec4 u_Translation;\n' + 'void main() {\n' + ' gl_Position = a_Position + u_Translation;\n' + '}\n'; // 片元著色器 var FSHADER_SOURCE = 'void main() {\n' + ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' + '}\n'; //在x,y,z方向上平移的距離(x值前面負號表示往左,反之往右,Y軸的值負號往下,反之往上) var Tx = 0.5, Ty = -0.2, Tz = 0.0; function main() { // 獲取canvas元素 var canvas = document.getElementById('webgl'); // 獲取canvas上下文 var gl = getWebGLContext(canvas); if (!gl) { console.log('Failed to get the rendering context for WebGL'); return; } //初始化著色器 if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) { console.log('Failed to intialize shaders.'); return; } // 設定頂點位置 var n = initVertexBuffers(gl); if (n < 0) { console.log('Failed to set the positions of the vertices'); return; } // 將平移的距離傳輸給頂點著色器 var u_Translation = gl.getUniformLocation(gl.program, 'u_Translation'); if (!u_Translation) { console.log('Failed to get the storage location of u_Translation'); return; } gl.uniform4f(u_Translation, Tx, Ty, Tz, 0.0); // 設定背景色 gl.clearColor(0, 0, 0, 1); // 清空 <canvas> gl.clear(gl.COLOR_BUFFER_BIT); // 繪製三角形 gl.drawArrays(gl.TRIANGLES, 0, n); } //這裡設定的是點的位置,本例設定為三角形 function initVertexBuffers(gl) { var vertices = new Float32Array([ 0, 0.5, -0.5, -0.5, 0.5, -0.5 ]); var n = 3; // 頂點數 // 建立緩衝區物件 var vertexBuffer = gl.createBuffer(); if (!vertexBuffer) { console.log('Failed to create the buffer object'); return -1; } // 繫結緩衝區物件 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); // 將資料寫入緩衝區物件以供著色器使用 gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); // 獲取attribute的位置 var a_Position = gl.getAttribLocation(gl.program, 'a_Position'); if (a_Position < 0) { console.log('Failed to get the storage location of a_Position'); return -1; } // 將緩衝區物件分配給attribute變數,這裡只有平面的頂點xy,所謂分量為2,第三四分量會預設為0.0,1.0 gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0); // 開啟attribute變數 gl.enableVertexAttribArray(a_Position); return n; }
執行結果:::