精华内容
下载资源
问答
  • 在之前的指南,我们看到怎么去移动摄像机实现物品移动的效果。但这些物品实际上依然放在它们原来的位置。我们现在想移动这些物品! 你可以在屏幕上移动一个物品或一组包含一个或多个对象的物品。要移动一个对象,...

      原文地址:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut04

     

    本指南的目标

    在这里,我们将学到怎么去移动物品。

    在之前的指南中,我们看到怎么去移动摄像机实现物品移动的效果。但这些物品实际上依然放在它们原来的位置。我们现在想移动这些物品!

     

    你可以在屏幕上移动一个物品或一组包含一个或多个对象的物品。要移动一个对象,你首先要有它的一个引用,你可以通过这个对象的rotateXrotateYrotateZ属性围挠三个坐标轴旋转它。使用 panrolltilt属性来围挠它自身的坐标轴来旋转。如果你想移动一组对像,你需要引入一个叫TransformGroup的新类。无需惊奇,它只是一个实现了ATransformable接口的组(Group),所以我们可以像一般对象好样移动它。

     

    在这个指南,我们将要画两个对象。我们将会看到移动一个对象和移动整组对象的区别。

     

    怎么做?

     

    在fla文件中,把文档类(Document class) 设置为Example004.as 。

    代码下载:example004.rar

     

    AS 代码如下:

    在这里我们先看看完整的代码,在后面的段落将解释这些代码。

     

    package {
       import flash.display.Sprite; 
       import flash.events.*;
       import flash.ui.*;
       import sandy.core.Scene3D;
       import sandy.core.data.*;
       import sandy.core.scenegraph.*;
       import sandy.materials.*;
       import sandy.materials.attributes.*;
       import sandy.primitive.*;
     
       public class Example004 extends Sprite {
          private var scene:Scene3D;
          private var camera:Camera3D;
          private var tg:TransformGroup;
          private var myCone:Cone;
          private var myHedra:Hedra;
     
          public function Example004() { 
             camera = new Camera3D( 300, 300 );
             camera.x = 100;
             camera.y = 100;
             camera.z = -400;
             camera.lookAt(0,0,0);
     
             var root:Group = createScene();
     
             scene = new Scene3D( "scene", this, camera, root );
     
             addEventListener( Event.ENTER_FRAME, enterFrameHandler );
             stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
          }
     
          private function createScene():Group {
             var g:Group = new Group();
     
             var myXLine:Line3D = new Line3D( "x-coord", new Vector(-50, 0, 0), new Vector( 50, 0, 0 ));
             var myYLine:Line3D = new Line3D( "y-coord", new Vector(0, -50, 0), new Vector( 0, 50, 0 ));
             var myZLine:Line3D = new Line3D( "z-coord", new Vector(0, 0, -50), new Vector( 0, 0, 50 ));
     
             tg = new TransformGroup('myGroup');
     
             myCone = new Cone("theObj1",50, 100);
             myHedra = new Hedra( "theObj2", 80, 60, 60 );
     
             myCone.x = -160;
             myCone.z = 150;
             myHedra.x = 90;
     
             var materialAttr:MaterialAttributes = new MaterialAttributes( 
                                  new LineAttributes( 0.5, 0x2111BB, 0.4 ),
                                  new LightAttributes( true, 0.1)
                            );
     
             var material:Material = new ColorMaterial( 0xFFCC33, 1, materialAttr );
             material.lightingEnable = true;
             var app:Appearance = new Appearance( material );
     
             myCone.appearance = app;
             myHedra.appearance = app;
     
             tg.addChild(myCone);
             tg.addChild(myHedra);
     
             g.addChild(tg);
             g.addChild(myXLine);
             g.addChild(myYLine);
             g.addChild(myZLine);
     
             return g;
          }
     
          private function enterFrameHandler( event : Event ) : void {
             myHedra.pan +=4;
             myCone.pan +=4;
             scene.render();
          }
     
          private function keyPressed(event:KeyboardEvent):void {
             switch(event.keyCode) {
                case Keyboard.UP:
                   tg.y +=2;
                   break;
                case Keyboard.DOWN:
                   tg.y -=2;
                   break;
                case Keyboard.RIGHT:
                   tg.roll +=2;
                   break;
                case Keyboard.LEFT:
                   tg.roll -=2;
                   break;
             }
          }
       }
    }

     

    查看代码

    让我们看看我们在代码里做了什么。

     

    声明我们需要的对象

    首先我们必需定义三个私有的变量:

    private var tg:TransformGroup;
    private var myCone:Cone;
    private var myHedra:Hedra;

     

    这让我们可以在这个类的任何地方引用这些变量。可能这样做不是最好的方法,但它很简单、快速同时让我们可以更好地解释代码。

     

    创建TransformGroup

    下一步,我们在createScene()方法里实例化了TransformGroup类。

     

     

     

     

    这个TransformGroup将用来维持两个元素:一个圆锥体和一个多面体(Hedra)。

     

    实例化和放置对象

     

     现在我们创建两个新的对象并把让它们分开放置。

    myCone = new Cone("theObj1",50, 100);
    myHedra = new Hedra( "theObj2", 80, 60, 60 );
     
    myCone.x = -160;
    myCone.z = 150;
    myHedra.x = 90;

     

    增加Appearance

    一定要记住为每个你创建的对象设置appearance属性。

    myCone.appearance = app;
    myHedra.appearance = app;

     

    把对象加入到TransformGroup

    现在我们把这两个对象加入到Transform group,这样我们就有了一个让我们可以移动的“节点”的引用。

    tg.addChild(myCone);
    tg.addChild(myHedra);

     

     把所有剩余的对象加入到根组(main group)

    g.addChild(tg);
    g.addChild(myXLine);
    g.addChild(myYLine);
    g.addChild(myZLine);

     

     

     记住,我们需要增加我们刚才创建的TransformGroup和三条直线。但不要加入那两个已经加入到TransformGroup的对象。

     

    处理 enterFrame 事件

    让我们看看有两个事件处理函数里做了什么

    enterFrameHandler  函数里,我们决定展示如果直接获取单个对像,我们单独旋转每一个独立的对象。

    myHedra.pan +=4;
    myCone.pan +=4;
    scene.render();

     

    处理键盘输入事件

    keyPressed  函数中,我想展示怎么样获取整个组来移动里面的两个对象。

    switch(event.keyCode) {
       case Keyboard.UP:
          tg.y +=2;
          break;
       case Keyboard.DOWN:
          tg.y -=2;
          break;
       case Keyboard.RIGHT:
          tg.roll +=2;
          break;
       case Keyboard.LEFT:
          tg.roll -=2;
          break;
    }

    现在让我们看看最终结果:http://www.flashsandy.org/_media/tutorials/3.0/example004.swf

     

     

     

    展开全文
  • [code="java"] private function onEnterFrame(event:Event):void{ if(this.canDrag&... var pos3D:Vector3D=App.sceneCamera.lookAtPosition; var vec:Vector3D=App.view.unproject(Ap...

    private function onEnterFrame(event:Event):void{
    if(this.canDrag&&this.isDrag){
    var pos3D:Vector3D=App.sceneCamera.lookAtPosition;
    var vec:Vector3D=App.view.unproject(App.stage2D.mouseX,App.stage2D.mouseY,1);
    var vec2:Vector3D=App.view.unproject(this.lastMouseX,this.lastMouseY,1);
    this.getCross(vec, App.camera.position, 200);
    this.getCross(vec2, App.camera.position, 200);
    var vec3:Vector3D=vec.subtract(vec2);
    pos3D.x = this._cameraPos3D.x-vec3.x;
    pos3D.z = this._cameraPos3D.z-vec3.z;
    App.sceneCamera.lookAtPosition=pos3D;
    }
    }

    public static function getCross(source:Vector3D, reference:Vector3D, y:Number=0):void{
    if (source.y==reference.y || source.y==y) { return; }
    source.x += (y-source.y)/(reference.y-source.y)*(reference.x-source.x);
    source.z += (y-source.y)/(reference.y-source.y)*(reference.z-source.z);
    }
    展开全文
  • flash11的3d场景编辑器

    2011-09-05 15:55:07
    最进写了一个基于flash11的3d场景编辑器 3d引擎是用away3d4.0 因为是自己用的 所以功能上比较简陋 http://code.google.com/p/nweditor/ 这是一个开源项目 如果有人有兴趣一起开发可以和我联系qq4390121

    最进写了一个基于flash11的3d场景编辑器

    3d引擎是用away3d4.0

    因为是自己用的 所以功能上比较简陋

    http://code.google.com/p/nweditor/

    这是一个开源项目

    如果有人有兴趣一起开发可以和我联系qq4390121


    展开全文
  • Flash 3D

    2011-07-30 15:36:36
    flash 3D 加载3D场景文件的实例 希望对大家有用
  • flash 3D太空漫游

    2012-05-22 12:42:17
    一个flash 3D制作的太空漫游效果,通过按上下左右或“asdw”键控制飞机的移动。
  • Flash3D

    2009-08-14 12:00:00
    Flash3D第一课 3D启程 事实上你要知道的是,flash没有3D。你可能会说:Director,Cult3D或者Anark呢?嘿嘿,那些只是一些与生俱来的工具,他们一开始就为了3D而存在的,要他们做flash可以做的事,他们也做不到---闻...

    Flash3D

    第一课

    3D启程

           事实上你要知道的是,flash没有3D。你可能会说:DirectorCult3D或者Anark呢?嘿嘿,那些只是一些与生俱来的工具,他们一开始就为了3D而存在的,要他们做flash可以做的事,他们也做不到---闻道有先后,术业有专工。Flash不知道怎么体现3D,她只知道怎么使用向量来显示一些形状,或者计算一些数学函数的结果---这也是我们可以在flash中实现3D的基础,如果flash连这些都不支持,那样flash可能就真的干不了3D了。我们想要做3D,只可以”fake”3D。魔术师欺骗我们的什么?---eyes  有两种方法实现我们远大的理想。第一种:在flash之外用3D软件实现好了真实的3D场景,接着使用3D渲染成一帧一帧的连续播放的剪辑。另外一种就是使用AS自己编程,通过精确的计算出3D的各个部分---这也是你看到这篇文章的原因吧。

           在我说的第一种方法中,如果我们使用一些成熟的3D软件和工具,我们可以很轻松的生成SWF文件,但是这样做的缺点是我们不可以在使用flash的过程中使用SWF里面的东西,也就是说:flash失去了原来使用的意义。

           我们为什么可以用flash3D呢?因为flash支持数学呀! 我们用AS计算出基本的3D数据,然后这些数据就可以被我们使用来作为渲染数据。我们接着就可以通过上面的计算和flashAPI(画图或者其他剪辑)生成我们自己的向量图形,使得看上去就像有一个3D物体一样。可是我们应该知道的是,我们可爱的flash并不知道这些事,她看到的只是基本的数学计算、图形的绘画、一些剪辑的播放。可是我们呢?我们看到的是我们自己用手敲出来的3D场景。哦,我可爱的flashmy angle!我欺骗了你的感情,我,我有罪!哈里路亚!---荣耀主不需多说,尽在这真诚的一句。

           我们现在的问题是:我们需要重头开始。如果不太了解数学,可能会觉得很累,还好国人的数学都很不错!你可能会看到一些数学计算,可是其实你知道的,数学,不就是算算数罢了,而你看到的所谓难题,也不是没有答案。

    3D的应用

           你可以在你自己的动画中实现多维。小到拉近拉远,大至全方位的3D物体。可是太细致的东西flash也做不出来,因为flash毕竟只是女孩,还小。下面我们就要开始实现3D旋转的图形。

    简单的静态3D视角

           基本的静态3D视角就只是一个概念---远近缩放。这是什么呢?就是说显示的图形在基准的参考平面有自己的位置和缩放比例,然后我们通过计算它因为缩放原因产生视觉的新位置,并把这个计算出来的新位置当成是它的位置。好像说的很模糊,事实上我喜欢换一种理解来说这个概念:有一个大物体,一个小物体放在面平面上,我们看这两个东西,感觉看到的肯定是两个不同的东西,但我们现在用远近缩放做出来的效果就是那个小物体就好像是大物体放在远的地方,它其实不小,只不过是放在很远的地方,我们看到觉得有点小罢了。这就像人站在镜子前面,站得近,觉得人很大,站得远,感觉人很小---初二就知道,其实不论你站的远或者站得进,人都是一样大的。

     

           Flash就是这样,他显示的其实只是2D的东西,但是你看到的就是3D的。你如果还不知道为什么,那你想想:为什么我们可以画出正方体?小时候我就思考过这个问题,有一次我试着自己画,怎么画都不像,最后没办法了,用铅笔把纸捅破了以为可以画出3D的东西,后来到了一年级才知道这是怎么原因---我们可以帮纸加入Z轴。在技术层面,flash不包含Z轴(最近加入的好像还不是很成熟),flash只知道xy。这就需要远近缩放的技术来解决这个问题。有两种方法实现在Z轴的运动,要知道,我还没介绍Z轴的方法呢,您刚才只是知道有Z轴移动这回事。这两种方法是:缩放和重叠。

    先解释Z轴缩放

           最基本的就是物体变大变小,远大,近小。可是不仅要处理物体的大小,不同方向的变大变小都要处理。这很容易理解,就像我上面说的,我把大的东西,小的东西方在屏幕上面,角度,侧面都不处理,谁都会认为这是两个不同大小的物体,都在一个平面,没有3D,明显的2D。具体的细节后面用到才慢慢解释。

    重叠      

           缩放在很多时候是不够的,如果有很多个3D物体绕着Z轴运动,你就应该要处理不同的层次。不过幸运的是,在flash对层次有很好的支持。Flash层次的问题我也不想多说,大家可以查看具体的稳定,也就是swapDepths

    源点

           000

    展开全文
  • flash3D学习1

    2015-07-15 12:10:18
    今天正式学习flash3D。 先配置: 这样配置好了。 接下来是第一个flash3D。 import flash.display.MovieClip; import flash.events.Event; import flash.display.Stage; import away3d.primitives....
  • Flash 3D赛车游戏

    2010-07-29 16:48:59
    利用Flash CS4 x,y,z坐标做的一个赛车游戏。速度,和场景随得分的增加而变化,一共五个关卡。
  • 需求:需要在死亡人物处实现一个3D的倒计时 问题:如果用两个以上的Sprite3D实现,因为是billboard,总会有一个视角是重叠的 解决:将要显示的图片资源先合并,然后再替换Sprite3D的material
  • 关于Flash3D和Unity 3D

    千次阅读 2013-04-19 14:36:04
    可以说,自从2000年开始接触Flash以来,我就一直期望有一天能在Flash里面自由地运用3D模型,原因是当时我在上海交大同时学习...不过一些主流的3D软件依旧是我硬盘的常客,因为在内心深处,其实我还是偏爱3D技术多一些。
  • 也论Flash 3D和Unity 3D的未来

    千次阅读 2014-12-25 20:50:34
    可以说,自从2000年开始接触Flash以来,我就一直期望有一天能在Flash里面自由地运用3D模型,原因是当时我在上海交大同时学习...不过一些主流的3D软件依旧是我硬盘的常客,因为在内心深处,其实我还是偏爱3D技术多一些。
  • java 3d 场景编辑器

    2010-05-08 08:38:12
    :x 我的玩具没做完的3D场景编辑器, 发出来晒晒。 NetBeans + jmonkey整的.视频截图如下。 [img]http://dl.iteye.com/upload/attachment/245940/9b7b8dc5-83fc-3ca3-b50c-50389602d088.jpg[/img] [flash=640...
  • flash3D引擎对比分析

    2019-10-01 04:45:54
    flash 3D引擎简介 flash3D引擎有不下10款,在使用的时候真的是会让人犯难,我个人曾经使用过一段时间PV3D,感觉PV3D的创建时间,用户规模等等相对都要更加成熟,因此我自己更加推荐PV3D 。结论:目前我在用...
  • flash中场景左上角为(0,0),而在数学场景中心为(0,0),怎样把它转成数学的坐标系呢?假设场景宽度:550,高度400。 x=550/2+this._x;//x右移 y=400/2-thix._y;//y下移 如图1。   【转】Flash...
  • Flash 3D API - Molehill亮相...我的同事Thibault Imbert来介绍这个大家期待已久的Flash 3D API – Molehill “Molehill” 是即将在Adobe® Flash® 平台出现的支持显卡加速的3D底层API。这组底层API会让3D开发者...
  • Flash Player 5开始,3D开发者就尝试做一些伪3D的演示;Flash Player 6时代,引入了Drawing API,大大方便了开发者进行图形绘制;2006年引入AS3,开始改变很多Web游戏的规模;Flash Player 10;2008年10月引入...
  • <br />  Flash 3D API - Molehill亮相MAX: http://labs.adobe.com/technologies/flash/molehill/<br />我的同事Thibault Imbert来介绍这个大家期待已久的Flash 3D API – Molehill <br />...
  • flash 3D 基础教程

    2006-07-20 17:41:00
    flash是一个二维动画制作软件,如何制作“三维”的效果呢?本文对此问题作一个很基础的... flash中场景左上角为(0,0),而在数学场景中心为(0,0),怎样把它转成数学的坐标系呢?假设场景宽度:550,高度400。...
  • FLASH3d技术探讨2

    千次阅读 2006-06-24 13:59:00
    FLASH3D 技术探讨编辑:matoku 虽然Flash功能强大,但也不是万能的,毕竟它是面向网页动画和多媒体制作的,不能对其求全责备。我们所能做的就是针对其在某些功能上的不足,找到相应的补充办法。笔者找到几款可作为...
  • 几款流行Flash3D引擎对比介绍

    万次阅读 2012-08-16 01:17:03
    05/2012 Tag in away3d,flash3d ...10日,Adobe页游峰会最后一站—-广州站顺利举行,本次北上广的Adobe页游峰会活动也圆满划上句号,活动围绕3D...3D页游的开发,离不开Flash3D引擎的选择,现在流行的Flash3D
  • Web3D - 实时3D技术在Flash中的应用

    千次阅读 2012-08-16 18:30:20
    Flash Player文件 点击打开/折叠播放器 ...上面这个flash有点大,点开后要等一下才能看到。...不过我想99%的网民还没见过这样的flash吧,所以值得一等。...在IE里不用特别的插件就实现实时3D,这在不久
  • flex/flash 3d基础1

    2008-11-30 00:24:38
    新的flex/flash给了3D一个很好的展示平台,下面就让我们走进flash3d世界 [b]【贝武易科技专业flex3D开发--www.newflash3d.com】[/b] 十分感谢kirupa.com的贡献。 下面我们进入flex,新建一个项目Zooming Figures...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,801
精华内容 2,720
关键字:

flash3d场景中