初步研究FLASH 3D引擎。做的一个很简单的效果,学习了3D引擎的基本概念、贴图、交互精确到面。代码如下:
package {
import flash.display.Bitmap;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import org.papervision3d.core.utils.InteractiveSceneManager;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.view.BasicView
[SWF(width="980", height="300", frameRate="24", backgroundColor="#999999")]
public class HomeObject extends BasicView
{
private static const ORBITAL_RADIUS:Number = 200;
private var theta:Number = 0;
//立方体
private var _cube:Cube
//交互管理
private var _interactiveSceneManager:InteractiveSceneManager;
//是否旋转开关
private var isXuanzhuan:Boolean = true;
//绑定贴图文件
[Embed(source="src/1.jpg")] private var MyTextureImage1:Class;
[Embed(source="src/2.jpg")] private var MyTextureImage2:Class;
[Embed(source="src/3.jpg")] private var MyTextureImage3:Class;
[Embed(source="src/4.jpg")] private var MyTextureImage4:Class;
private var MyTextureImage:Class;
private var bitmap1:Bitmap = new MyTextureImage1();
private var bitmap2:Bitmap = new MyTextureImage2();
private var bitmap3:Bitmap = new MyTextureImage3();
private var bitmap4:Bitmap = new MyTextureImage4();
public function HomeObject()
{
//实例一个VIEWPORT
super(0, 0, true, true);
// set up the stage
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
//初始摄像机
init3D();
//建立场景
createScene();
//开始渲染场景
startRendering();
}
private function init3D():void {
// position the camera
camera.x = -200;
camera.y = 150;
camera.z = -400;
_interactiveSceneManager = new InteractiveSceneManager(this.viewport)
_interactiveSceneManager.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, clickHandle);
}
private function createScene():void
{
//定义材质
var bitmapMaterial11:BitmapMaterial = new BitmapMaterial(bitmap1.bitmapData, true);
var bitmapMaterial12:BitmapMaterial = new BitmapMaterial(bitmap2.bitmapData, true);
var bitmapMaterial13:BitmapMaterial = new BitmapMaterial(bitmap3.bitmapData, true);
var bitmapMaterial14:BitmapMaterial = new BitmapMaterial(bitmap4.bitmapData, true);
//设置材质是否可以交互
bitmapMaterial11.interactive = bitmapMaterial12.interactive = bitmapMaterial13.interactive = bitmapMaterial14.interactive = true
//平滑材质
bitmapMaterial11.smooth = bitmapMaterial12.smooth = bitmapMaterial13.smooth = bitmapMaterial14.smooth = true
//定义每个面的name
bitmapMaterial11.name = "1"
bitmapMaterial12.name = "2"
bitmapMaterial13.name = "3"
bitmapMaterial14.name = "4"
//6个面的材质
var materiallist:MaterialsList = new MaterialsList();
materiallist.addMaterial(bitmapMaterial11,"top");
materiallist.addMaterial(bitmapMaterial11,"bottom");
materiallist.addMaterial(bitmapMaterial12,"front");
materiallist.addMaterial(bitmapMaterial14,"back");
materiallist.addMaterial(bitmapMaterial11,"left");
materiallist.addMaterial(bitmapMaterial13,"right");
//立方体
_cube = new Cube(materiallist,150,150,150,10,10,10,0,0)
scene.addChild(_cube)
_cube.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, stopMove)
_cube.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, startMove)
}
override protected function onRenderTick(event:Event=null):void
{
//选中立方体
if(isXuanzhuan)
{
_cube.yaw(-3)
//渲染
super.onRenderTick(event);
//立体旋转
theta += 3;
var x:Number = - Math.cos(theta * Math.PI / 180) * ORBITAL_RADIUS;
var z:Number = Math.sin(theta * Math.PI / 180) * ORBITAL_RADIUS;
_cube.x = x;
_cube.z = z;
}
}
private function stopMove(e:InteractiveScene3DEvent):void
{
isXuanzhuan = false
}
private function startMove(e:InteractiveScene3DEvent):void
{
isXuanzhuan = true
}
private function clickHandle(e:InteractiveScene3DEvent):void
{
switch(e.face3d.material.name)
{
case "1":
trace("第一张图片");
break;
case "2":
trace("第二张图片");
break;
case "3":
trace("第三张图片");
break;
case "4":
trace("第四张图片");
break;
}
}
}
}
评论(2) 阅读(3,373)

[...] 刚骂完三星,还给他们做了个东西,没办法,工作内容。这是个3D魔方的挂件,使用了PV3D,之前的文章里有这个的基本源码,当然有改动。APP地址:http://apps.51.com/s8000c [...]
Pingback by 3D魔方 | 土豆的大地 — 2009年9月24日 @ 09:48
学习学习
评论 by BestDong — 2009年9月27日 @ 22:10