- 最后登录
- 2017-6-3
- 注册时间
- 2012-8-13
- 阅读权限
- 30
- 积分
- 760
- 纳金币
- 3
- 精华
- 0
|
今天我们就讲讲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)
|
|