WebGL基礎(chǔ)(三)

這一節(jié)主要講一下WebGL的基本變換庸毫,平移和旋轉(zhuǎn),主要運(yùn)用了cuon-matrix.js庫(kù)函數(shù)衫樊,其具體方法有以下:

函數(shù)

下面講解一個(gè)簡(jiǎn)單的例子,這個(gè)例子實(shí)現(xiàn)一個(gè)三角形先進(jìn)行一次平移利花,在進(jìn)行一次旋轉(zhuǎn)科侈,先看代碼:

// TranslatedRotatedTriangle.js (c) 2012 matsuda
// Vertex shader program
var VSHADER_SOURCE =
  'attribute vec4 a_Position;\n' +
  'uniform mat4 u_ModelMatrix;\n' +
  'void main() {\n' +
  '  gl_Position = u_ModelMatrix * a_Position;\n' +
  '}\n';

// Fragment shader program
var FSHADER_SOURCE =
  'void main() {\n' +
  '  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' +
  '}\n';

function main() {
  // Retrieve <canvas> element
  var canvas = document.getElementById('webgl');

  // Get the rendering context for WebGL
  var gl = getWebGLContext(canvas);
  if (!gl) {
    console.log('Failed to get the rendering context for WebGL');
    return;
  }

  // Initialize shaders
  if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
    console.log('Failed to intialize shaders.');
    return;
  }

  // Write the positions of vertices to a vertex shader
  var n = initVertexBuffers(gl);
  if (n < 0) {
    console.log('Failed to set the positions of the vertices');
    return;
  }

  // Create Matrix4 object for model transformation
  var modelMatrix = new Matrix4();

  // Calculate a model matrix
  var ANGLE = 60.0; // 旋轉(zhuǎn)角
  var Tx = 0.5;     // 平移距離
  modelMatrix.setTranslate(Tx, 0, 0);  // 平移
  modelMatrix.rotate(ANGLE, 0, 0, 1);  // 旋轉(zhuǎn)

  //將模型矩陣傳輸給頂點(diǎn)著色器
  var u_ModelMatrix = gl.getUniformLocation(gl.program, 'u_ModelMatrix');
  if (!u_ModelMatrix) {
    console.log('Failed to get the storage location of u_xformMatrix');
    return;
  }
  gl.uniformMatrix4fv(u_ModelMatrix, false, modelMatrix.elements);

  // Specify the color for clearing <canvas>
  gl.clearColor(0, 0, 0, 1);

  // Clear <canvas>
  gl.clear(gl.COLOR_BUFFER_BIT);

  // Draw the rectangle
  gl.drawArrays(gl.TRIANGLES, 0, n);
}

function initVertexBuffers(gl) {
  var vertices = new Float32Array([
    0, 0.3,   -0.3, -0.3,   0.3, -0.3
  ]);
  var n = 3; // The number of vertices

  // Create a buffer object
  var vertexBuffer = gl.createBuffer();
  if (!vertexBuffer) {
    console.log('Failed to create the buffer object');
    return false;
  }

  // Bind the buffer object to target
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
  // Write date into the buffer object
  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

  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;
  }
  // Assign the buffer object to a_Position variable
  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);

  // Enable the assignment to a_Position variable
  gl.enableVertexAttribArray(a_Position);

  return n;
}

程序中先使用modelMatrix.setTranslate(Tx, 0, 0)將modelMatrix設(shè)置成平移矩陣,然后使用modelMatrix.rotate(ANGLE, 0, 0, 1)繞Z軸旋轉(zhuǎn)ANGLE角度炒事,計(jì)算出來的矩陣放入到modelMatrix中存崖,然后使用gl.uniformMatrix4fv(u_ModelMatrix, false, modelMatrix.elements)傳遞給模型著色器中的變量夯尽,最后顯示出來效果如下:

平移旋轉(zhuǎn)圖像
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堡妒,更是在濱河造成了極大的恐慌,老刑警劉巖谬哀,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦屏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡卖怜,警方通過查閱死者的電腦和手機(jī)屎开,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來马靠,“玉大人奄抽,你說我怎么就攤上這事蔼两。” “怎么了逞度?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵额划,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我档泽,道長(zhǎng)俊戳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任茁瘦,我火速辦了婚禮品抽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甜熔。我一直安慰自己圆恤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布腔稀。 她就那樣靜靜地躺著盆昙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焊虏。 梳的紋絲不亂的頭發(fā)上淡喜,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音诵闭,去河邊找鬼炼团。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疏尿,可吹牛的內(nèi)容都是我干的瘟芝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼褥琐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锌俱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敌呈,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贸宏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后磕洪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吭练,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年褐鸥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了线脚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浑侥,靈堂內(nèi)的尸體忽然破棺而出姊舵,到底是詐尸還是另有隱情,我是刑警寧澤寓落,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布括丁,位于F島的核電站,受9級(jí)特大地震影響伶选,放射性物質(zhì)發(fā)生泄漏史飞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一仰税、第九天 我趴在偏房一處隱蔽的房頂上張望构资。 院中可真熱鬧,春花似錦陨簇、人聲如沸吐绵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)己单。三九已至,卻和暖如春耙饰,著一層夾襖步出監(jiān)牢的瞬間纹笼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工苟跪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廷痘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓件已,卻偏偏與公主長(zhǎng)得像牍疏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拨齐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容