从 Away3d 的 GitHub 中提取示例会有所帮助。
https://github.com/away3d/away3d-examples-fp11
/**
* Initialize the lights
*/
private function initLights():void
{
moonLight = new DirectionalLight();
moonLight.position = new Vector3D(3500, 4500, 10000); // Appear to come from the moon in the sky box.
moonLight.lookAt(new Vector3D(0, 0, 0));
moonLight.diffuse = 0.5;
moonLight.specular = 0.25;
moonLight.color = 0xFFFFFF;
scene.addChild(moonLight);
cameraLight = new PointLight();
cameraLight.diffuse = 0.25;
cameraLight.specular = 0.25;
cameraLight.color = 0xFFFFFF;
cameraLight.radius = 1000;
cameraLight.fallOff = 2000;
scene.addChild(cameraLight);
skyLight = new DirectionalLight();
skyLight.diffuse = 0.1;
skyLight.specular = 0.1;
skyLight.color = 0xFFFFFF;
scene.addChild(skyLight);
lightPicker = new StaticLightPicker([moonLight, cameraLight, skyLight]);
//create a global fog method
fogMethod = new FogMethod(0, 200000, 0x000000);
}
private function createTreeShadow(x:Number, z:Number):void
{
// Paint on the terrain's shadow blend layer
var matrix:Matrix = new Matrix();
var dx:Number = (x/terrainWidth + 0.5)*512 - 8;
var dy:Number = (-z/terrainDepth + 0.5)*512 - 8;
matrix.translate(dx, dy);
var treeShadowBitmapData = new BitmapData(16, 16, false, 0x0000FF);
treeShadowBitmapData.draw(createGradientSprite(16, 16, 0, 1), matrix);
blendBitmapData.draw(treeShadowBitmapData, matrix, null, BlendMode.ADD);
// Update the terrain.
blendTexture.bitmapData = blendBitmapData; // TODO: invalidation routine not active for blending texture
}
/**
* Initialize the material
*/
private function initMaterials():void
{
//create skybox texture
cubeTexture = new BitmapCubeTexture(new EnvPosX().bitmapData, new EnvNegX().bitmapData, new EnvPosY().bitmapData, new EnvNegY().bitmapData, new EnvPosZ().bitmapData, new EnvNegZ().bitmapData);
//create tree material
trunkMaterial = new TextureMaterial(new BitmapTexture(new TrunkDiffuse().bitmapData));
trunkMaterial.normalMap = new BitmapTexture(new TrunkNormals().bitmapData);
trunkMaterial.specularMap = new BitmapTexture(new TrunkSpecular().bitmapData);
trunkMaterial.diffuseMethod = new BasicDiffuseMethod();
trunkMaterial.specularMethod = new BasicSpecularMethod();
trunkMaterial.addMethod(fogMethod);
trunkMaterial.lightPicker = lightPicker;
//create leaf material
leafMaterial = new TextureMaterial(new BitmapTexture(new LeafDiffuse().bitmapData));
leafMaterial.addMethod(fogMethod);
leafMaterial.lightPicker = lightPicker;
//create height map
heightMapData = new BitmapData(512, 512, false, 0x0);
heightMapData.perlinNoise(200, 200, 4, uint(1000*Math.random()), false, true, 7, true);
heightMapData.draw(createGradientSprite(512, 512, 1, 0));
//create terrain diffuse method
blendBitmapData = heightMapData.clone();
blendBitmapData.threshold(blendBitmapData, blendBitmapData.rect, destPoint, ">", 0x444444, 0xFF00FF00, 0xFFFFFF, true);
blendBitmapData.colorTransform(blendBitmapData.rect, new ColorTransform(1, 1, 1, 1, 255, 0, 0, 0));
blendBitmapData.applyFilter(blendBitmapData, blendBitmapData.rect, destPoint, new BlurFilter(16, 16, 3));
blendTexture = new BitmapTexture(blendBitmapData);
terrainMethod = new TerrainDiffuseMethod([new BitmapTexture(new Grass().bitmapData), new BitmapTexture(new Rock().bitmapData), new BitmapTexture(new BitmapData(512, 512, false, 0x000000))], blendTexture, [1, 20, 20, 1]);
//create terrain material
terrainMaterial = new TextureMaterial(new BitmapTexture(heightMapData));
terrainMaterial.diffuseMethod = terrainMethod;
terrainMaterial.addMethod(new FogMethod(0, 200000, 0x000000)); //TODO: global fog method affects splats when updated
terrainMaterial.lightPicker = lightPicker;
}