快速业务通道

Flash 三维引擎初探

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-15
 eyez=-500;//视点的位置
  zorder=100;//视平面深度

  二、 构建引擎

  这一步是整个程序的核心,完成了引擎差不多就等于完成了全部。

  2.1 初始化
  在开始真正的引擎前我们先来做一些初始化的工作——将所定义模型的信息转存到一个个单独的变量中。在init帧中输入以下代码:
  setProperty ("/baseline", _x, 1000);//隐藏原来的那条线
  //下面的循环转存所有点的信息
  for (i=1; i<=totalpoints; i++) {
   set ("x" add i, substring(points, Number((i-1)*12+1), 3));
   set ("y" add i, substring(points, Number((i-1)*12+5), 3));
   set ("z" add i, substring(points, Number((i-1)*12+9), 3));
  }
  //下面的循环转存所有线的信息
  for (i=1; i<=totallines;i++) {
   set ("pt1" add i, substring(lines, Number((i-1)*5+1), 2));
   set ("pt2" add i, substring(lines, Number((i-1)*5+3), 2));
  }
  //下面两个变量分别表示显示中心点的x和y
  centerx=190;
  centery=215;


  2.2 创建基本循环

  完成了初始化,下面我们来建立程序中最基本的循环。选中loop帧,并在其中输入:
  gotoAndPlay ("start");

  2.3 绘制模型

  绘制模型的过程可分为两个部分,第一部分将三维物体的各点坐标值转换为投影到视平面S上的相应二维坐标;第二部分根据转换完毕的二维坐标在视平面S上绘制出图像。在这个例子里我们在帧draw里面进行三维坐标的二维化,然后使用帧drawline来进行绘制工作。所以,在帧draw里输入以下的代码:

  //下面的循环根据公式进行三维坐标的二维化
  for (i=1; i<=totalpoints; i++) {
   u = (zorder-eyez)/(eval("z" add i)-eyez);//二维化公式
   if (i<=9) {
   set ("2Dx0" add i, u*eval("x" add i)+centerx);
   set ("2Dy0" add i, u*eval("y" add i)+centery);
   } else {
   set ("2Dx" add i, u*eval("x" add i)+centerx);
   set ("2Dy" add i, u*eval("y" add i)+centery);
   }
  }
  //下面的循环负责复制线段并将之显示出来
  for(i=1;i<=totallines;i++){
   duplicateMovieClip("/baseline","line" add i,i);
   call("drawline");
  }
  在帧drawline里输入以下的代码:
  pt1 = eval("pt1" add i);
  pt2 = eval("pt2" add i);
  setProperty ("line" add i, _x, eval("2Dx" add pt1));
  setProperty ("line" add i, _y, eval("2Dy" add pt1));
  setProperty ("line" add i, _xscale, eval("2Dx" add pt2) - eval("2Dx" add pt1));
  setProperty ("line" add i, _yscale, eval("2Dy" add pt2) - eval("2Dy" add pt1));

  至此绘制模型的工作大致就做完了,在start帧中输入:
  call("draw");
  按Ctrl+Enter后就可以看到你所定义的模型的模样了。


  2.4 旋转

  旋转其实也很简单,只要将坐标根据不同旋转角度重新映射一次就可以了,下面是一组用于旋转计算的公式:

  沿x轴旋转:

  沿y轴旋转:

  沿z轴旋转:

  由于篇幅有限,这里就只介绍一种旋转方式——沿x轴旋转。

  根据上面的这些公式,我们还需要设置一些变量来满足要求。在init帧中追加以下的代码:
  basecos=0.9848; //cos10的值
  basesin=0.1736; //sin10的值
  cos=basecos;
  sin=basesin;   axis="x";//沿哪个轴旋转,这里是x也就是说沿x轴旋转
  在rotx中输入如下的代码:
  //根据不同的角度值重新计算二维坐标
  for (i=1; i<=totalpoints; i++) {
   set ("tmp", (sin*eval("y" add i))+(cos*eval("z" add i)));
   set ("y" add i, (cos*eval("y" add i))-(sin*eval("z" add i)));
   set ("z" add i, tmp);
  }
   接下来只要在start帧中call("draw");的上面插入一句
  call("rot" add axis);//根据axis的值调用不同类型

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号