Flash制作3D類動畫的教程
繼續(xù)上次的學(xué)習(xí),接下來要試試攝像機(jī)的移動了。
這里需要涉及幾個概念,攝像機(jī)的坐標(biāo)(x, y, z)和視覺角度(LookAt)
攝像機(jī)的位置可以使用(x, y, z)來定位;
視覺角度可以定義如何通過窗口來看場景。
lookAt(p_nX:Number, p_nY:Number, p_nZ:Number)
如:lookAt(0,0,0);//可以理解為通過攝像機(jī)的位置看場景。
攝像機(jī)的移動方式比較有意思,如果直接修改x、y、z坐標(biāo),視覺效果會與現(xiàn)實(shí)看到的情況相同;
而tilt、pan則是與場景平行移動;
roll是以z軸移動,通過攝像機(jī)視野看上去是攝像機(jī)的旋轉(zhuǎn)效果。
額外說一下 Line3D 是在場景中繪制了線段,這里用做參考線,代碼不難理解我就不過多解釋了。
代碼如下:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.ui.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.net.URLRequest;
import sandy.core.Scene3D;
import sandy.core.scenegraph.*;
import sandy.primitive.*;
import sandy.materials.*;
import sandy.materials.attributes.*;
import sandy.core.data.*;
/**
* ...
* @author ever5u
*/
public class fuxi extends Sprite
{
private var scene:Scene3D;
private var camera:Camera3D;
public function fuxi() {
//創(chuàng)建一個攝像機(jī)
camera = new Camera3D(300, 300);
camera.x = 100;
camera.y = 100;
camera.z = -300;
camera.lookAt(0,0,0);
//創(chuàng)建一個 Group
var root:Group = createScene();
//創(chuàng)建場景
scene = new Scene3D( "scene", this, camera, root );
//創(chuàng)建實(shí)時偵聽
addEventListener( Event.ENTER_FRAME, enterFrameHandler );
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
}
var box = new Box("box", 100, 100, 100);
var Plane:Plane3D;
public function createScene() {
var g:Group = new Group();
//在場景畫一個坐標(biāo)定位點(diǎn)
Plane = new Plane3D("Texture", 300, 300);
var myXLine:Line3D = new Line3D( "x-coord", new Point3D( -20, 0, 0), new Point3D( 20, 0, 0 ));
var myYLine:Line3D = new Line3D( "y-coord", new Point3D(0, -20, 0), new Point3D( 0, 20, 0 ));
var myZLine:Line3D = new Line3D( "z-coord", new Point3D(0, 0, -20), new Point3D( 0, 0, 20 ));
g.addChild(myXLine);
g.addChild(myYLine);
g.addChild(myZLine);
g.addChild( box );
return g;
}
public function enterFrameHandler(_evt:Event) {
box.rotateX = mouseX;
box.rotateY = mouseY;
scene.render();
}
public function keyPressed(_evt:KeyboardEvent):void {
switch(_evt.keyCode) {
case Keyboard.UP:
camera.tilt += 2;
//camera.y -= 2;
break;
case Keyboard.DOWN:
camera.tilt -= 2;
//camera.y += 2;
break;
case Keyboard.RIGHT:
camera.pan -= 2;
//camera.x += 2;
break;
case Keyboard.LEFT:
camera.pan += 2;
//camera.x -= 2;
break;
case Keyboard.CONTROL:
camera.roll += 2;
break;
case Keyboard.PAGE_DOWN:
camera.z -= 5;
break;
case Keyboard.PAGE_UP:
camera.z += 5;
break;
}
}
}
}
效果:
還有場景自適應(yīng)的問題,需要說明一下。
攝像機(jī)的鏡頭可視角度使用 fov(vertical field of view angle)來定義。

