计算机图形学实验报告-实验5Phong光照模型_第1页
计算机图形学实验报告-实验5Phong光照模型_第2页
计算机图形学实验报告-实验5Phong光照模型_第3页
计算机图形学实验报告-实验5Phong光照模型_第4页
计算机图形学实验报告-实验5Phong光照模型_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE 32PAGE 6计算机图形学实验报告班级 计算机工硕班 学号 2011220456 姓名 王泽晶 实验五: Phong光照模型 实验目的通过本次试验,学生可以掌握简单光照明模型的计算,以及真实感绘制中三维场景搭建的初步知识。实验内容:对给定的光源、相机状态,对球进行Phong光照明模型绘制。搭建三维场景:在三维空间中摆放1个球,半径为R,默认为50 ,摆放位置为(0,0,0)球的材质默认值为Ka = (0.1,0.1,0.1), Kd = (0,0,0.8), Ks = 0.2, n = 10视点方向初始为(0,0,1), 光源方向初始为(1,1,1)视口设置为x0 = -100,

2、y0 = -75, w = 200, h = 150使用phong模型绘制场景试验步骤:添加成员函数,编写成员数代码为override public function computeIntersection( viewStart:Vec3, viewDir:Vec3):Boolean/ See /geometry/sphereline/var viewEnd:Vec3 = viewStart.add(viewDir);var A:Number = Math.pow(viewEnd.getVec(0) - viewStart.getVec(0), 2) +Math.pow(viewEnd.get

3、Vec(1) - viewStart.getVec(1), 2) +Math.pow(viewEnd.getVec(2) - viewStart.getVec(2), 2);var B:Number =(viewEnd.getVec(0) - viewStart.getVec(0) * (viewStart.getVec(0) - _position.getVec(0) +(viewEnd.getVec(1) - viewStart.getVec(1) * (viewStart.getVec(1) - _position.getVec(1) +(viewEnd.getVec(2) - view

4、Start.getVec(2) * (viewStart.getVec(2) - _position.getVec(2) * 2.0;var C:Number = Math.pow(_position.getVec(0) - viewStart.getVec(0), 2) + Math.pow(_position.getVec(1) - viewStart.getVec(1), 2) +Math.pow(_position.getVec(2) - viewStart.getVec(2), 2) - _radius*_radius;/ Solve C + Bt + At2 = 0var delt

5、a:Number = B*B - 4*A*C;if ( delta0.0 | A=0.0 ) return false;/ We dont consider whether 0t1 here because real viewer is at infinite placevar t1:Number = (-B + Math.sqrt(delta) / (2*A);var t2:Number = (-B - Math.sqrt(delta) / (2*A);if ( t1t2 )point = viewStart.multiplyk(1.0 - t1).add(viewEnd.multiplyk

6、(t1);elsepoint = viewStart.multiplyk(1.0 - t2).add(viewEnd.multiplyk(t2);normal = Vec3.normalize(point.minus(_position);return true;public var _width :Number =0.0;public var _height:Number = 0.0;public var data:Array = new Array();protected function group1_creationCompleteHandler(event:FlexEvent):vo

7、iddraw();public function draw():voidgraphics.clear();if(txtViewDir.text = )return;var ary:Array = txtViewDir.text.split(,);var flag:Boolean = false;for(var i:int= 0;iary.length;i+)if(aryi = | isNaN(aryi)flag = true;break;if(flag) txtViewDir.setStyle(color,0 xff0000);return;txtViewDir.setStyle(color,

8、0 x000000);var viewDir:Vec3 = new Vec3(Number(ary0), Number(ary1), Number(ary2);ary = txtLight.text.split(,);flag = false;for(i= 0;iary.length;i+)if(aryi = | isNaN(aryi)flag = true;break;if(flag) txtLight.setStyle(color,0 xff0000);return;txtLight.setStyle(color,0 x000000);var light:Light = new Light

9、();light.direction = new Vec3(Number(ary0), Number(ary1), Number(ary2).negative();light.ambient = new Vec3(Number(ary0), Number(ary1), Number(ary2);ensity = new Vec3(Number(ary0), Number(ary1), Number(ary2);var material:Material = new Material();material.diffuse =new Vec3(0.0, 0.0, 0.8);material.spe

10、cular =new Vec3(0.2, 0.2, 0.2);material.ambient =new Vec3(0.1, 0.1, 0.1);data = createSceneImage( 200, 150, viewDir, light, material );drawImg();public function drawImg():voidfor(var y:int = 0 ;y150;y+)for(var x:int =0;x200;x+)var index:int = (y*200 + x) * 3;var r:Number = dataindex+0;var g:Number =

11、 dataindex+1;var b:Number = dataindex+2;var cl:uint =(r 16) | (g 8) | b;this.graphics.beginFill(cl)this.graphics.drawCircle(x,y,1);this.graphics.endFill();public function allocateBuffer( width:int,height: int ):Arrayvar data:Array = new Array();data.length = width * height * 3;_width = width;_height

12、 = heightreturn data;public function createSceneImage( width:int,height: int ,viewDir:Vec3, light:Light, material:Material ):Arrayvar data:Array = new Array();var sphere:SphereObject = new SphereObject(50.0);sphere.setPosition(new Vec3(0.0, 0.0, 0.0) );sphere.setMaterial( material );var halfW:int =

13、width / 2var halfH:int = height / 2;for ( var y:int=0; yheight; +y )for ( var x:int=0; xwidth; +x )var viewStart:Vec3 = new Vec3(Number(x - halfW), Number(y - halfH), 0.0);if ( puteIntersection(viewStart, viewDir) )sphere.color = puteColor(light, viewDir, sphere.normal);elsesphere.color = new Vec3(0.1, 0.1, 0.1);var index:int = (y*width + x) * 3;dataindex+0 = (sphere.color.getVec(0) * 255.0);dataindex

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论