现在的位置: 首页 > 综合 > 正文

在flash cs4以上版本的3D基础 (as3.0)

2013年08月21日 ⁄ 综合 ⁄ 共 2606字 ⁄ 字号 评论关闭

又是一阵子没更新了,一直在考虑关于这个3D的问题。

自从CS4版本的FLASH出来过后增加了许多类,诸如现在要介绍的3D类,和之前发的3D基础的思想是一样的。但是我想单独提出来。看完后肯定会觉得是相当有必要的。

   

(以下就不再重复CS4版本作为环境了)

 

    再回顾下转发的十五章的公式:

基本 
scale = fl / (fl + zpos);
sprite.scaleX = sprite.scaleY = scale;
sprite.alpha = scale; //  可选
sprite.x = vanishingPointX + xpos * scale;
sprite.y = vanishingPointY + ypos * scale;

 

排序:
//  假设有一个带有 zpos 属性的 3D 物体的数组
objectArray.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
for(var i:uint = 0; i < numObjects; i++) {
    setChildIndex(objectArray[i], i);
}
 

 坐标旋转:
x1 = cos(angleZ) * xpos - sin(angleZ) * ypos;
y1 = cos(angleZ) * ypos + sin(angleZ) * xpos;
x1 = cos(angleY) * xpos - sin(angleY) * zpos;
z1 = cos(angleY) * zpos + sin(angleY) * xpos;
y1 = cos(angleX) * ypos - sin(angleX) * zpos;
z1 = cos(angleX) * zpos + sin(angleX) * ypos;
 
3D  距离:
dist = Math.sqrt(dx * dx + dy * dy + dz * dz); 

看着相当的麻烦吧,是不是觉得如果有个Z柱属性是多么的有必要。现在的确增加了这个属性。

上面所述的

scale = fl / (fl + zpos);
sprite.scaleX = sprite.scaleY = scale;
sprite.alpha = scale; //  可选
其实相当于现在Z,

用法和X,Y一样,比如sprite.z=100;

回顾下坐标表示:

 

 

在flash <wbr>cs4以上版本的3D基础 <wbr>(as3.0)

图 15-1  右手坐标系

在flash <wbr>cs4以上版本的3D基础 <wbr>(as3.0)

图 15-2  左手坐标系

经过测试 这里的Z坐标是用了右手坐标系,也就是向内是+Z,向外是-Z,不算太抽象吧?

用之前转发的透视效果来修改下:

package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 import flash.ui.Keyboard;
 public class sampleDEMO extends Sprite {
  private var ball:Ball;
  private var xpos:Number=0;
  private var ypos:Number=0;
  private var zpos:Number=0;
  private var vpX:Number=stage.stageWidth/2;
  private var vpY:Number=stage.stageHeight/2;
  public function sampleDEMO() {
   init();
  }
  private function init():void {
   ball = new Ball();
   addChild(ball);
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
   stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
  }
  private function onEnterFrame(event:Event):void {
   xpos=mouseX-vpX;
   ypos=mouseY-vpY;
   ball.z=zpos;
   ball.x=vpX+xpos;
   ball.y=vpY+ypos;
  }
  private function onKeyDown(event:KeyboardEvent):void {
   if (event.keyCode==Keyboard.UP) {
    zpos+=5;
   } else if (event.keyCode == Keyboard.DOWN) {
    zpos-=5;
   }
  }
 }
}

这里的ball可以换成其他什么元件都可以。其实就是把Z柱表示那两段替换成了Z,这样省了不少代码量。

之前转发的里面有一个fl的量,这里可以直接看成是z的0点到-z的一段距离。也可以设置成一个常数,习惯上就设置成250,但是是用的右手坐标系所以fl=-250。这个变量任然可以充当一个物体可见的值,小于这个变量的时候物体就不可见了。这样显得更真实些吧。

比如加在上面那段代码上:

private function onEnterFrame(event:Event):void {
  if (zpos <fl) {
   xpos=mouseX-vpX;
   ypos=mouseY-vpY;
   ball.z=zpos;
   ball.x=vpX+xpos;
   ball.y=vpY+ypos;
  ball.visible = true;
  } else {
  ball.visible = false;
 }
}

这样超出屏幕的时候就消失了。

 

大家可以在Z柱上加上加速度,或者设置个范围作反弹之类的练习看看效果。

在前面十五章里面也有很多例子,可以稍加修改就能把Z利用起来。

 

而Z柱的排序的问题也可以通过数组来记录,因为有了具体的值更容易控制排序了。

 

现在不仅增加了Z坐标,更增加了坐标的旋转一属性,帮助下只说了下rotationX,rotationY,

存储此关键帧的 rotationX 属性。此属性是目标对象相对于其原始方向围绕 x 轴的旋转角度。

存储此关键帧的 rotationY 属性。此属性是目标对象相对于其原始方向围绕 y 轴的旋转角度。

其实Z柱也有这个属性rotationZ,用法也和坐标Z是一样的。

例如:sprite.rotationZ=30;

 

现在暂时想的就这么多了以后有问题再继续补充吧~~

 

 

(如果要转载请注明出处http://blog.sina.com.cn/jooi,谢谢)

抱歉!评论已关闭.