換算公式:
var fl:Numer = (viewport.height / 2) / Math.tan (camera.fov / 2 * (Math.PI / 180));
代碼:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.ui.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import sandy.core.Scene3D;
import sandy.core.scenegraph.*;
import sandy.primitive.*;
import sandy.materials.*;
import sandy.materials.attributes.*;
import sandy.core.data.*;
/**
* ...
* @author ever5u
*/
public class fuxi extends Sprite
{
private var scene:Scene3D;
private var camera:Camera3D;
public function fuxi() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
//創(chuàng)建一個攝像機(jī)
camera = new Camera3D(300, 300);
camera.x = 100;
camera.y = 100;
camera.z = -300;
camera.lookAt(0,0,0);
//創(chuàng)建一個 Group
var root:Group = createScene();
//創(chuàng)建場景
scene = new Scene3D( "scene", this, camera, root );
//創(chuàng)建實(shí)時偵聽
addEventListener( Event.ENTER_FRAME, enterFrameHandler );
stage.addEventListener (Event.RESIZE, onResize);
}
var box = new Box("box", 100, 100, 100);
var Plane:Plane3D;
public function createScene() {
var g:Group = new Group();
//在場景畫一個坐標(biāo)定位點(diǎn)
Plane = new Plane3D("Texture", 300, 300);
var myXLine:Line3D = new Line3D( "x-coord", new Point3D( -20, 0, 0), new Point3D( 20, 0, 0 ));
var myYLine:Line3D = new Line3D( "y-coord", new Point3D(0, -20, 0), new Point3D( 0, 20, 0 ));
var myZLine:Line3D = new Line3D( "z-coord", new Point3D(0, 0, -20), new Point3D( 0, 0, 20 ));
g.addChild(myXLine);
g.addChild(myYLine);
g.addChild(myZLine);
g.addChild( box );
return g;
}
public function enterFrameHandler(_evt:Event) {
box.rotateX = mouseX;
box.rotateY = mouseY;
scene.render();
}
function onResize (e:Event):void{
// 獲取場景寬高
var w:Number = stage.stageWidth;
var h:Number = stage.stageHeight;
// 設(shè)置視野寬高
scene.camera.viewport.width = w;
scene.camera.viewport.height = h;
// 獲取物體box與攝像機(jī)間的距離
var d:Number = box.getPosition ("camera").getNorm ();
// 保持?jǐn)z像機(jī)觀看比例
scene.camera.fov = 2 * Math.atan2 (h / 2, d) * (180 / Math.PI);
// 執(zhí)行渲染
scene.render();
}
}
}
效果:
相關(guān)文章

flash如何制作形狀補(bǔ)間動畫?flash創(chuàng)建補(bǔ)間形狀技巧
flash一款功能強(qiáng)大的動畫制作軟件,制作動畫很非常的方便,但動畫過程使用的都是形狀補(bǔ)間功能。今天小編就來給大家介紹一下flash形狀補(bǔ)間動畫制作方法,感興趣的快來看看吧2022-05-11
flash cs6怎么做花朵成長的逐幀動畫?flash中想要繪制一個花開的動畫,該怎么畫出各個圖形然后做逐幀動畫呢?下面我們就來看看詳細(xì)的教程,需要的朋友可以參考下2021-03-09
Flash怎么將動畫復(fù)制為ActionScript3.0并使用?
Flash怎么將動畫復(fù)制為ActionScript3.0并使用?Flash中制作的動畫想要直接粘貼到另一個對象中,我們可以使用復(fù)制腳本代碼的方式復(fù)制動畫,下面我們就來看看詳細(xì)的教程,需2017-12-08
flash怎么制作漫畫人物行走的動畫?flash中想要制作一段行走的動畫,該怎么設(shè)計呢?下面我們就來看看詳細(xì)的教程,很簡單,需要的朋友可以參考下2017-04-18- 這篇教程是向腳本之家的朋友分享flash逐幀動畫制作全過程,教程非?;A(chǔ),很適合新手來學(xué)習(xí),推薦過來,有興趣的朋友可以過來學(xué)習(xí)2016-01-15
- 下面小編就為大家介紹利用Flash正確的口型吻合動畫技巧,教程很不錯,非常適合新手來學(xué)習(xí),推薦到腳本之家,喜歡的朋友一起來學(xué)習(xí)吧2015-01-15
- 這篇教程是向腳本之家的朋友介紹Flash動畫制作技巧:圖形元件相關(guān)知識,教程很基礎(chǔ),但很實(shí)用,推薦到腳本之家,喜歡的朋友可以過來學(xué)習(xí)一下,希望能對大家有所幫助2015-01-05
Flash動畫制作小黑人經(jīng)典動畫效果技巧介紹(圖文)
本教程是向大家介紹Flash動畫制作小黑人經(jīng)典動畫效果技巧,教程很經(jīng)典,介紹的非常詳細(xì),相信對學(xué)習(xí)Flash朋友有一定的幫助。轉(zhuǎn)發(fā)過來,希望對大家有所幫助2014-08-05- 本教程是向大家介紹利用Flash制作旋轉(zhuǎn)的3D立體盒動畫教程,制作出來的效果非常好看,教程介紹的很詳細(xì),希望大家通過本篇教程能學(xué)習(xí)Flash制作3D動畫的方法,這樣以后就可以2014-07-22
- 本教程向大家介紹了Flash cs3制作人物行走動畫技巧,并做了詳細(xì)的介紹,覺得教程很不錯,轉(zhuǎn)發(fā)過來,希望給朋友們帶來幫助2014-07-15




