webgl 10.Model Transform (模型变换)

学过线性代数的同学都知道模型的变换包括平移、旋转、缩放都可以通过矩阵的运算来表示。用于变换的矩阵称为 Model Matrix。

看一个例子,将图中三角形先向右平移 0.5, 再绕 Z 轴旋转 60度

transformed triangle.png

矩阵的运算使用了作者写的 cuon-mattrix.js 这个库

<script src="lib/cuon-matrix.js"></script>
// vertex shader
var VERTEX_SHADER_SOURCE =
    'attribute vec4 a_Position;\n' +
    'uniform mat4 u_ModelMatrix;\n' +
    'void main() {\n' +
    '   gl_Position = u_ModelMatrix * a_Position;\n' +
    '}\n';

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

var canvas = document.getElementById("canvas");
var gl = canvas.getContext('webgl');

if (!initShaders(gl, VERTEX_SHADER_SOURCE, FRAGMENT_SHADER_SOURCE)) {
    alert('Failed to init shaders');
}

var vertices = new Float32Array([
    0.0, 0.5,
    -0.5, -0.5,
    0.5, -0.5
]);

initVertexBuffers(gl, vertices);

var modelMatrix = new Matrix4();
// <model matrix> = <rotation matrix> * <translation matrix>
modelMatrix.setRotate(60, 0, 0, 1); // (0,0,1) 表示绕 Z 轴旋转
modelMatrix.translate(0.5, 0, 0);

var u_ModelMatrix = gl.getUniformLocation(gl.program, 'u_ModelMatrix');
gl.uniformMatrix4fv(u_ModelMatrix, false, modelMatrix.elements);

gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 3);
  • uniform mat4 u_ModelMatrix

mat4 是一个 4*4 的矩阵

  • gl_Position = u_ModelMatrix * a_Position

计算出变换矩阵乘以 a_Position

  • var modelMatrix = new Matrix4();
    // <model matrix> = <rotation matrix> * <translation matrix>
    modelMatrix.setRotate(60, 0, 0, 1);
    modelMatrix.translate(0.5, 0, 0);

先向右平移得到 :
<model matrix> = <translation matrix> * <origin>
再绕 Z 轴旋转 60度得到 :
<model matrix> = <rotation matrix> *(<translation matrix> * <origin>) = (<rotation matrix> * <translation matrix>) * <origin>
先 setRotate 再调用 translate 就是用矩阵里面已经保存的旋转矩阵的值再乘以新计算出来的平移矩阵的值

矩阵乘法满足结合律但不满足交换律,所以先平移再旋转和先旋转再平移是不一样的。
  • gl.uniformMatrix4fv(location, transpose, array)

transpose: 是否转置,webgl 中必须为 false
array: 是 column major order (列优先) 数组
这里通过 modelMatrix.elements 得到矩阵对应的数组

webgl 中矩阵数组是以列序排列的,什么是列序呢?假设一个矩阵数组是 [a, e, i, m, b, f, j, n, c, g, k, o, d, h, l, p], 那么它对应的矩阵是下面这样的
column major.png

练习:

  1. 实现三角形先绕 Z 轴旋转 60度再向右平移 0.5 看看是什么效果

思考:

  1. 有兴趣的同学手动计算一下旋转矩阵和平移矩阵和变换矩阵,看看跟库函数计算出的是否一样,可通过 Matrix4 对象的 elements 属性得到矩阵数组,另外注意矩阵数组是列优先的。

查看源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 变换(Transformations) 我们可以尝试着在每一帧改变物体的顶点并且重设缓冲区从而使他们移动,但这太繁...
    IceMJ阅读 4,077评论 0 1
  • >*很不幸,没人能告诉你母体是什么,你只能自己体会* --骇客帝国 在第四章“可视效果”中,我们研究了一些增强图层...
    夜空下最亮的亮点阅读 1,640评论 0 2
  • 1 前言 OpenGL渲染3D模型离不开空间几何的数学理论知识,而本篇文章的目的就是对空间几何进行简单的介绍,并对...
    RichardJieChen阅读 6,900评论 1 11
  • 这个五一,我们家和朋友家,一行老少九人,来到了位于蔡甸奓山的奓湖牧野农场,开启了一天多的休闲游。 一、晨起漫步篇 ...
    MAY聆听诗语阅读 2,952评论 6 5
  • 亲爱的枯叶蝶: 木叶又开始一片一片的掉落,枯黄,枯黄到我又一次找不到你。 你家门口烧了一堆香蜡灰烬...
    莫昔子阅读 393评论 0 1