从头开始: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;//设置透明度 } };
|