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");
编译后,没有任何图形出现,怎么回事呢?
第一個想法是,我在相對路徑下有圖檔:[Embed(source="../assets/IMG_1054.JPG")]
第二個想法是,我當初用的 PV3D 版本比較舊,相同的程式碼,在現行版本的 PV3D 中不見得能 run 得很順利!
請問邦邦大大
[Embed(source="../assets/IMG_1054.JPG")]
這一段語法中是把圖檔放在哪裡呢來匯入呢?是在assets這個資料夾裡嗎?前面的..是指在哪一層呢?
../ 表示 [ 上層 ],這跟做網頁或是其它檔案系統的作法都是雷同的,不難理解吧。
比較需要理解的是,這段語法,是 [ 編譯階段 ] 的 embed,意思是編譯時會將這個外部檔案給包進 swf 中,編譯成 swf 後,未來要放到正式網站時,就不用放這些額外的檔案了。這跟動態載入是不同的ㄛ!
張貼意見