一 平移

(1)平移直接体现在代码当中

在二维当中,平移相当于就是改变x,y的位置。

    function setRectangle(gl, x, y, width, height) {var x1 = x;var x2 = x + width;var y1 = y;var y2 = y + height;gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([x1, y1,x2, y1,x1, y2,x1, y2,x2, y1,x2, y2]), gl.STATIC_DRAW);}

在这段代码当中,要实现矩形的移动,就改变x,y的值即可。x,y的值通过外界可变的方式传入,每改变一次x,y的值就要进行一次重绘矩形,refreshDraw()是对渲染代码进行封装,滑块引入webgl-lessons-ui.js库进行操作。

    var translation = [10, 10];var width = 100;var height = 30;var color = [Math.random(), Math.random(), Math.random(), 1];refreshDraw();webglLessonsUI.setupSlider("#x", { slide: updatePosition(0), max: webgl.canvas.width });webglLessonsUI.setupSlider("#y", { slide: updatePosition(1), max: webgl.canvas.height });function updatePosition(index) {return function (event, ui) {translation[index] = ui.value;refreshDraw();}}

结果如下:

(2)平移体现在着色器当中

如果对一个复杂图形进行平移的话,像上述那种代码就比较复杂与繁琐。将平移项加入到着色器当中能够简化代码。比如F的绘制,只需要知道"F"形状的长宽即可,偏移量可不体现在setGeometry()这个函数当中:

    function setRectangle(gl) {gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([// 左竖0, 0,30, 0,0, 150,0, 150,30, 0,30, 150,// 长横30, 0,100, 0,30, 30,30, 30,100, 0,100, 30,// 短横30, 60,67, 60,30, 90,30, 90,67, 60,67, 90,]), gl.STATIC_DRAW);}

偏移量(u_translation)体现在着色器中:

  <script id="vertex-shader" type="nojs">attribute vec2 a_position;uniform vec2 u_resolution;uniform vec2 u_translation;void main(){vec2 position = a_position + u_translation;vec2 zeroToOne = position / u_resolution;vec2 zeroToTwo = zeroToOne * 2.0;vec2 clipSpace = zeroToTwo - 1.0;gl_Position = vec4(clipSpace * vec2(1,-1),0,1);}</script>

之后的代码都差不多,需要注意的是参数单个分别传入与一起以数组的形式传入的区别:

      webgl.uniform2f(resolutionUniformLocation, webgl.canvas.width, webgl.canvas.height);webgl.uniform2fv(translationUniformLocation, translation);webgl.uniform4fv(colorUniformLocation, color);

还要注意最后绘制的个数为18个,因为有6个三角形构成了”F“,而每个三角形有3个顶点。

      webgl.drawArrays(webgl.TRIANGLES, 0, 18);

以及还要注意一下,加入这行代码与不加的区别:

      webglUtils.resizeCanvasToDisplaySize(webgl.canvas);

不加上述那行代码的结果如下:

加了的结果:

二 旋转

有两种理解方式,一是将原来的坐标点乘以单位圆中的某一点来获得旋转后的坐标点,二是根据正余弦来求解旋转后的坐标点。其实二者算是同一种方式,只不过单位圆算是正余弦之后得到的结果了。

利用单位圆(其中中间的加减符号与旋转方向有关,该公式一般作顺时针旋转):

rotatedX = a_position.x * u_rotation.y + a_position.y * u_rotation.x;
rotatedY = a_position.y * u_rotation.y - a_position.x * u_rotation.x;

利用正余弦(其中中间的加减符号与旋转方向有关,也在一定程度上与传入的角度有关,该公式一般作逆时针旋转):

rotatedX = a_position.x * u_cosB - a_position.y * u_sinB;
rotatedY = a_position.y * u_cosB + a_position.x * u_sinB;

旋转量(u_rotation)也体现在着色器当中:

  <script id="vertex-shader" type="nojs">attribute vec2 a_position;uniform vec2 u_resolution;uniform vec2 u_translation;uniform vec2 u_rotation;void main(){vec2 rotatedPosition = vec2(a_position.x * u_rotation.y + a_position.y * u_rotation.x,a_position.y * u_rotation.y - a_position.x * u_rotation.x);vec2 position = rotatedPosition + u_translation;vec2 zeroToOne = position / u_resolution;vec2 zeroToTwo = zeroToOne * 2.0;vec2 clipSpace = zeroToTwo - 1.0;gl_Position = vec4(clipSpace * vec2(1,-1),0,1);}</script>

获得属性位置、传参以及加入旋转角度的滑块(代码借助正余弦方式进行实现):

    var rotationUniformLocation = webgl.getUniformLocation(program, "u_rotation");var rotation = [0, 1];webglLessonsUI.setupSlider("#rotation", { slide: updateAngle, max: 360 });function updateAngle(event, ui) {var angleInDegrees = 360 - ui.value;var angleInRadians = angleInDegrees * Math.PI / 180;rotation[0] = Math.sin(angleInRadians);rotation[1] = Math.cos(angleInRadians);refreshDraw();}//不要忘记设置旋转参数webgl.uniform2fv(rotationUniformLocation, rotation);

结果如下:

三 缩放

缩放跟平移的原理差不多。

缩放大小(u_scale)体现在顶点着色器当中:

  <script id="vertex-shader" type="x-shader/x-vertex">attribute vec2 a_position;uniform vec2 u_resolution;uniform vec2 u_translation;uniform vec2 u_rotation;uniform vec2 u_scale;void main(){vec2 scaledPosition = a_position * u_scale;vec2 rotatedPosition = vec2(scaledPosition.x * u_rotation.y + scaledPosition.y * u_rotation.x,scaledPosition.y * u_rotation.y - scaledPosition.x * u_rotation.x);vec2 position = rotatedPosition + u_translation;vec2 zeroToOne = position / u_resolution;vec2 zeroToTwo = zeroToOne * 2.0;vec2 clipSpace = zeroToTwo - 1.0;gl_Position = vec4(clipSpace * vec2(1,-1),0,1);}</script>

获得属性位置、传参以及加入缩放大小的滑块:

    var scaleUniformLocation = webgl.getUniformLocation(program, "u_scale")webglLessonsUI.setupSlider("#scalex", { value: scale[0], slide: updateScale(0), min: -5, max: 5, step: 0.01, precision: 2 });webglLessonsUI.setupSlider("#scaley", { value: scale[1], slide: updateScale(1), min: -5, max: 5, step: 0.01, precision: 2 });webgl.uniform2fv(scaleUniformLocation, scale);function updateScale(index) {return function (event, ui) {scale[index] = ui.value;refreshDraw();}}//不要忘记设置缩放参数webgl.uniform2fv(scaleUniformLocation, scale);

结果如下(x为负值向左缩放,y为负值向上缩放):

WebGL 实践篇(三)—— 二维图形的平移、旋转、缩放相关推荐

  1. 利用Turbo C进行平面二维图形的平移,旋转,缩放,对称

    [实验内容] 以矩阵运算为数学基础,采用旋转.平移.缩放.对称等基本几何变换,对一简单的二维图形做变换. [实验步骤] 1. 编写二维图形基本变换(包括旋转.平移.缩放.对称)的通用子程序: 2. 以 ...

  2. 图形学 ---- 二维几何变换(二维图形矩阵平移,旋转,缩放)

    二维图形几何变换,矩阵计算 前言:对于一个图形的几何变换,对应的是操作到图形中的每一个点! 即对每一个点做出相应的几何变换.比如平移,就是对二维图形的每个点都平移相同的距离:旋转则是对每一个点,基于基 ...

  3. 二维图形平移变换c语言程序,[转载]计算机图形学Opengl实现二维图形的平移、旋转、缩放复合变换...

    参考课堂教学中关于模型变化的讲解,编写对一个三角形分别实现平移.缩放.旋转等变化的源码及效果图.请以该例为蓝本,实现3题的代码编写. 如下的几幅图,第一幅就是在给出的代码部分进行修改,将GL_FLAT ...

  4. 3ds Max 实验三 二维图形建模的基本应用

  5. 计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...

    计算机图形学实验:二维图形变换.docx (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实验三 二维图形变换一.实验任务1. 通 ...

  6. 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    一.实现方案 对于一个二维图形作平移.旋转.放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移).绕一点旋转固定的角(旋转).在x,y轴方向分别放缩sx ...

  7. 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等

    接上文 计算机图形学 学习笔记(六):消隐算法:Z-buffer,区间扫描线,Warnock,光栅图形学小结 在图形学中,有两大基本工具:向量分析,图形变换.本文将重点讲解向量和二维图形的变换. 5. ...

  8. 计算机图形学二维图形基本变换实验原理,江苏大学-计算机图形学第三次实验报告-二维图形变换...

    <江苏大学-计算机图形学第三次实验报告-二维图形变换>由会员分享,可在线阅读,更多相关<江苏大学-计算机图形学第三次实验报告-二维图形变换(13页珍藏版)>请在人人文库网上搜索 ...

  9. matlab 三nurbs,nurbs 绘制 三维、二维图形,网格细化,基函数求解等 包 matlab 238万源代码下载- www.pudn.com...

    文件名称: nurbs下载 收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 334 KB 上传时间: 2013-03-16 下载次数: 18 提 供 者: 吴紫俊 ...

最新文章

  1. rhel5.5安装xwindow
  2. VMware workstation中rhel安装VMware tools失败
  3. Linux查看CPU,内存,GPU,进程,版本,系统内核信息
  4. 「技美之路」图形 1.1 渲染流水线
  5. mysql导出如何不区分大小写_mysql 不区分大小写
  6. Orleans解决并发之痛(四):Streams
  7. ubuntu 刚更改默认python3版本后更新包等
  8. db4o官方入门教程翻译--06.集合和数组
  9. 100个MySQL 的调节和优化的提示
  10. Dijkstra + 堆优化
  11. 简单利用字典破解zip文件口令
  12. 力软敏捷开发平台7.0.6旗舰版功能更新介绍
  13. grubbs准则 matlab_MATLAB-格拉布斯准则(MATLAB-Grubbs criterion)-M
  14. vrep和matlab,使用Matlab与V-REP联合仿真 - Play V-REP with Matlab
  15. 山东教师教育网-404、登录、密码找回、常见问题、绑定已有账户
  16. ctf_backdoor
  17. 含echarts图表の网页打印
  18. 用bootstrap写一个简洁的网页
  19. 如何用excel筛选相似内容_excel怎么筛选出相同内容
  20. 武汉大学计算机学院参考书,武汉大学计算机应用技术研究生考试科目和考研参考书目...

热门文章

  1. android 点击返回键home键,appium怎么按下系统按键?如按下返回键、home键等等
  2. 在线教育投融数据(2015-2020年)
  3. 图片上传系统在淘系中的实践
  4. 解决JPEGImageEncoder生成的图片全黑的问题
  5. arduino 天下第一(暴论) -- 智能猫眼与 SDDC 连接器移植到 arduino 上
  6. 海思开发板遇到的问题启发性的链接
  7. 第8节 Kali及其他Linux系统软件分类及安装
  8. 【Simulia】 Lsight多学科仿真流程 | 达索系统百世慧®
  9. c语言税务信息申报系统,四川税务网上申报系统下载
  10. 销售不愿意用企业微信怎么办?