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,休息一下~
- Dragon-Studio 之 Flash Alternativa 3D引擎 专题讲座-1. 玩转摄像机
- Dragon-Studio 之 Flash Alternativa 3D引擎 基础教程-1.C'est quoi ? Alternativa
- Dragon-Studio 之 Flash Alternativa 3D引擎 基础教程-2.Alternativa机理
- Dragon-Studio 之 Flash Alternativa 3D引擎 进阶教程-1.内置模型
- Dragon-Studio 之 Flash Alternativa 3D引擎 基础教程-3.打造基类
- Dragon-Studio 之 Flash Alternativa 3D引擎 基础教程-4.Bonjour Alt
- Dragon-Studio 之 Flash Alternativa 3D引擎 基础教程-5.本章小结与练习
- Dragon-Studio 之 Flash Alternativa 3D引擎 进阶教程-2.表面材质(1)
- Alternativa 3D 7 免费
- Adobe Flex + Adobe Air 3 + Alternativa 3D = 桌面3D引擎
- Flash 3D引擎(Sandy3D)应用指南 3——使用摄像机。
- 业界资讯:Alternativa 3D 7 免费
- Flash 3d引擎分享
- Flash 3D引擎全集
- Flash 3D引擎对比
- Flash 3D引擎收集
- Flash 3D引擎全集
- Flash 3D引擎(Sandy3D)应用指南 3a——摄像机调焦和调整屏幕尺寸。
- Dragon-Studio 之 Flash Alternativa 3D引擎 进阶教程-1.内置模型
- Dragon-Studio 之 Flash Alternativa 3D引擎 进阶教程-2.表面材质(1)
- 汇编临时小结2
- 无光驱,硬盘安装XP完整原版
- 删除无法删除的文件
- Dragon-Studio 之 Flash Alternativa 3D引擎 专题讲座-1. 玩转摄像机
- J-Link GDBServer默认字节序是Big Endian
- java中判断目录是否存在
- 加盟 XEIM 开源即时通讯软件团队
- “局域网聊天”用户数量的不断增长
- XP仿Windows7主题包 不占内存的。
- 怎样追MM
- 1指令--apt-get命令参数介绍
- flash应用:T-shirt制作