版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Web会用到仿射变换,比如,对元素设置CSS的transform属性就是对元素应用仿射变换。再说回到几何图形,针对它的仿射变换具有以下2a和b常见的仿射变换形式包括平移、旋转、缩放以及它们的组合。其中,平移变换是最简单的仿射变换。如果我们想让向量P(,y0)沿着向量Q(,y1)平移,只要将P和Q相加就可以了。接着是旋转变换5classVector2Drotate(rad)constc=s=const[x,y]=7889this.x=x*c+y*-s;this.y=x*s+y*c;return}}Pr,角度是⍺,现在我们要将它顺时针旋转⍬P’的然后,因为rcos⍺、rsin⍺是向量P原始的坐标x0、y0,所以,我们可以把坐标代入到上面我后面会讲,这里你先记住这个旋转矩阵的就可以了。现在,我们就得到了三个基本的仿射变换,其中旋转和缩放都可以写成矩阵与向量相乘的形式。这种能写成矩阵与向量相乘形式的变换,就叫做线性变换。线性变换除了可以满足仿射变换的2个性质之外,还有2个额外的性质:线性变换不改变坐标原点(因为如果x0、y0等于零,那么x、y肯定等于那根据线性变换的第2条性质,我们就能总结出一个通用的线性变换,即一个原始向量P0经过M1、M2、…Mn次的线性变换之后得到最终的坐标P。线性变化的叠加是一个非常重要的性质,它是我们对图形进行变换的基础,所以你一定要牢记线性变化的叠加性质。好了,常见的仿射变换形式我们说完了。总的来说,向量的基本仿射变换分为平移、旋转与缩放,其中旋转与缩放属于线性变换,而平移不属于线性变换。基于此,我们可以得到仿射变换的一般表达式,如下图所示:这样,我们就将原本n维的坐标转换为了n+1维的坐标。这种n+1维坐标被称为齐次坐齐次坐标和齐次矩阵是可视化中非常常用的数学工具,它能让我们用线性变换来表示仿射变换。这样一来,我们就能利用线性变换的叠加性质,来非常方便地进行各种复杂的仿射变换了。到共识上,就是把这些变换的矩阵相乘得到一个新的矩阵,再把它乘以原向量。我们在绘制几何图形的时候会经常用到它,所以你要记住这个。你可能还不熟悉粒子动画,我们先来快速认识一下它。它能在一定时间内生成许多随机运动的小图形,这类动画通常是通过给人以视觉上的震撼,来达到获取用户关注的效果。在可视化中,粒子动画可以用来表达数据信息本身(比如数量、大小等等),也可以用来修饰界面、吸户的关注,它是我们在可视化中经常会用到的一种视觉效果。为了方便你理解,我们今天只讲一个简单的粒子动画。这个粒子动画的运行效果,是从一个点开始发射出许多颜色、大小、角度各异的三角形,并且通过不断变化它们的位置,产生一种撒花般的视觉效果。因为这个粒子动画中主要用到了三角形,所以我们第一步就要创建三角形。创建三角形一共可以分为两步,第一步,我们定义三角形的顶点并将数据送到缓冲区。这一步,你直接看下面创建WebGLProgram的步骤就能理解。如果你还不是很熟悉,我建议你复下第4节课的内容。代代123456789constposition=new-1,-0,1,-constbufferId=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,bufferId);gl.bufferData(gl.ARRAY_BUFFER,position,constvPosition=gl.getAttribLocation(program,'position');gl.vertexAttribPointer(vPosition,2,gl.FLOAT,false,0,0);第二步,我们实现一个创建随机三角形属性的函数。具体来说就是,利用角度u_rotation、初始大小u_scale、初始时间u_time、动画持续时间u_diration、运动方向u_dir和创建时间startTime。除了startTime之外的数据,我们都需要传给shader代代123456789functionrandomTriangles()constu_color=[Math.random(),Math.random(),Math.random(),1.0];//constu_rotation=Math.random()*Math.PI;//constu_scale=Math.random()*0.05+0.03;//constu_time=constu_duration=3.0;//持续3constrad=Math.random()*Math.PI*constu_dir=[Math.cos(rad),Math.sin(rad)];//conststartTime=return{u_color,u_rotation,u_scale,u_time,u_duration,u_dir,}设置uniform通过前面的代码,我们已经将三角形顶点信息传入缓冲区。我们知道,在WebGL的shader中,顶点相关的变量可以用attribute。但是,我们现在要把u_color、u_rotationshader些固定的值。这时候,我们就要用到shader的另一种变量,也就是uniform来那它们有什么区别呢?首先,attribute变量是对应于顶点的。也就是说,几何图形有几个顶点就要提供几份attribute数据。并且,attribute变量只能在顶点器中使用,如果要在片元器中使用,需要我们通过varying变量将它传给片元器才行。这样一而uniform的变量不同,uniform的变量和其他语言中的常量一样,我们赋给unformshader点变化。uniform变量既可以在顶点器中使用,也可以在片元器中使用。WebGLgl.uniformXXX(loc,u_colorshadergl.uniform1f传入一个浮点数,对应的uniform变量的类型为floatgl.uniform4f传入四个浮点数,对应的uniform变量类型为float[4]gl.uniform3fv传入一个三维向量,对应的uniform变量类型为vec3gl.uniformMatrix4fv4x4uniformmat4WebGLuniform详细的设置信息,你可以参考MDN文档。shaderuniform1123456789functionsetUniforms(gl,{u_color,u_rotation,u_scale,u_time,u_duration,//gl.getUniformLocation拿到uniformletloc=gl.getUniformLocation(program,//将数据传给unfiromgl.uniform4fv(loc,loc=gl.getUniformLocation(program,'u_rotation');gl.uniform1f(loc,u_rotation);loc=gl.getUniformLocation(program,'u_scale');gl.uniform1f(loc,u_scale);loc=gl.getUniformLocation(program,'u_time');gl.uniform1f(loc,u_time);loc=gl.getUniformLocation(program,'u_duration');gl.uniform1f(loc,u_duration);loc=gl.getUniformLocation(program,'u_dir');gl.uniform2fv(loc,u_dir);}用requestAnimationFramesetUniformsshadershader //对每个三角形重新设置triangles.forEach((triangle)=>triangle.u_time=(performance.now()-triangle.startTime)/setUniforms(gl,gl.drawArrays(gl.TRIANGLES,0,position.length/ // triangles=triangles.filter((triangle)=> returntriangle.u_time<= 1921我们再回过头来看最终要实现的效果。你会发现,所有的三角形,都是由小变大朝着特定的方向旋转。那想要实现这个效果,我们就需要用到前面讲过的仿射变换,在顶点器中进行矩阵运算。在这一步中,顶点器中的glsl代码最关键,我们先来看一下这个代码是怎么写的代代123456789attributevec2uniformfloatu_rotation;uniformfloatu_time;uniformfloatu_duration;uniformfloatu_scale;uniformvec2u_dir;varyingfloatvoidmain()floatp=min(1.0,u_time/u_duration);floatrad=u_rotation+3.14*10.0*p;floatscale=u_scale*p*(2.0-p);vec2offset=2.0*u_dir*p*p;mat3translateMatrix=mat3(1.0,0.0,0.0,1.0,offset.x,offset.y,mat3rotateMatrixmat3(cos(rad),sin(rad),-sin(rad),cos(rad),0.0,0.0,mat3scaleMatrixmat3(scale,0.0,0.0,scale,0.0,0.0,gl_PointSize=vec3pos=translateMatrix*rotateMatrix*scaleMatrix*vec3(position,1.0gl_Position=vec4(pos,1.0);首先,我们定义的p是当前动画进度,它的值是u_time/u_duration,取值区间从0到1。rad是旋转角度,它的值是初始角度u_rotation加上10π,表示在动画过程中它会绕自身旋转5周。其次,scale是缩放比例,它的值是初始缩放比例乘以一个系数,这个系数是p*(2.0-p),在我们后面讨论动画的时候你会知道,p*(2.0-p)是一个缓动函数,在这里我们只需要知最后,offset是一个二维向量,它是初始值u_dir与2.0*p*p的乘积,因为u_dir是个单位向量,这里的2.0表示它的最大移动距离为2,p*p也是一个缓动函数,作用是让位rotateMatrix是旋转矩阵,scaleMatrix是缩放矩阵。pos的值设置为这三个矩与position的乘积,这样就完成对顶点的线性变换,呈现出来的效果也就是三角形会向着最后,我们在片元器中对这些三角形。p也就是动画进度,从顶点器通过变量varyingvP传给片元器,然后在片元器中让alpha值随着vP值变化,代代123456789precisionmediumpfloat;uniformvec4u_color;varyingfloatvoid{gl_FragColor.xyz=u_color.xyz;gl_FragColor.a=(1.0-vP)*u_color.a;}CSS既然我们讲了仿射变换,这里还是要再提一下CSS中我们常用的属性transformdiv.blocktransform:rotate(30deg)translate(100px,50px)3CSS中的transform它不仅支持translate、rotate、scale等值,还支持matrix。CSS的matrix是一个简写的齐次矩阵,因为它省略了3阶齐次矩阵第三行的0,0,1值,所以它只有6个值。transformCSSCSStransform例子,我们可以这么定义CSStransform,代码如下:div.blocktransform:rotate(30deg)translate(100px,50px)330100px、50px1.5math,它几乎包代代123456789import{multiply}fromconstrad=Math.PI/6;consta=[Math.cos(rad),-Math.sin(rad),Math.sin(rad),Math.cos(rad),0,0,constb=[1,0,0,constc[1.5,0,0,1.5,0,0,constres=[a,b,c].reduce((a,b){returnmultiply([],b,[1.299038105676658,-0.7499999999999999,0,0,所以呢,我们最终就可以将上面的transform1div.block transform:matrix(1.3,0.75,-3这样的transform效果和之前rotate、translate和scale分开写的效果是一样的,但是字符数更少,所以能减小CSS文件的大小。那在我们介绍完仿射变换之后,你是不是对CSStransform的理解也更深了呢?没错,不光是transform,在我们之后的学习中,你也可以多想想,还有哪些内容在CSS中也有相的平移、旋转和缩放都属于仿射变换,而仿射变换具有2个性质:a和b线性变换不改变坐标原点(因为如果x0、y0等于零,那么x、y肯定等于到这里,数学基础篇的内容我们就学完了。在这一篇的开头,我们说了要总结出一个通用的基础数学绘图体系,这样才不至于陷入细节里。所以啊,我总结了一个简单的知识脑图,把我们在数学篇里讲过的数学知识汇总到了一起,它肯定不会是一个非常完整的数学绘图体系,但是对我们之后的学习来说,已经足够用了。最后呢,我还想再啰嗦几句。图形学作为可视化的基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024辣椒购销合同争议的解决方式
- 2025年度智能化厨房设备采购与安装一体化合同4篇
- 2025年投标采购心得体会总结与合同管理创新合同3篇
- 个人房屋转让协议书合同范本
- 2024年驾校场地使用权益转让合同
- 2025年度煤矿废弃资源煤矸石回收利用合同4篇
- 2025年度油气田钻井工程合同执行监督合同范本4篇
- 全新2025年度医疗设备采购与安装合同5篇
- 2025版污水处理厂智能化改造与运营维护协议3篇
- 2025版领队与纪念品供应商合作协议范本4篇
- 2024-2030年中国护肝解酒市场营销策略分析与未来销售渠道调研研究报告
- 人教版高中数学必修二《第十章 概率》单元同步练习及答案
- 智慧校园信息化建设项目组织人员安排方案
- 浙教版七年级上册数学第4章代数式单元测试卷(含答案)
- 一病一品成果护理汇报
- AQ-T 1009-2021矿山救护队标准化考核规范
- 盐酸埃克替尼临床疗效、不良反应与药代动力学的相关性分析的开题报告
- 消防设施安全检查表
- 组合结构设计原理 第2版 课件 第6、7章 钢-混凝土组合梁、钢-混凝土组合剪力墙
- 建筑公司资质常识培训课件
- GB/T 26316-2023市场、民意和社会调查(包括洞察与数据分析)术语和服务要求
评论
0/150
提交评论