2009
06.25.

初步研究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 条评论 立即发表评论

  1. [...] 刚骂完三星,还给他们做了个东西,没办法,工作内容。这是个3D魔方的挂件,使用了PV3D,之前的文章里有这个的基本源码,当然有改动。APP地址:http://apps.51.com/s8000c [...]

    Pingback by 3D魔方 | 土豆的大地 — 24 九 ’09 @ 09:48

  2. 学习学习

    评论 by BestDong — 27 九 ’09 @ 22:10

这篇文章上的评论的 RSS feed TrackBack URL

留下评论

页码: 1 of 11

©2009 All Rights Reserved. Powered by WordPress. Skin was designed by VDIT.com