`

flex/flash 3d基础-摄像机(Camera)的概念

阅读更多

http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
下面我们讨论一下Flex里面的相机和物体之间的相对运动。


物体的运动与相机的运动是现对的。我们可以让物体不动,而相机运动,产生的效果是一样的。
我们假设我们的角色名称为Joe。
我们让Joe是一个3d物体。还记得我们自己设定好的3d类吗。
Object3d.as
代码如下:
package hjh3dcom
{
	public class Object3d extends Object
	{
		private var _x3din:Number;
		private var _y3din:Number;
		private var _z3din:Number;
		
		public function Object3d()
		{
			super();
			init();
		}
		private function init():void{
			_x3din=0;
			_y3din=0;
			_z3din=0;
		}
        //----------------------------------------
		public function set x3d(x3din:Number):void
		{
			_x3din = x3din;	
		}
		public function get x3d():Number
		{
			return _x3din;	
		}
		//----------------------------------------
		public function set y3d(y3din:Number):void
		{
			_y3din = y3din;	
		}
		public function get y3d():Number
		{
			return _y3din;	
		}
		//----------------------------------------
		public function set z3d(z3din:Number):void
		{
			_z3din = z3din;	
		}
		public function get z3d():Number
		{
			return _z3din;	
		}
		
		
	}
}

那么我们定义Joe坐标为:
Joe.x3d = 0;
Joe.y3d = 0;
Joe.z3d = 0;
Joe.dir = 1;

代码如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:myCanvas3D="myCanvas3D.*" applicationComplete="init();">
	<mx:Script>
		<![CDATA[
			import hjh3dcom.Object3d;
			
			[Embed(source='assets/Figure.swf')]   
	        public var FG:Class;   
	        public var joe:MovieClip = new FG as MovieClip; 
	        
	        private var joe3d:Object3d;
	        private var FocalLength:Number;
	        private var dir:Number;
	        private var speed:Number;
	        private var scaleRatio:Number;
	        
			private function init():void{
				joe3d=new Object3d();
				joe3d.x3d=0;
				joe3d.y3d=0;
				joe3d.z3d=0;
				dir=1;
				FocalLength=300;
				speed=20;
				joe.x=250;
				joe.y=200;
				joe.scaleX=joe.scaleY=1;
				mycanvas.canvas.addChild(joe);
				this.addEventListener(Event.ENTER_FRAME,onenterframe);
			}
			private function come3dto2d():void{
				joe.x=joe3d.x3d*scaleRatio+250;
				joe.y=-joe3d.y3d*scaleRatio+200;
				joe.scaleX=joe.scaleY=1*scaleRatio;//需要注意的是贴图是靠Sprite物体的缩放实现的
			}
			private function onenterframe(evt:Event):void{
				movejoe3d();
				scaleRatio=FocalLength/(FocalLength+joe3d.z3d);
				come3dto2d();
			}
			private function movejoe3d():void{
				joe3d.z3d += speed*dir;
				if (joe3d.z3d > 500){
					joe3d.z3d = 500;
					dir = -1; // moving forward now
				}else if (joe3d.z3d < 0){
					joe3d.z3d = 0;
					dir = 1; // now moving back again
				}
			}
		]]>
	</mx:Script>
	<myCanvas3D:Canvas3D id="mycanvas" width="500" height="400" backgroundColor="0xFFFFFF"/>
</mx:Application>

我们设定了坐标的大小为:width="500" height="400"
所以,我们的中心点为(250,200),所以
				joe.x=joe3d.x3d*scaleRatio+250;
				joe.y=-joe3d.y3d*scaleRatio+200;

我们把物体移动到了中心画布的中心坐标。
我们用的基本方法为:
function init()//初始化
function come3dto2d()//从三维转换到二维
function onenterframe(evt:Event)//随着时间运动
function movejoe3d()//控制运动的函数

上面我们一直没有出现相机的概念,下面我们就来构造一个相机。
这里有一个特别深奥的地方,也就是投影坐标的变换,也就是说如果我们的相机是运动的话,我们的观察坐标(也就是我们赖与测试参考的坐标它本身是运动的!这就麻烦了),作为初学者,这种相对运动的变换,的确是一个不容易的事情。
在原来的基础上增加一个视平面:
				//增加一个相机视图物体(注意:这个是视平面)
				cameraview=new Object3d();
				cameraview.x3d=0;
				cameraview.y3d=0;
				cameraview.z3d=0;

他们的关系如图:


结果的代码是:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:myCanvas3D="myCanvas3D.*" applicationComplete="init();">
	<mx:Script>
		<![CDATA[
			import hjh3dcom.Object3d;
			
			[Embed(source='assets/Figure.swf')]   
	        public var FG:Class;   
	        public var joe:MovieClip = new FG as MovieClip; 
	        
	        private var joe3d:Object3d;
	        private var cameraview:Object3d;
	        private var FocalLength:Number;
	        private var dir:Number;
	        private var speed:Number;
	        private var scaleRatio:Number;
	        
			private function init():void{
				joe3d=new Object3d();
				joe3d.x3d=0;
				joe3d.y3d=0;
				joe3d.z3d=0;
				//增加一个相机视图物体(注意:这个是视平面)
				cameraview=new Object3d();
				cameraview.x3d=0;
				cameraview.y3d=0;
				cameraview.z3d=0;
				dir=1;
				FocalLength=300;
				speed=20;
				joe.x=250;
				joe.y=200;
				joe.scaleX=joe.scaleY=1;
				mycanvas.canvas.addChild(joe);
				this.addEventListener(Event.ENTER_FRAME,onenterframe);
			}
			private function come3dto2d():void{
				joe.x=(joe3d.x3d-cameraview.x3d)*scaleRatio+250;
				joe.y=-(joe3d.y3d-cameraview.y3d)*scaleRatio+200;
				joe.scaleX=joe.scaleY=1*scaleRatio;//需要注意的是贴图是靠Sprite物体的缩放实现的
			}
			private function onenterframe(evt:Event):void{
				movejoe3d();
				scaleRatio=FocalLength/(FocalLength-cameraview.z3d);
				come3dto2d();
			}
			private function movejoe3d():void{
				cameraview.z3d += speed*dir;
				if (cameraview.z3d < -500){
					cameraview.z3d = -500;
					dir = 1; // moving forward now
				}else if (cameraview.z3d > 0){
					cameraview.z3d = 0;
					dir = -1; // now moving back again
				}
			}
		]]>
	</mx:Script>
	<myCanvas3D:Canvas3D id="mycanvas" width="500" height="400" backgroundColor="0xFFFFFF"/>
</mx:Application>


这里用了一个关键的因素是坐标的变换概念:


如果我们用A坐标系来描述B点的位置,则B点的位置为:
Bx=X2-X1;
By=Y2-Y1;
同样,在新的坐标中,如果相机移动,那么我们的物体的位置为
X=joe3d.x3d-cameraview.x3d;
Y=joe3d.y3d-cameraview.y3d;
Z=joe3d.z3d-cameraview.z3d;

OK,结果为:

http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350

  • 大小: 4.3 KB
  • 大小: 74.6 KB
  • 大小: 52.8 KB
分享到:
评论

相关推荐

    flex 3D拖拽不同角度观看

    首先,让我们了解Flex中的3D基础。在Flex中,我们可以通过导入mx.core.threeD包来启用3D特性。这将允许我们在舞台上创建3D对象,并通过设置transform3D属性来调整其位置、旋转和缩放。3D坐标系统与2D不同,它包括X、...

    在Flex项目中引用Away3D(版本3.6)AS项目

    3. **Away3D框架**:Away3D是一个用AS3编写的高效3D引擎,支持硬件加速,提供了一系列3D对象、纹理、光照、摄像机、动画等工具,使开发者能构建高质量的3D场景。 4. **引用Away3D库**:在Flex项目中,你需要将Away...

    Papervision3D-demo.rar_DEMO_Papervision3D demo_Papervision3D mxm

    - **实例3:摄像机控制**:通过源码,我们可以看到如何实现用户交互来控制3D场景中的摄像机视角,提供更丰富的用户体验。 - **实例4:动态光照**:展示了Papervision3D中的光照效果,包括环境光、点光源、平行光等...

    Flex Mobile M-JPEG

    3. **观看IPCam**:IP Camera(网络摄像机)是一种可以通过网络传输视频流的设备。通常,IPCam支持多种视频编码格式,如M-JPEG、H.264等。在Flex Mobile M-JPEG项目中,开发者创建了一个客户端,可以直接连接到IPCam...

    Papervision3D 教程打包下载

    5. **摄像机控制**:在3D场景中,摄像机(Camera)决定了观察者看到的内容。Papervision3D提供了丰富的摄像机控制功能,包括平移、旋转和缩放,以实现第一人称视角或自由视角的交互。 6. **PV3D+Flex集成**:Flex是...

    papervision3d_868.swc

    4. 设置摄像机:创建一个`Camera`对象,调整其位置和视角。 5. 渲染3D场景:在每个帧的更新周期内调用`Scene3D`的`render()`方法,将3D场景绘制到舞台上。 五、进一步学习与资源 为了深入了解PV3D,你可以参考`...

    Away3D(3D引擎) 4.1.6 官方最新版.zip

    away3d世界由:view 视口、scene 场景、camera 摄像机和3D物体四部分组成,也称Away3D的四大基本构件。 Away3D基本构件 3D物体就是那些我们想要在三维世界里显示的内容; 场景(scene)相当于3D的世界,类似与一...

    papervision3dChinese.rar_FlashMX/Flex源码_FlashMX_

    PV3D的核心组件包括场景(Scene)、摄像机(Camera)、光源(Light)和对象(Object)。场景是3D世界的容器,所有3D元素都在其中定位;摄像机决定了观察者从哪个角度看到场景;光源则影响着物体的光照效果;对象则是...

    away3d 4.1.0 swc

    Away3D的核心组件包括场景图、摄像机、光源、材质、纹理和几何对象等。Scene Graph是Away3D组织3D对象的方式,允许开发者通过层次结构来管理和操作场景中的元素。Camera类提供了视角控制,而Light类则负责模拟光照...

    pv3d简单全景

    PV3D库是基于Flex SDK的,它扩展了ActionScript 3的舞台和显示对象层次结构,引入了3D场景、摄像机、光照和材质等概念。在AS3中,PV3D提供了强大的工具和类,使得开发者能够轻松地创建复杂的3D应用,包括全景图。 ...

    Papervision3D Essentials 中文PDF及书中源码

    书中的实例源码是学习的关键,它们涵盖了从基础到高级的各种应用场景,包括3D物体的创建、动画、摄像机控制、碰撞检测、光照和阴影处理等。HF4SourceCode.zip文件包含了这些实例的源代码,读者可以直接运行并进行...

    pv3d做的简单视频墙

    2. **创建3D场景和摄像机**:实例化Scene和Camera对象,配置摄像机视角以适应视频墙的布局。 3. **加载视频**:使用Video类加载视频资源,准备视频数据。 4. **创建3D视频播放器**:为每个视频创建3D几何体,如...

    Away3D最新版本4.1源码

    Away3D是flash或flex上的一个功能强大且实时的3D引擎,具有快速、高效、API清楚等优点。但是三角型消失的问题让...away3d世界由:view 视口、scene 场景、camera 摄像机和3D物体四部分组成,也称Away3D的四大基本构件。

    Away3D 引擎

    Away3D是flash或flex上的一个功能强大且实时的3D引擎,具有快速、高效、API清楚等优点。但是三角型消失的问题让...away3d世界由:view 视口、scene 场景、camera 摄像机和3D物体四部分组成,也称Away3D的四大基本构件。

Global site tag (gtag.js) - Google Analytics