加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:44:09 所属栏目:百科 来源:网络整理
导读:又是一阵子没更新了,一直在考虑关于这个3D的问题。 自从CS4版本的FLASH出来过后增加了许多类,诸如现在要介绍的3D类,和之前发的3D基础的思想是一样的。但是我想单独提出来。看完后肯定会觉得是相当有必要的。 ? ? ? (以下就不再重复CS4版本作为环境了) ?

又是一阵子没更新了,一直在考虑关于这个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,谢谢)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读