WEB开发网
开发学院图形图像Flash Flash与3D编程探秘(六)- 全方位旋转摄像机 阅读

Flash与3D编程探秘(六)- 全方位旋转摄像机

 2008-11-12 11:51:10 来源:WEB开发网   
核心提示: 6. 下面的函数就是刷新小P位置和大小的函数,这也是这篇文章主要讲述的内容,Flash与3D编程探秘(六)- 全方位旋转摄像机(5),所以,请集中,最后别忘记加一个z_near变量,存储小P到摄像机的距离,OK,首先我们要得出小P(其中一个小P)到摄像机的x

6. 下面的函数就是刷新小P位置和大小的函数,这也是这篇文章主要讲述的内容,所以,请集中。OK,首先我们要得出小P(其中一个小P)到摄像机的x,y和z 距离。对于横向旋转角度panning,我们使用本文前面讲述的方程,把相应的x距离和z距离带入,然后我们得出新的x距离和z距离。使用相同的方法得出 纵向旋转角度pitching后的y和z距离,对摄像机倾斜角度tilt我们在次使用上述方程。这样我们就得到围绕三个轴旋转后新的x,y和z距离,继而 便可以使用老办法算出物体的缩放和移动。最后别忘记加一个z_near变量,存储小P到摄像机的距离,以便于我们对所有小P进行z排序。

//updateballsizeandposition
//hereiswhatwereallycareabout,soconcentrate
functiondisplay(obj)
{  
  varx_distance=obj.x_3d-camera.x;     //firstwedeterminexdistanceballtocamera
  vary_distance=obj.y_3d-camera.y;    //y
  varz_distance=obj.z_3d-camera.z;    //zdistance
  
  vartempx,tempy,tempz;            //sometemporaryvariables
  
  //twomoretrigyouneedtoknowabout,supposeaisthepreviousangle
  //cos(a+b)=cos(a)*cos(b)-sin(a)*sin(b)
  //sin(a+b)=sin(a)*cos(b)+cos(a)*sin(b)
  //thuswehavethefollowing
  varangle=camera.panning;
  tempx=Math.cos(angle)*x_distance-Math.sin(angle)*z_distance;
  tempz=Math.sin(angle)*x_distance+Math.cos(angle)*z_distance;
  x_distance=tempx;
  z_distance=tempz;
  
  angle=camera.pitching;          //thesamethingwehaveforpitchangle
  tempy=Math.cos(angle)*y_distance-Math.sin(angle)*z_distance;
  tempz=Math.sin(angle)*y_distance+Math.cos(angle)*z_distance;
  y_distance=tempy;
  z_distance=tempz;
  
  angle=camera.tilt;             //andtiltangle
  tempx=Math.cos(angle)*x_distance-Math.sin(angle)*y_distance;
  tempy=Math.sin(angle)*x_distance+Math.cos(angle)*y_distance;
  x_distance=tempx;
  y_distance=tempy;
  
  if(z_distance>0)                      //iftheballisinfrontofthecamera
  {
    if(!obj.visible)                
      obj.visible=true;                  //maketheballvisibleanyway
      
    varscale=focal_length/(focal_length+z_distance);  //calthescaleoftheball
    obj.x=x_distance*scale;               //calcualtethexpositioninacameraview
    obj.y=y_distance*scale;              //andyposition
    obj.scaleX=obj.scaleY=scale;          //scaletheballtoaproperstate
  }
  else
  {
    obj.visible=false;
  }
  
  obj.z_near=z_distance;      //keeptrackofzdistancetoourcamera
}

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

Tags:Flash 编程 探秘

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接