天天看點

PV3D地形生成 (PV3D Terrain)

原代碼在:http://www.cleoag.ru/labs/flex/paperterrain/srcview/

我修改了一點代碼讓它可以運作在PV3D v2.1上,但感覺效果不理想。請大家看看哪裡有問題。

效果圖見附件

代碼如下:

package

{

import com.adobe.viewsource.ViewSource;

import flash.display.*;

import flash.display.Sprite;

import flash.events.*;

import flash.geom.*;

import mx.core.BitmapAsset;

import org.papervision3d.cameras.CameraType;

import org.papervision3d.core.proto.CameraObject3D;

import org.papervision3d.materials.BitmapMaterial;

import org.papervision3d.objects.primitives.Plane;

import org.papervision3d.render.QuadrantRenderEngine;

import org.papervision3d.scenes.Scene3D;

import org.papervision3d.view.BasicView;

import org.papervision3d.view.Viewport3D;

public class TerrainAni extends Sprite

{

private var container : Sprite;

public var view3D : BasicView;

public var camera : CameraObject3D;

public var scene : Scene3D;

public var viewport : Viewport3D;

private var terrain3D : Plane;

private var textureBitmap : BitmapData;

private var heightMap : BitmapData;

private var paletteArray : Array = new Array();

[Embed(source="images/earthGrad.png")]

// [Embed(source="images/marsGrad.jpg")]

private var GradBmp:Class;

public function TerrainAni()

{

//view3D = new BasicView();

view3D = new BasicView(512,512,false,true,CameraType.FREE);//TARGET);

scene = view3D.scene;

camera = view3D.camera;

//TODO 為啥會有破面現象

//view3D.renderer = new QuadrantRenderEngine(QuadrantRenderEngine.QUAD_SPLIT_FILTER);// .CORRECT_Z_FILTER);// . ALL_FILTERS);

viewport = view3D.viewport;

viewport.opaqueBackground = 0x000000;

stage.quality = "MEDIUM";

stage.scaleMode = "noScale";

stage.align="TL";

init3D();

addChild(view3D);

}

private function init3D():void

{

// Create camera

camera.x = 0;

camera.z = -600;

camera.y = 100;

camera.zoom = 10;

camera.focus = 100;

// create heighMaps

var heightMapWidth:Number = 1024;

heightMap = new BitmapData(heightMapWidth,heightMapWidth,false,0);

textureBitmap = heightMap.clone();

var grad:BitmapAsset = BitmapAsset(new GradBmp());

for (var ra:uint = 0;ra<256;ra++)

{

paletteArray[ra] = grad.bitmapData.getPixel(10, 256-ra);

}

// create textures

var textureMaterial:BitmapMaterial = new BitmapMaterial(textureBitmap);

textureMaterial.doubleSided = true;//false;這個設定為true可以消除破面問題

textureMaterial.lineAlpha = 0.1; //如果執行這句可以顯示出面的邊線,友善檢視

// create terrain

terrain3D = new Plane(textureMaterial,512,512,128,128);//32,32);//

scene.addChild(terrain3D,"Terrain");

terrain3D.rotationX = -90;

generateTerrain();

camera.lookAt(terrain3D);

camera.moveBackward(500);

view3D.singleRender();

this.addEventListener(MouseEvent.MOUSE_DOWN, generateTerrain);

}

private function generateTerrain(e:Event = null):void

{

var nw:Number = heightMap.width/(1+Math.random()*5);

var nh:Number = heightMap.width/(1+Math.random()*5);

//heightMap.perlinNoise(nw,nh,2+Math.round(Math.random()*5),Math.random()*1000,false,(Math.random()>.5 ? true : false),4,false);

heightMap.perlinNoise(128,128,2+Math.round(Math.random()*5),Math.random()*1000,false,(Math.random()>.5 ? true : false),4,false);

textureBitmap.paletteMap(heightMap,heightMap.rect,new Point(), paletteArray,paletteArray,paletteArray);

var vertices :Array = terrain3D.geometry.vertices;

var gridX :Number = terrain3D.segmentsW;

var gridY :Number = terrain3D.segmentsH;

var vertexIndex :Number = 0;

var iW :Number = heightMap.width / gridX;

var iH :Number = heightMap.height / gridY;

for( var ix:int = 0; ix < gridX + 1; ix++ )

{

for( var iy:int = 0; iy < gridY+1; iy++ )

{

vertices[vertexIndex].z = -Math.min(255,Math.max(1,heightMap.getPixel(ix*iW,heightMap.height-iy*iH)))/1;

vertexIndex++;

}

}

}

}

}

在Flex建立一個ActionScript工程,直接按web app運作就可以了