版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我们现在假设,在 而我们最终要在CanvaslookAt 1,0,0, 0,1,0, 0,0,1, x,y,z, constup=[0,1,m.lookAt(eye,target,renderer.uniforms.viewMatrix=12m,m.lookAt(eyetarget,up),这里的up是一个向量,表示朝上的方向,我们把它定义为y轴正向。然后我们调用代代223456789attributevec3a_vertexPosition;attributevec4color;attributevec3varyingvec4vColor;varyingfloatvCos;uniformmat4projectionMatrix;uniformmat4modelMatrix;uniformmat4viewMatrix;uniformmat3normalMatrix;constvec3lightPosition=vec3(1,0,void{gl_PointSize=1.0;vColor=color;vec4pos=viewMatrix*modelMatrix*vec4(a_vertexPosition,1.0);vec4lp=viewMatrix*vec4(lightPosition,1.0);vec3invLight=lp.xyz-vec3norm=normalize(normalMatrix*normal);vCos=max(dot(normalize(invLight),norm),0.0);gl_Position=projectionMatrix*updateCamera([0.5,0,0.5向(0,0,0)3D面的课程中我们,WebGL的默认坐标范围是从-1到1的。也就是说,只有当图像的x、y、z的值在-1到1举个例子,如果我们修改模型矩阵,让圆柱体沿x、y轴平移,向右上方各平移0.5,那么圆柱中x、y值大于1的部分都会被剪裁掉,因为这些部分已经超过了Canvas边缘。操作代代代functionupdate()constmodelMatrix=fromRotation(rotationX,rotationY,modelMatrix[12]=0.5;//给x轴增加0.5modelMatrix[13]=0.5;//给y轴也增加0.5renderer.uniforms.modelMatrix=renderer.uniforms.normalMatrix=normalFromMat4([],8对于只有x、y的二维坐标系来说,这一点很好理解。但是,对于三维坐标系来说,不仅x、y轴会被剪裁,z轴同样也会被剪裁。我们还是直接修改代码,给z轴增加0.5的平会显示这么奇怪的结果,就是因为z轴超过范围的部分也被剪裁掉了,导致投影出现了问既然是投影出现了问题,我们先回想一下,我们都对z轴做过哪些投影操作。在绘制圆柱体的时候,我们只是用投影矩阵非常简单地反转了一下z轴,除此之外,没做过其他任何操作了。所以,为了让图形在剪裁空间中正确显示,我们不能只反转z轴,还需要将图像首先是正投影,它又叫做平行投影。正投影是将物体投影到一个长方体的空间(景体),并且无论相机与物体距离多远,投影的大小都不变。而投影更接们的感知投影律是相机物体离相的物体小。与正投影不同,正投影的视景体是一个长方体,而投影的视景体是一个棱因为数学推导过程比较复杂,我在这里就不详细推导了,直接给出对应的JavaScript函数,你只要记住ortho和这两个投影函数就可以了,函数如下所示其中,orthox、y、z的返回值就是投影矩阵。而是计算投影的函数,它的参数是近景平面near、远景平面far、视角fov和宽高比率aspect,返回值也是投影矩阵。
代functionortho(out,left,right,bottom,top,near,far)letlr=1/(left-letbt=1/(bottom-letnf=1/(near-6=*6=*7=8=9===*=====2*=out[12]=(left+out[13]=(top+out[14]=(far+out[15]=23
return (out,fovy,aspect,near,far)letf=1.0/Math.tan(fovy/letnf=1/(near-out[0]=f/out[1]=out[2]=out[3]=out[4]=out[5]=out[6]=out[7]=out[8]=out[9]=out[10]=(far+near)*out[11]=-out[12]=out[13]=out[14]=2*far*near*nf;out[15]=0;return接下来,我们先试试对圆柱体进行正投影。假设,在正投影的时候,我们让视景体三个方向的范围都是(-)。以刚才的相机位置为参照(代1代123456789import{ortho}fromfunctionprojection(left,right,bottom,top,near,far){returnortho([],left,right,bottom,top,near,far);}constprojectionMatrix=projection(-2,2,-2,2,-2,2);jectionMatrixprojectionMatrix;投影矩阵updateCamera([0.5,0,0.5]);//置放在(2,2,3)的地方。代代1234567import}fromfunctionprojection(near=0.1,far=100,fov=45,aspect={([],fov*Math.PI/180,aspect,near,}constprojectionMatrix=88jectionMatrix=9我们发现,在投影下,距离观察者(相机)近的部分大,距离它远的部分小。这更合真实世界中我们看到的效果,所以一般来说,在绘制D图形时,我们更偏向使用3D实际上,通过上节课和刚才的内容,我们已经能总结出3D绘制几何体的基本数学模型,也就是3D绘图的标准模型。这个标准模型一共有四个矩阵,它们分别是:投影矩阵、视果。比较成图形库,如rS、BabylonJ,基本上都是采用这个标准模型来进行3D绘图的。所以理解这个模型,也有助于增强我们对图形库的认识,帮助我们WebGL原生的APIgl-renderer库来简化2D绘图过程。而3D绘图是一个比2D绘图更加复杂的过程,即使是gl-renderer当然,使用ThreeJS或BabeylonJS都是不错的选择。但是在这节课中,我会使用一个更加轻量级的图形库,叫做OGL。它拥有我们可视化绘图需要的所有基本功能,而且ThreeJSAPOGLOGL以下7个步骤,如下图所示。Renderer512Renderer代代1234567constcanvasconstrenderer=newRenderer({width:height:然后,我们在OGL中,通过newCamera来创建相机,默认创建出的是投影相机。这里我们把视角设置为35度,位置设置为(0,1,7),朝向为(0,0,0)。代码如下:112345constgl=renderer.gl;gl.clearColor(1,1,1,1);constcamera=newCamera(gl,{fov:35});camera.position.set(0,1,7);camera.lookAt([0,0,代接着,我们创建场景。OGL使用树形渲染的方式,所以在用OGL创建场景时,我们要使用TransformTransform代代1constscene=new然后,我们创建几何体对象。OGL内置了许多常用的几何体对象,包括球体Sphere、立方体Box、柱/锥体Cylinder以及环面Torus等等。使用这些对象,我们可以快速创建这些几何体的顶点信息。那在这里,我创建了4个几何体对象,分别是球体、立方体、椎代代constsphereGeometry=newconstcubeGeometry=newconstcylinderGeometry=newconsttorusGeometry=new再然后,我们创建WebGL程序。并且,我们在器中给这些几何体设置了浅蓝色和简代代123456789constvertex=/*glsl*/precisionhighpattributevec3position;attributevec3normal;uniformmat4modelViewMatrix;uniformmat4projectionMatrix;uniformmat3normalMatrix;varyingvec3vNormal;voidmain()vNormal=normalize(normalMatrix*gl_Position=projectionMatrix*modelViewMatrix*vec4(position,}constfragment=/*glsl*/precisionhighpvaryingvec3vNormal;voidmain(){vec3normal=floatlighting=dot(normal,normalize(vec3(-0.3,0.8,0.6)));gl_FragColor.rgb=vec3(0.2,0.8,1.0)+lighting*0.1;gl_FragColor.a=}constprogram=new{有了WebGL程序之后,我们使用它和几何体对象来构建真正的网格(Mesh)元素,最终再把这些元素渲染到画布上。我们创建了4个网格对象,它们的形状分别是环面、球体、立方体和圆柱,我们给它们设置了不同的位置,然后将它们添加到场景scene中去。代代123456789consttorus=newMesh(gl,{geometry:torusGeometry,program});torus.position.set(0,1.3,0);constsphere=newMesh(gl,{geometry:sphereGeometry,program});sphere.position.set(1.3,0,0);constcube=newMesh(gl,{geometry:cubeGeometry,program});cube.position.set(0,-1.3,0);constcylinder=newMesh(gl,{geometry:cylinderGeometry,program});cylinder.position.set(-1.3,0,0);最后,它们用相机camera对象的设定渲染出来,并分别设置绕y轴旋转的动画,你就能看到这4个图像旋转的画面了。代码如下:代代123456789functionupdate(){torus.rotation.y-=sphere.rotation.y-=cube.rotation.y-=cylinder.rotation.y-=renderer.render({scene,}在这一节课,我们在三里,引入了相机和视图矩阵的概念,相机
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全新高速公路建设与维护管理合同(2024版)3篇
- 二零二四年度房产项目绿化合同(2024版)3篇
- 全新短视频内容创作版权合同(2024版)
- 研学旅行活动手册
- 职业规划可行性分析报告
- 玉林师范学院《钢琴律》2023-2024学年第一学期期末试卷
- 盾构机安全管理
- 配电网工程施工项目经理理论考核试题
- 2024-2025学年八年级物理声现象中考复习题
- 数控加工技术培训资料
- 学校心理健康教育课程设计与教法
- 也是冬天也是春天:升级彩插版
- 广播电视编导专业大学生职业生涯规划书
- 2023年12月英语六级真题及参考答案
- 小学数学六年级上册《数学广角-数与形》教学设计
- 储能电站现场运行专用规程V1.0
- 泸定水电站工程防洪分析
- 《传感器技术》习题答案完整
- Unit+5+The+Monarchs+Journey+Language+points+课件-【知识精讲精研】高中英语外研版(2019)必修第一册+
- 高考日语副助词默写单
- 高一政治学科期末考试质量分析报告(7篇)
评论
0/150
提交评论