网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 网管学堂 > 网页设计 > Flash > 基础教程 > FLASH_3D教程——从头开始  

FLASH_3D教程——从头开始

2006-05-12  作者:中国网管联盟  来源:BitsCN.com整理  点评 投稿 收藏

  大家都知道三维的点都有3个坐标,但FLASH只是有二维的坐标,所以要在FLASH里实现“三维”的效果,就需要对点的坐标进行转化,简单的说,就是怎么把三维坐标转换成二维坐标。(其实,这并不是真正的三维,而是一种视觉欺骗,看上去像三维的就这么回事。所以上面三维带引号。)

  一、三维坐标系转化成二维坐标系

  (1)、坐标的转换

  flash中场景左上角为(0,0),而在数学中是场景中心为(0,0),怎样把它转成数学中的坐标系呢? 

  FLASH里的坐标视图
x
o
y
 x=Stage.width/2; // Stage.width是场景的宽;


 y=Stage.height/2; // Stage.height是场景的高;

  这样就把原坐标的原点移动了,场景的中心点,不过,Y轴还是向下,为正的。(这在后面做旋转时要注意的。)

中国网管联盟bitsCN.com

  网管论坛bbs_bitsCN_com

  (2)、角度的转换

  flash中Math函数里的参数都要用到弧度,所以角度与弧度之间的转换是需要知道的。

  在flash as中,我们可以通过这样的表达式来进行转换:

hudu=jiaodu*Math.PI/180; / /把角度转换为弧度,公式为:弧度=角度 *3.14/180,3.14为pai

jiaodu=hudu*180/Math.PI; / /把弧度转换为角度,公式为:角度=弧度*180/3.14,3.14为pai

(if (jiaodu<0) { jiaodu = jiaodu+360; }/* 转换后的角度的范围从-180到180, 数学中的角度从0到360,所以小于0时加上360 */)

  2、flash中的三维坐标系

  如图3,z轴表示一个物体离屏幕的远近,当物体的z轴位置增加时,物体朝远离屏幕的方向运动,当物体的z值减小时,物体朝接近屏幕的方向运动。


网管u家u.bitsCN.com



  网管联盟bitsCN@com

  
  3、三维坐标转换成二维坐标

  如图4,已知一个点(x,y,z),利用三角形相似的原理,可以得出下列结论:

  d/(d+z)=y1/y,推出:y1=d*y/(d+z),可在二维平面上来表现空间上的点的位置。进一步把它简化。提出因子d/(d+z),用ratio(比率)表示,这个公式就变为

  ratio=d/(d+z);

  y1=ratio*y;同理可推出

  x1=ratio*x;

  二、控制物体的属性(大小,层次,透明度等)

  1、控制mc的大小

  在三维坐标中,当z值增大,也就是远离屏幕时,物体应越小,反之越大。

  我们可以用上满的ratio,当z增加时,ratio减少,因为在ratio中,z是作为分母的。反之,当z减少时,ratio增加。所以可用ratio来控制mc的大小。如下:

  mc1._xscale=mc._xscale*ratio;

mc1._yscale=mc._yscale*ratio;

  2、控制mc的层次

  z值最大,物体应在最底层,最小,在最上层,

  所以mc的层次可以有z组成,可以用很大的数减z,也可以让z除以负数,等等,这里方法比较灵活,也是做”三维”效果的关键,主要要在调试中确定适合设计的方法。flash中,设置mc的层次用swapDepths,如下:
网管联盟bitsCN@com


mc.swapDepths(1000-z);//设置mc的层次

