【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中,我们可以通过导入mx.core.threeD包来启用3D特性。这将允许我们在舞台上创建3D对象,并通过设置transform3D属性来调整其位置、旋转和缩放。3D坐标系统与2D不同,它包括X、...
3. **Away3D框架**:Away3D是一个用AS3编写的高效3D引擎,支持硬件加速,提供了一系列3D对象、纹理、光照、摄像机、动画等工具,使开发者能构建高质量的3D场景。 4. **引用Away3D库**:在Flex项目中,你需要将Away...
- **实例3:摄像机控制**:通过源码,我们可以看到如何实现用户交互来控制3D场景中的摄像机视角,提供更丰富的用户体验。 - **实例4:动态光照**:展示了Papervision3D中的光照效果,包括环境光、点光源、平行光等...
3. **观看IPCam**:IP Camera(网络摄像机)是一种可以通过网络传输视频流的设备。通常,IPCam支持多种视频编码格式,如M-JPEG、H.264等。在Flex Mobile M-JPEG项目中,开发者创建了一个客户端,可以直接连接到IPCam...
5. **摄像机控制**:在3D场景中,摄像机(Camera)决定了观察者看到的内容。Papervision3D提供了丰富的摄像机控制功能,包括平移、旋转和缩放,以实现第一人称视角或自由视角的交互。 6. **PV3D+Flex集成**:Flex是...
4. 设置摄像机:创建一个`Camera`对象,调整其位置和视角。 5. 渲染3D场景:在每个帧的更新周期内调用`Scene3D`的`render()`方法,将3D场景绘制到舞台上。 五、进一步学习与资源 为了深入了解PV3D,你可以参考`...
away3d世界由:view 视口、scene 场景、camera 摄像机和3D物体四部分组成,也称Away3D的四大基本构件。 Away3D基本构件 3D物体就是那些我们想要在三维世界里显示的内容; 场景(scene)相当于3D的世界,类似与一...
PV3D的核心组件包括场景(Scene)、摄像机(Camera)、光源(Light)和对象(Object)。场景是3D世界的容器,所有3D元素都在其中定位;摄像机决定了观察者从哪个角度看到场景;光源则影响着物体的光照效果;对象则是...
Away3D的核心组件包括场景图、摄像机、光源、材质、纹理和几何对象等。Scene Graph是Away3D组织3D对象的方式,允许开发者通过层次结构来管理和操作场景中的元素。Camera类提供了视角控制,而Light类则负责模拟光照...
PV3D库是基于Flex SDK的,它扩展了ActionScript 3的舞台和显示对象层次结构,引入了3D场景、摄像机、光照和材质等概念。在AS3中,PV3D提供了强大的工具和类,使得开发者能够轻松地创建复杂的3D应用,包括全景图。 ...
书中的实例源码是学习的关键,它们涵盖了从基础到高级的各种应用场景,包括3D物体的创建、动画、摄像机控制、碰撞检测、光照和阴影处理等。HF4SourceCode.zip文件包含了这些实例的源代码,读者可以直接运行并进行...
2. **创建3D场景和摄像机**:实例化Scene和Camera对象,配置摄像机视角以适应视频墙的布局。 3. **加载视频**:使用Video类加载视频资源,准备视频数据。 4. **创建3D视频播放器**:为每个视频创建3D几何体,如...
Away3D是flash或flex上的一个功能强大且实时的3D引擎,具有快速、高效、API清楚等优点。但是三角型消失的问题让...away3d世界由:view 视口、scene 场景、camera 摄像机和3D物体四部分组成,也称Away3D的四大基本构件。
Away3D是flash或flex上的一个功能强大且实时的3D引擎,具有快速、高效、API清楚等优点。但是三角型消失的问题让...away3d世界由:view 视口、scene 场景、camera 摄像机和3D物体四部分组成,也称Away3D的四大基本构件。