科技时代新浪首页 > 科技时代 > 学园 > 正文

从头开始:FLASH 3D教程简单实用(4)


http://www.sina.com.cn 2005年08月12日 11:07 eNet硅谷动力

  文/kianxin

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

  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旋转的应用

  三、制作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);

  // 按公式计算

  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;//设置透明度

  }

  };

[上一页] [1] [2] [3] [4] [5] [6] [7] [下一页]



评论】【初学者原地论坛】【收藏此页】【 】【多种方式看新闻】【下载点点通】【打印】【关闭

爱问 iAsk.com



科技时代意见反馈留言板 电话:010-82628888-5828   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2005 SINA Inc. All Rights Reserved

版权所有 新浪网