`

alternativa3d7.7 实现相机追尾,紧跟模型后边

阅读更多
方法一:
package 
{
	import alternativa.engine3d.controllers.SimpleObjectController;
	import alternativa.engine3d.core.Camera3D;
	import alternativa.engine3d.core.Object3DContainer;
	import alternativa.engine3d.core.View;
	import alternativa.engine3d.materials.FillMaterial;
	import alternativa.engine3d.primitives.Box;
	import alternativa.engine3d.primitives.Plane;
	
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.ui.Keyboard;

	public class TestCameraController extends Sprite
	{
		private var rootContainer:Object3DContainer = new Object3DContainer();
		private var view:View;
		private var camera:Camera3D;
		private var box:Box;
		private var nextX:Number = 0;
		private var nextY:Number = 0;
		private static const speed:uint  = 10;
		private static const RADIAN:Number = Math.PI/180;
		private var currenRadian:Number = 90*RADIAN;
		private var cameraController:CameraControllerAlternativa3d7;
		
		public function TestCameraController()
		{
			if (this.stage)
				this.init();
			else
				this.addEventListener(Event.ADDED_TO_STAGE, init);
			this.stage.addEventListener(Event.ENTER_FRAME, onRenderTick);
			this.stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
			this.stage.addEventListener(KeyboardEvent.KEY_UP,keyUp);
			this.stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
		}
		
		private function init(e:Event=null):void
		{
			this.removeEventListener(Event.ADDED_TO_STAGE,init);
			this.stage.align = StageAlign.TOP_LEFT;
			this.stage.scaleMode = StageScaleMode.NO_SCALE;
			this.view = new View(this.stage.width,this.stage.height);
			this.camera  =  new Camera3D();
			this.camera.y = -300;
			this.camera.z = 100;
			this.camera.rotationX = -100*RADIAN;
			this.camera.view = view;
			this.addChild(camera.view);
			this.addChild(camera.diagram);
			this.rootContainer.addChild(camera);
			
			//plane
			var materialPlane:FillMaterial = new FillMaterial(0x598FBB, 1, 1);
			var plane:Plane = new Plane(4000,4000,10,10);
			plane.setMaterialToAllFaces(materialPlane);
			this.rootContainer.addChild(plane);
			//box
			var materialBox:FillMaterial = new FillMaterial(0x0000FF, 1, 1);
			box = new Box(50,100,25);
			box.setMaterialToAllFaces(materialBox);
			this.rootContainer.addChild(box);
			
//			cameraController = new CameraControllerAlternativa3d7(this.stage,box,10,5);
//			cameraController.bindKey(Keyboard.RIGHT,  SimpleObjectController.ACTION_YAW_LEFT);
//			cameraController.bindKey(Keyboard.LEFT,  SimpleObjectController.ACTION_YAW_RIGHT);
//			cameraController.mouseSensitivity = 0;
		}
		
		private function keyDown(e:KeyboardEvent):void{
			
			switch(e.keyCode)
			{
				case "W".charCodeAt():
				case Keyboard.UP:
					nextX = this.box.x +  speed * Math.cos(this.currenRadian);
					nextY = this.box.y +  speed * Math.sin(this.currenRadian);
					break;
				
				case "S".charCodeAt():
				case Keyboard.DOWN:
					nextX = this.box.x -  speed * Math.cos(this.currenRadian);
					nextY = this.box.y -  speed * Math.sin(this.currenRadian);
					break;
				
				case "A".charCodeAt():
				case Keyboard.LEFT://逆时钟为负
					//box.rotationZ += RADIAN;
					box.rotationZ += RADIAN;
					this.currenRadian += RADIAN;
					if(this.box.rotationZ > 360*RADIAN) box.rotationZ = 360*RADIAN - box.rotationZ;
					//camera
					//this.camera.rotationZ += RADIAN;
					//if(this.camera.rotationZ > 360*RADIAN) this.camera.rotationZ = 360*RADIAN - this.camera.rotationZ;
					break;
				
				case "D".charCodeAt():
				case Keyboard.RIGHT://顺时钟为正
					//box.rotationZ  -= RADIAN;
					box.rotationZ -= RADIAN;
					this.currenRadian -= RADIAN;
					if(box.rotationZ > 360*RADIAN) box.rotationZ = 360*RADIAN + box.rotationZ;
					//camera
					//this.camera.rotationZ -= RADIAN;
					//if(this.camera.rotationZ > 360*RADIAN) this.camera.rotationZ = 360*RADIAN + this.camera.rotationZ;
					break;
				
			}
			
		}
		
		private function keyUp(e:KeyboardEvent):void{
			
			switch(e.keyCode)
			{
				case "W".charCodeAt():
				case Keyboard.UP:
					
					break;
				
				case "S".charCodeAt():
				case Keyboard.DOWN:
					
					break;
				
				case "A".charCodeAt():
				case Keyboard.LEFT:
					
					break;
				
				case "D".charCodeAt():
				case Keyboard.RIGHT:
					
					break;
				
			}
			
		}
		
		
		private function mouseMove(evt:MouseEvent):void
		{
			
		}
		
		private function onRenderTick(e:Event=null):void
		{
			this.cameraUpdate();
			this.boxUpdate();
			//this.cameraController.update();
		}
		
		private function cameraUpdate():void
		{
			this.camera.view.width = this.stage.stageWidth;
			this.camera.view.height = this.stage.stageHeight;
			this.camera.render();
			//追尾
			this.camera.rotationZ = this.box.rotationZ;
			this.camera.x = this.box.x - 300 * Math.sin(this.box.rotationZ + 180 * Math.PI / 180);
			this.camera.y = this.box.y + 300 * Math.cos(this.box.rotationZ + 180 * Math.PI / 180);
			//this.camera.z = 100;
		}
		
		private function boxUpdate():void
		{
			box.x = this.nextX;
			box.y = this.nextY;
		}
	}
	
}


方法二:用容器把模型和相机绑定起来
   package
    {
	import alternativa.engine3d.core.Camera3D;
	import alternativa.engine3d.core.Object3DContainer;
	import alternativa.engine3d.core.View;
	import alternativa.engine3d.materials.FillMaterial;
	import alternativa.engine3d.primitives.Box;
	import alternativa.engine3d.primitives.Plane;
	
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.ui.Keyboard;

	public class BoxCameraController extends Sprite
	{
		private var rootContainer:Object3DContainer = new Object3DContainer();
		private var boxCameraContainer:Object3DContainer = new Object3DContainer();
		private var view:View;
		private var camera:Camera3D;
		private var box:Box;
		private var nextX:Number = 0;
		private var nextY:Number = 0;
		private static const speed:uint  = 10;
		private static const RADIAN:Number = Math.PI/180;
		private var currenRadian:Number = 90*RADIAN;
		
		public function BoxCameraController()
		{
			
			if (this.stage)
				this.init();
			else
				this.addEventListener(Event.ADDED_TO_STAGE, init);
			this.stage.addEventListener(Event.ENTER_FRAME, onRenderTick);
			this.stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
		}
		
		private function init(e:Event = null):void
		{
			
			this.removeEventListener(Event.ADDED_TO_STAGE,init);
			this.stage.align = StageAlign.TOP_LEFT;
			this.stage.scaleMode = StageScaleMode.NO_SCALE;
			this.view = new View(this.stage.width,this.stage.height);
			this.camera  =  new Camera3D();
			this.camera.y = -250;
			this.camera.z = 100;
			this.camera.rotationX = -100*RADIAN;
			this.camera.view = view;
			this.addChild(camera.view);
			this.addChild(camera.diagram);
			this.boxCameraContainer.addChild(camera);
			
			//plane
			var materialPlane:FillMaterial = new FillMaterial(0x598FBB, 1, 1);
			var plane:Plane = new Plane(4000,4000,10,10);
			plane.setMaterialToAllFaces(materialPlane);
			this.rootContainer.addChild(plane);
			//box
			var materialBox:FillMaterial = new FillMaterial(0x0000FF, 1, 1);
			box = new Box(50,100,25);
			//box.z = 200;
			box.setMaterialToAllFaces(materialBox);
			this.boxCameraContainer.addChild(box);
			this.rootContainer.addChild(this.boxCameraContainer);
		}
		
		private function keyDown(e:KeyboardEvent):void{
			
			switch(e.keyCode)
			{
				case "W".charCodeAt():
				case Keyboard.UP:
					nextX = this.boxCameraContainer.x +  speed * Math.cos(this.currenRadian);
					nextY = this.boxCameraContainer.y +  speed * Math.sin(this.currenRadian);
					break;
				
				case "S".charCodeAt():
				case Keyboard.DOWN:
					nextX = this.boxCameraContainer.x -  speed * Math.cos(this.currenRadian);
					nextY = this.boxCameraContainer.y -  speed * Math.sin(this.currenRadian);
					break;
				
				case "A".charCodeAt():
				case Keyboard.LEFT://逆时钟为负
					boxCameraContainer.rotationZ += RADIAN;
					this.currenRadian += RADIAN;
					if(this.boxCameraContainer.rotationZ > 360*RADIAN) boxCameraContainer.rotationZ = 360*RADIAN - boxCameraContainer.rotationZ;
					break;
				
				case "D".charCodeAt():
				case Keyboard.RIGHT://顺时钟为正
					boxCameraContainer.rotationZ -= RADIAN;
					this.currenRadian -= RADIAN;
					if(boxCameraContainer.rotationZ > 360*RADIAN) boxCameraContainer.rotationZ = 360*RADIAN + boxCameraContainer.rotationZ;
					break;
			}
			
		}
		
		private function onRenderTick(e:Event):void
		{
			this.camera.view.width = this.stage.stageWidth;
			this.camera.view.height = this.stage.stageHeight;
			camera.render();
			boxCameraContainer.x = this.nextX;
			boxCameraContainer.y = this.nextY;
		}
		
	}
}
分享到:
评论

相关推荐

    Alternativa3D7.5 动画

    在这一主题中,我们主要探讨如何利用Alternativa3D 7.5加载和播放dae格式的模型文件,以及如何结合源代码实现3D动画的交互效果。首先,理解dae文件结构和内容至关重要,这包括顶点数据、纹理坐标、骨骼绑定信息等。 ...

    Alternativa3D实现红蓝立体代码

    在本文中,我们将深入探讨如何使用Alternativa3D来实现红蓝立体效果,并通过具体的代码示例进行讲解。 首先,理解红蓝立体的原理是至关重要的。红蓝立体效果基于颜色分层的立体成像技术,左眼看到红色图像,右眼...

    Alternativa3D_7.5.0

    Alternativa3D是一款源自俄罗斯的高级3D游戏和交互式应用程序开发引擎,专注于为Flash平台提供服务。这个“Alternativa3D_7.5.0”版本是该引擎的一个重要更新,代表了开发者们在技术上的不断进步和优化。值得注意的...

    Alternativa3D教程源码API

    Alternativa3D是一款强大的3D游戏开发框架,它允许开发者创建具有高级图形效果的互动3D应用程序和游戏,而无需深入学习复杂的底层图形编程。这个压缩包文件包含了一系列与Alternativa3D相关的教程和API文档,是学习...

    Alternativa3D

    6. **资源管理**:Alternativa3D具有良好的资源管理机制,可以处理模型、纹理、音频和其他3D元素的加载和优化,确保性能高效。 7. **示例与文档**:在提供的压缩包中,有`Alternativa3DExamples`目录,包含了一系列...

    Alternativa3D-master 8.32

    4. **物理引擎**:为了实现真实的物体运动和碰撞效果,Alternativa3D可能集成了一个物理引擎,如Box2D或Nape,用于模拟刚体动力学。 5. **音频支持**:对于游戏来说,声音效果同样重要。Alternativa3D 可能包含了对...

    Alternativa3D 8 graphics

    3. **易用的API**: Alternativa3D提供了直观的ActionScript接口,使得开发人员可以轻松地创建、控制3D对象,并实现各种交互效果。 4. **物理引擎集成**:通过集成第三方物理引擎,如Box2D或Bullet,可以实现真实的...

    flash 3d插件alternativa3d 5.6.0

    这就催生了像Alternativa3D这样的插件,它们通过扩展Flash Player的功能,使得开发者能够在Flash环境中创建和展示复杂的3D模型和场景。 Alternativa3D 5.6.0的核心特性包括: 1. **高性能渲染**:利用优化的算法和...

    Alternativa3d 8.32

    Alternativa3D 8.32 是一个备受赞誉的Flash 3D引擎,它为开发者提供了在Adobe Flash环境中创建互动式、高性能的3D图形和动画的能力。这款引擎以其高效和易用性著称,是许多开发者的首选工具,尤其对于那些希望在Web...

    max2011 to Alternativa3D_8

    本压缩包文件“max2011 to Alternativa3D_8”旨在帮助用户将3DS Max 2011中的3D模型和场景顺利导出到Alternativa3D_8环境中。这个过程涉及到两个关键环节:3DS Max的导出设置和Alternativa3D的导入配置。 首先,3DS...

    《创建 Alternativa3D 8 环境》中的示例代码

    Alternativa3D是一款强大的3D游戏开发框架,它允许开发者使用ActionScript 3.0来构建复杂的三维互动应用。在“创建Alternativa3D 8环境”这一主题中,我们聚焦于如何设置开发环境以及使用提供的示例代码来理解其工作...

    A3D教程_Alternativa3d_官方教程中文翻译.doc

    ### Alternativa3D官方教程知识点概述 #### 一、教程简介 本次教程的主题是“Hello Alternativa3D”,旨在帮助初学者快速入门Alternativa3D(简称A3D)的基本操作,通过创建一个简单的3D场景来理解A3D的核心概念和...

    Alternativa3D 5.6.0

    《 Alternativa3D 5.6.0:深入探索3D Flash引擎的奥秘》 在数字媒体领域,Flash曾是构建动态交互式内容的重要工具,而Alternativa3D则是其中一颗璀璨的明珠。这款基于ActionScript3.0的3D引擎,为开发者提供了在...

    alternativa3d--lights source

    本篇文章将深入探讨 Alternativa3D 中的灯光系统,解析其源码实现,并分享如何在实际项目中应用这些灯光技术。 一、Alternativa3D 灯光系统概述 A3D 的灯光系统允许开发者创建多种类型的光源,如点光源、方向光和...

    alternativa3d API

    - **用户输入处理**:Alternativa3D API能够捕捉用户的鼠标和键盘事件,使开发者可以实现与用户的交互操作,如点击、拖动和旋转3D物体。 - **物理引擎**:集成的物理引擎允许模拟真实世界的重力、碰撞检测和动力学...

    Alternativa3D_8.17.0_中文帮助文档

    Alternativa3D 8的到来意味着 Flash 真正踏入3D时代 。这就是Alternativa3D最新版本的中文帮助文档,非常实用。

    Alternativa3D资料

    《 Alternativa3D 资料详解:源码与工具的探索之旅》 Alternativa3D,一个强大的3D游戏开发框架,为开发者提供了一种高效且易用的方式来创建交互式三维应用程序。这个资料包涵盖了从源码到工具的全方位学习资源,...

    Alternativa3D 7.6 官方中文翻译api

    Alternativa3D 官方中文翻译api

    Alternativa3d Tutorials

    Alternativa3d官方教程翻译版本 Alternativa3d官方教程翻译版本

    【FLASH3D】开发引擎Alternativa3D_8.32.0

    1. **3D图形渲染**:Alternativa3D提供了强大的3D渲染引擎,能够处理复杂的3D模型、纹理和光照效果,使3D场景栩栩如生。 2. **交互性**:通过ActionScript 3.0编程接口,开发者可以直接控制3D对象的行为,实现丰富...

Global site tag (gtag.js) - Google Analytics