纳金网

标题: away3d4.0 新手入门系列教程 第二讲 light (灯光) [打印本页]

作者: D调的华丽    时间: 2012-8-22 20:14
标题: away3d4.0 新手入门系列教程 第二讲 light (灯光)
今天我们就讲讲away3d世界里的灯光。

away3d里的灯光分为2中。平行光(DirectionalLight)和点光源(PointLight)。我画图来说明

1.DirectionalLight



上图就是平行光.这个可以用来模拟我们平常的太阳光。平均的光照强度和方向。

平行光的创建方法为

var dlirectionalLight=new DirectionalLight();

dl的构造函数里三个值 用来描述平行光的方向 x y z 其范围都为 -1 到1。



2PointLight;





(我的图画的很粗糙 各位将就了)



PointLight经常用来模拟我们生活中的 蜡烛 灯泡这样的小型光源。

var _plointLight=new PointLight();

点光源不存在方向问题。



在3D世界里 我们通常不会只用一盏灯去模拟所有的光源。Away3d这里为我们提供了一个StaticLightPicker方法。我们可以将灯光放置于这个灯光容器里。 我们要将灯光用在贴图上时候只需要调用 StaticLightPicker 方法即可 这样可以减少我们的代码量

代码:var _light:StaticLightPicker=new StaticLightPicker([_dl,_pl]);   



然后我们需要将灯光运用在这个世界里

模型的贴图可以受到光的影响 不管是TextureMaterial还是ColorMaterial都有lightPicker属性。我们只需要将StaticLightPicker赋予给它即可例如 我们拿上一节的例子来写

_sphereMesh.material.lightPicker=_light;这样我们的模型就可以受到光照的影响了



我们可以建立个plane做地面来打开阴影 这样感觉就更酷了。阴影的添加方式是

planeColor.shadowMethod=new FilteredShadowMapMethod(_dl);

好了 我们输出渲染就可以看到下图





全部的代码为

package  {



import flash.display.MovieClip;

import away3d.containers.View3D;

import away3d.containers.Scene3D;

import away3d.cameras.Camera3D;

import flash.events.Event;

import flash.display.Sprite;

import away3d.materials.ColorMaterial;

import away3d.primitives.SphereGeometry;

import away3d.entities.Mesh;

import away3d.lights.DirectionalLight;

import away3d.materials.lightpickers.StaticLightPicker;

import away3d.primitives.PlaneGeometry;

import flash.geom.Vector3D;

import away3d.lights.PointLight;

import away3d.materials.methods.FilteredShadowMapMethod;




public class Main extends  Sprite {

  

  private var _view:View3D;

  

  private var _scene:Scene3D;

  

  private var _camera:Camera3D;

  

  private var _material:ColorMaterial;

  

  private var _sphere:SphereGeometry;

  

  private var _sphereMesh:Mesh;

  

  private var _dlirectionalLight;

  private var _plointLight;

  

  private var _light:StaticLightPicker;

  
  

  public function Main()

  {

   _view=new View3D();

   addChild(_view);

   

   _scene=new Scene3D();

   _view.scene=_scene;
   

   _camera=new Camera3D();

   _view.camera=_camera;

   

   _camera.y=500;

   _camera.lookAt(new Vector3D(0,0,0))

   
   _material=new ColorMaterial(0xffffff);

   _sphere=new SphereGeometry(100,32,32);

   _sphereMesh=new Mesh(_sphere,_material);

   _view.scene.addChild(_sphereMesh);

   

   var planelaneGeometry=new PlaneGeometry(500,500);

   var planeColor:ColorMaterial=new ColorMaterial(0xffffff);

   var planeMesh:Mesh=new Mesh(plane,planeColor);

   planeMesh.y=-100;

   _view.scene.addChild(planeMesh);

   

   _dl=new DirectionalLight(-1,-.5);

   _dl.diffuse=.8

   _dl.ambient=.05

   _dl.castsShadows=***e;

   _pl=new  PointLight();

   _light=new StaticLightPicker([_dl,_pl]);

   

   planeColor.shadowMethod=new FilteredShadowMapMethod(_dl)

   

   _sphereMesh.material.lightPicker=_light;

   planeMesh.material.lightPicker=_light;

   

   _view.scene.addChild(_dl);

   this.addEventListener(Event.ENTER_FRAME,enterFrameFunction)

  }

  

  private function enterFrameFunction(evt:Event):void

  {

   _view.render();

  }

}



}





(本人第一次写教程,有不足的地方欢迎大家提出来。有疑问欢迎跟帖)



今天的这一讲结束了 下一节的要点 位图贴图(BitmapMaterial)


作者: wsk    时间: 2012-9-7 11:58
持续关注中!!!!!!!!!!!!!!!!
作者: 开拓者    时间: 2013-1-27 07:42
   _sphereMesh.material.lightPicker=_light;
   planeMesh.material.lightPicker=_light;                  这两个大概意思懂。但是具体的不懂。能揭晓一下吗



作者: 来学习    时间: 2013-2-28 20:55
必须顶~必须顶~必须顶~必须顶~必须顶~必须顶~必须顶~必须顶~必须顶~必须顶~必须顶~必须顶~

作者: long    时间: 2013-3-1 14:11
ddddddddddddddddd
作者: longkui123321    时间: 2013-10-14 23:13
D叫兽,继续加油发!




欢迎光临 纳金网 (http://wwww.narkii.com/club/) Powered by Discuz! X2.5