1. 程式人生 > >webgl第12課-圖形的變換之平移

webgl第12課-圖形的變換之平移

需要原始碼可以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;
}

執行結果:::