2007年6月13日星期三

Papervision3D 教學 part 2.2 -- 空照 與滑鼠互動

繼續上一篇的 Camera 操控,這次加上滑鼠,左右移動可以控制 camera 繞著圓心做旋轉,然後滾輪的部份,我會用來同時改變 carema 的高度以及繞圓心旋轉的半徑,程式碼如下:


package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.events.*;

import org.papervision3d.cameras.Camera3D;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.objects.*
import org.papervision3d.materials.*

[SWF(backgroundColor="#000000", frameRate="60", width="400", height="400")]

public class T2step3 extends Sprite
{
private static var PI:Number = Math.PI;
private static var TH:Number = PI / 180;

[Embed(source="../assets/IMG_1054.JPG")]
private var CubeTexture:Class;

private var container:Sprite;
private var scene:Scene3D;
private var camera:Camera3D;
private var rootNode:DisplayObject3D;

private var du:Number = 0;

private var movingRadius:int = 2000;
private var movingHeight:int = 2000;

public function T2step3()
{
// initialize the objects
init3D();

// add a listener for the 3D loop
addEventListener(Event.ENTER_FRAME, loop3D);
addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);
}

private function init3D():void{

container = new Sprite();
addChild(container);

container.x = 200;
container.y = 200;

scene = new Scene3D(container);

camera = new Camera3D();
camera.y = movingHeight;
camera.z = -movingRadius;
camera.zoom = 10;
camera.focus = 100;

rootNode = scene.addChild(new DisplayObject3D("rootNode"));

var ground:DisplayObject3D = rootNode.addChild(new Plane(new ColorMaterial(0xffcc00), 500, 500, 10, 10), "ground");
ground.rotationX = -90;

var cubeTexture:Bitmap = new CubeTexture() as Bitmap;
var myCube1:DisplayObject3D = rootNode.addChild(new Cube(new BitmapMaterial(cubeTexture.bitmapData), 100, 100, 100, 1, 1, 1), "myCube1");
myCube1.y = 50;
}

private function loop3D(event:Event):void{

/*
du++;
if(du==360)du=0;
*/

du = 360 * (this.mouseX / stage.stageWidth);

var newX:Number = movingRadius * formatNum(Math.cos(du*TH), 3);
var newY:Number = movingHeight;
var newZ:Number = movingRadius * formatNum(Math.sin(du*TH), 3);

camera.x = newX;
camera.y = newY;
camera.z = newZ;

scene.renderCamera(camera);
}

private function formatNum(num:Number, cnt:Number):Number{
return Math.round(num * Math.pow(10, cnt)) / Math.pow(10, cnt);
}

private function onMouseWheel(event:MouseEvent):void{

//event.delta = 3 | -3

movingRadius -= event.delta*10;
if(movingRadius<=0)movingRadius=1;

movingHeight -= event.delta*10;
if(movingHeight<=200)movingHeight=200;
}
}
}


看效果!

6 意見:

匿名 提到...

邦邦大為什麼幫家啊?
這樣要搜尋舊的文章時要開兩個網頁耶。
我的最愛已經一堆網站了~
這裡有比較好用嗎?

邦邦 提到...

為了 [ 體驗 ]!

從一開始就是使用 hinet xuite,也只深入認識過 hinet xuite,只熟悉 hinet xuite,這會使我對於 blog 或 blogger 的了解有可能也局限於 hinet xuite,所以,藉由自己的搬家,可以再去熟悉更東的東西,也可以更對這整個生態有更多的體認!

搬家是很累的,別的朋友搬家只要花幾個小時剪貼一些文章即可,我卻不行,因為我的文章太多了,而且有大量的 Flash Demo 檔案,所以不可能將舊有的東西整個搬過來,所以這裡將會是重新開始。

匿名 提到...

提问:
您提供的例子,在我这里每个这个地方都显示有错误:类型值的隐式强制指令的目标是非相关类型
var myCube1:DisplayObject3D = rootNode.addChild(new Cube(new BitmapMaterial(cubeTexture.bitmapData), 100, 100, 100, 1, 1, 1), "myCube1");

编译后,没有任何图形出现,怎么回事呢?

Ben Chang 提到...

第一個想法是,我在相對路徑下有圖檔:[Embed(source="../assets/IMG_1054.JPG")]

第二個想法是,我當初用的 PV3D 版本比較舊,相同的程式碼,在現行版本的 PV3D 中不見得能 run 得很順利!

fJish 提到...

請問邦邦大大
[Embed(source="../assets/IMG_1054.JPG")]
這一段語法中是把圖檔放在哪裡呢來匯入呢?是在assets這個資料夾裡嗎?前面的..是指在哪一層呢?

Ben Chang 提到...

../ 表示 [ 上層 ],這跟做網頁或是其它檔案系統的作法都是雷同的,不難理解吧。

比較需要理解的是,這段語法,是 [ 編譯階段 ] 的 embed,意思是編譯時會將這個外部檔案給包進 swf 中,編譯成 swf 後,未來要放到正式網站時,就不用放這些額外的檔案了。這跟動態載入是不同的ㄛ!

關於我






* ben {dot} chang {at} ben {dot} idv {dot} tw
* FriendFeed

贊助我1元美金:

Plurk

標籤雲