领航学课件起步——坐标系和运动

  我最终的设计目标是做一个可以动态添加路线,然后让飞机自动沿“画”出的线路前进的效果。这里面涉及到很多的知识点,让我们一步步来看需要解决哪些问题。

  (起笔写博文的时候不自觉的就想写得非常系统或是详尽,但发现这样做以后,工作量会大大的超过之前的计划,内容上也会因为细支末节的内容,造成主要想说的内容不够突出,所以还是放弃那种大而全的书写方式,简要的记录一下设计过程,如果你对某个话题想进一步的了解,那么欢迎留言,或是讨论合作。)

  Flash坐标系与航图中所使用的坐标系最大的差别,在我看来就是角度表示方面的,Flash的x轴(水平向右)为旋转的零度位置,而航图中正北(垂直向上)方向为领航学上的零度位置。二者刚好有90度的差值。

  我曾出现过这样的问题:

addEventListener(Event.ENTER_FRAME,onFly);
function onFly(evt:Event){
 acft.rotation = 0;
 acft.x += 2;
 if( acft.x > stage.stageWidth + 30){
  acft.x = -30;
 }
}

  上面的运动效果就是没有修正过的运动状态,如果将rotation 属性设成90就可以正常运动,但这又带来一个问题,当运动路线发生旋转以后,总是需要在旋转度数与实际的运动方向(角度)上进行换算,特别是引入航线角以及航向的概念时,问题就更加的麻烦。

  为了保证之前学过的运动学公式都能够直接拿来用(通常都是把rotation当作是运动方向的,如果给它加上90度,那就需要将过去所用的运动公式都进行调整,这显然是不实际的),解决的办法就是在制作元件的时间,让飞机元件的机头水平向右,使它的方向与rotation度数一致,当我们需要计算航向时,只需要将rotation + 90 度即可得到。

  换一个角度来分析,我们的运动公式和方向都是在flash中直接使用的,而航向角等内容都是“附产品”,可以通过固定的换算公式来获得,因此,不必改变一直以来的编程习惯,只需要在数据输出时注意一下转换关系即可。

  代码改动一下,加上常见的运动代码,并且添加鼠标点击的相关操作,每点击一次,旋转度数增加5度,也就是航向角增大5度。

     var ang = acft.rotation * Math.PI / 180;
   acft.x += speed * Math.cos(ang);
   acft.y += speed * Math.sin(ang);
   if (acft.x > stage.stageWidth + 30) {
    acft.x = -30;
   }
   if(acft.y > stage.stageHeight + 30) {
    acft.y = -30;
   }
   if(acft.x < -30) {
    acft.x = stage.stageWidth + 30;
   }
   if(acft.y < - 30) {
    acft.y = stage.stageHeight +30;}
   }
   stage.addEventListener(MouseEvent.CLICK,addRota);
   function addRota(evt:MouseEvent)
   {
    acft.rotation += 5;
   }

  本节总结:

  1、 航向角 = rotation + 90

  2、飞机元件制作时,机头应指向水平向右方向,编程时会比较的方便。

标签集:TAGS:飞行 领航 课件
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}