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运行就可以了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值