mc.swapDepths(z/-4);

  3、控制mc的透明度

  远处的物体看上去模糊些,近处的物体清晰些,在flash中,可用_alpha来控制,方法和控制大小类似,不在介绍原理。如下:

  mc._alpha=100*ratio;

  4、控制mc的角度(旋转)

  这一步最难,也最好的东东。学习以后,你将能制作出非常cool的效果

  旋转有三种,x旋转:坐标x不变,y旋转:y不变,z旋转:z不变,我们先来推导z旋转。

  如下图:从点(x,y,0)转到(x1.y1.0),求点(x1.y1.0)


  网管u家u.bitsCN.com

  利用数学中的正弦、余弦公式得出

  x1=r*cos(a+b),而cos(a+b)=sina*cosb+cosa*sinb

  推出:x1=r(cosa*cosb-sina*sinb)

  又因为x=r*cosa,y=r*sina

  所以x1=x*cosb-y*sinb

  同样推出:y1=y*cosb+x*sinb

  这就是z旋转的公式。用同样的方法可推出x旋转,y旋转的公式。总结如下:

  给定点:(x,y,z)

  绕x轴旋转后的点(x1,y1,z1)
  绕y轴旋转后的点(x2,y2,z2)
  绕z轴旋转后的点(x3,y3,z3)

 x旋转(x不变)
 x1=x
 y1=y*cosb-z*sinb
 z1=z*cosb+y*sinb
 
  注:x旋转要注意,在FLASH中x1=x
 y1=y*cosb+z*sinb
 z1=z*cosb-y*sinb

  是先加后减,因为FLASH里的Y轴是反的,箭头向下的。

 y旋转(y不变)
 x2=x*cosb-z1*sinb
 y2=y1
 z2=z1*cosb+x*sinb

 z旋转(z不变)
 x3=x2*cosb-y1*sinb
 y3=y1*cosb+x2*sinb
 z3=z2

  从以上公式可看出,在flash要实现旋转,先要求x轴的旋转点,再求y轴的旋转点,最后再求出z轴的旋转点。最后我们来一个x旋转的应用

网管bitscn_com



  三、制作x轴旋转的正方体

  1、在场景中画一小球,并按F8转换为mc,实例命名为qiu。

  2、增加一层,命名为as,接下去我们来写as,如下:

_root.onLoad = function() {
shumu = 8;
// 定义复制小球的数目
qiu._x = 6000;
// 让原始小球消失
for (var i = 0; iduplicateMovieClip("qiu", "qiu"+i, i);
}
// 复制小球,作为正方体的八个顶点
qiu_pos_x = new Array(100, 0, 0, 100, 100, 0, 0, 100);
qiu_pos_y = new Array(100, 100, 100, 100, 0, 0, 0, 0);
qiu_pos_z = new Array(50, 50, -50, -50, 50, 50, -50, -50);
// 从三维坐标中取正方体的8个顶点的坐标,保存在数组中
D = 200;
// 观察者与屏幕的距离
hutu = 0.001;
// 控制旋转的速度
b = hutu*180/Math.PI;
// 角、弧度的转换
};
_root.onEnterFrame = function() {

for (var i = 0; ix1 = qiu_pos_x[i];
y1 = qiu_pos_y[i]*Math.cos(b)-qiu_pos_z[i]*Math.sin(b);
z1 = qiu_pos_z[i]*Math.cos(b)+qiu_pos_y[i]*Math.sin(b);
网管联盟bitsCN_com

// 按公式计算
qiu_pos_x[i] = x1;
qiu_pos_y[i] = y1;
qiu_pos_z[i] = z1;
// 更新数组元素
ratio = D/(D+z1);
perspective_x = x1*ratio;
perspective_y = y1*ratio;
// 按公式计算
_root["qiu"+i]._x = 275+perspective_x;
_root["qiu"+i]._y = 200-perspective_y;
/ 设置球的坐标
_root["qiu"+i]._xscale = _root["qiu"+i]._yscale=50*ratio;
// 球的大小
_root["qiu"+i].swapDepths(10000-qiu_pos_z[i]);
// 球的层次
_root["qiu"+i]._alpha=100*ratio;//设置透明度

网管论坛bbs_bitsCN_com

}
}; 网管下载dl.bitscn.com


TAGs   开始   教程   p_node   node   .x   .y   旋转   depth   .z   坐标      
 上一篇:FLASH移动放大的图片效果   下一篇:flash8.0笔触颜色支持什么
FLASH_3D教程——从头开始 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: