Dragon-Studio 之 Flash Alternativa 3D引擎 专题讲座-1. 玩转摄像机

来源:互联网 发布:苹果某个app连不上网络 编辑:程序博客网 时间:2024/05/18 01:22

原文:http://www.bcia-bag.com/article/ZMTI4Njg=.html

 

*申明:教程中用到的3D引擎Alternativa均以非盈利教学为目的,不得用于任何商业用途。如要购买正版引擎请访问官网网站:http://alternativaplatform.com/en/

以往教程:http://www.zcool.com.cn/u/337114/zcooler_article.xhtml

—————————————————————————————————————————————————————————————————

        周末咯~有时间写教程咯~

        今天我们将作一个有趣的类似游戏的练习,大家这次可以好好练练手了~之前也学习了不少我的教程了,有必要来个综合性的例子。记得在起初的几篇教程中提到了一个“小孔观物”的例子,我说过,将来会做一个实例。现在,我们将超出“小孔观物”的局限,让这个小孔动起来,做一个“任意观察”的例子。这就是今天的专题讲座-玩转摄像机。

*在专题讲座中,一般会运用之前所学的例子,针对每一个特殊的课题进行综合性的实践。是学习和实践的大好机会啊~~大家可要抓紧啊~

课题:摄像机与视窗

目标:

        实现一个像拍电影一样的联系,一个人拿着摄像机在每个三维空间中拍摄录像,而这个空间的角落有个摄像机再拍他。现在要同时展示,这个人手中运动的摄像机拍的内容和角落里静止的摄像机拍的内容。

最终效果:

http://www.zcool.com.cn/work/ZMzI1MjEy.html    (运用鼠标改变方向,A,S,D,W移动)

分析:

        大家觉得怎么样?还不错吧,有游戏的感觉了吧~呵呵。先别急着往下看,不如自己想想要如何实现?

        很明显,现在有两个摄像机,一个静止的,一个运动的。也有两个视窗,一个是运动摄像机的,一个是静止摄像机的。另外还有一个矩形,用来模拟这个运动的摄像机。所以我们可以在场景中,放入两个摄像机,在舞台中放入两个视窗,分别经行绑定。另外添加一个摄像机控制器,来控制运动的摄像机。最后在要在实时渲染函数中,时刻绑定运动的摄像机和我们用来模拟的矩形的坐标。想到这些,我们的模型就建立的就差不多了。想到在基类中已经存在了一个摄像机,一个视窗和一个摄像机控制器,所以不妨直接用于做运动的摄像机,那么只要在文档类中建立静止的摄像机及其视窗,以及虚拟矩形就可以了。

        总结一下,我么所需要的:

静止的摄像机:摄像机,视窗——在文档类中新建

运动的摄像机:摄像机,视窗,摄像机控制器——在积累中以建

虚拟矩形:Box实例——在文档类中新建

一些三维物体:一些Primitives(关于Primitives请参见进阶教程-1.内置模型一章)的实例

解答:

        下面就是具体的代码

PlayCamera.as

package
{
 //导入必要类包
 import lib.AltBasse;
 import alternativa.engine3d.core.Camera3D;
 import alternativa.engine3d.display.View;
 import alternativa.engine3d.primitives.*;
 import alternativa.engine3d.materials.*;
 
 import flash.display.BlendMode;
 import flash.events.Event;
 import flash.display.Stage;
 import flash.display.StageAlign;
 import flash.display.StageScaleMode;
 import flash.display.StageQuality;
 
 //设置舞台参数
 [SWF(backgroundColor = "#000000",frameRate = "100",width = 800,height = 600)]
 
 public class PlayCamera extends AltBasse
 {
  private var cameraScene:Camera3D;
//不动的场景摄像机
  private var viewScene:View; //不动的场景视窗
  private var cameraBox:Box; //虚拟摄像机实体
  
  public function PlayCamera()
  {
   //设置舞台参数
   stage.scaleMode = StageScaleMode.NO_SCALE;
   stage.align = StageAlign.TOP_LEFT;
   stage.quality = StageQuality.HIGH;
   this.addEventListener(Event.ADDED_TO_STAGE, init);
   //初始化变量
   //设置舞台摄像机和舞台场景视窗
   this.cameraScene = new Camera3D();
   this.viewScene = new View();
   addChild(this.viewScene);
   this.viewScene.camera = this.cameraScene;
   //设置舞台摄像机的位置,并保持不变
   this.cameraScene.z = 200;
   this.cameraScene.y = -300;
   this.cameraScene.rotationX = -3*Math.PI/4;
   //初始换 虚拟的摄像机实体
   this.cameraBox = new Box(10,10,20,1,1,1);
   this.cameraBox.cloneMaterialToAllSurfaces(new FillMaterial(0xFFFFFF,1,BlendMode.NORMAL,1,0x000000));
   //设置镜头面为红色,便于分辨
   this.cameraBox.setMaterialToSurface(new FillMaterial(0xFF0000,1,BlendMode.NORMAL),this.cameraBox.getSurfaceById('top'));
   //调用父构造函数,以便初始化场景,运动的摄像机,摄像机控制器(控制运动的摄像机)和运动摄像机的视窗
   super();
   camera.y = -200;
   camera.rotationX = -Math.PI/2;
   //加入静止的摄像机及其虚拟实体
   scene.root.addChild(this.cameraScene);
   scene.root.addChild(this.cameraBox);
  }
  
  private function init(e:Event):void
  {
   //移除事件监听器
   removeEventListener(Event.ADDED_TO_STAGE, init);
   //设置一些三维对象,并加入到场景中
   var plane:Plane = new Plane(300,300,5,5);
   plane.z = -50;
   plane.cloneMaterialToAllSurfaces(new FillMaterial(0xAAAAAA,0.5,BlendMode.NORMAL,1,0xFFFFFF));
   var box = new Box(80,50,50,3,3,3);
   box.x = 50;
   box.y = 20;
   box.cloneMaterialToAllSurfaces(new FillMaterial(0x00FF00,1,BlendMode.NORMAL,1,0x000000));
   var cone = new Cone(50,50,20);
   cone.x = -50;
   cone.y = 80;
   cone.cloneMaterialToAllSurfaces(new FillMaterial(0x0000FF,1,BlendMode.NORMAL,1,0x000000));
   var sphere= new Sphere(50);
   sphere.x = -50;
   sphere.y = -50;
   sphere.cloneMaterialToAllSurfaces(new FillMaterial(0xFF0000,1,BlendMode.NORMAL,1,0x000000))
   scene.root.addChild(plane);
   scene.root.addChild(box);
   scene.root.addChild(cone);
   scene.root.addChild(sphere);
   
   //打开摄像机控制器(控制运动的摄像机)
   cameraController.controlsEnabled = true;
   //添加实时渲染的事件监听器
   stage.addEventListener(Event.ENTER_FRAME,OnEnterFrame);//舞台添加用于实时渲染的监听器
  }
  
  //重构 OnResize函数,设置每个摄像机视窗的大小与位置,并将虚拟的摄像机实体位置与运动的摄像机绑定,实现虚拟的目的
  override protected function OnResize(e:Event):void
  {
   view.width = stage.stageWidth/2;
   view.height = stage.stageHeight/2;
   this.viewScene.width = stage.stageWidth/2;
   this.viewScene.height = stage.stageHeight/2;
   this.viewScene.x = stage.stageWidth/2;
   this.viewScene.y = stage.stageHeight/2;
   this.cameraBox.coords = camera.coords;
   this.cameraBox.rotationX = camera.rotationX;
   this.cameraBox.rotationY= camera.rotationY;
   this.cameraBox.rotationZ = camera.rotationZ;
  }
  
  private function OnEnterFrame(e:Event):void
  {
   cameraController.processInput();
//开启鼠标控制器的输入模式
   this.OnResize(null); //时刻进行虚拟
   scene.calculate(); //实时进行场景的渲染计算
  }
 }
}

小结:

        经过这次讲座,我想大家对摄像机及视窗的认识会更深了一步,视窗就是指摄像机的视窗,视窗也必须绑定摄像机才有用。两者彼此对立,但有息息相关。视窗是要添加到舞台中的;而摄像机是要放在场景中的。摄像机没有了视窗,那这个摄像机就没用了,我们什么都看不到;视窗没有了摄像机,那么视窗只是一个黑屏,我们还是什么都看不到。

        到这里,这次讲座就结束了。大家是不是对A3D更有兴趣了?其实我们只用了很短的一些代码,就实现了一个不错的效果。所以我还是那句话,只有想不到的,没有做不到的。大家有什么新想法~也可以随时和我交流啊~~呵呵。OK,休息一下~

原创粉丝点击