又是一阵子没更新了,一直在考虑关于这个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;
?
Z? 排序:
//? 假设有一个带有 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;
回顾下坐标表示:
?
?
图 15-1? 右手坐标系
图 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,谢谢)