Упрощенная трехвекторная физика для самолета. Код примерный и нуждается в дополнительной настройке и призван просто показать суть метода. Для просторы наблюдения самолет фиксирован по оси х.

Код AS3:
package
{
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.geom.Point;
import flash.ui.Keyboard;
[SWF(width="640", height="480")]
public class airplane extends Sprite
{
private static const TO_RADIAN:Number = Math.PI / 180;
//тяга двигателя
private var propellingForce:Point;
//гравитация
private var gravitation:Point;
//подъемная сила
private var lift:Point;
//суммарный вектор
private var force:Point;
private var upFlag:Boolean = false;
private var downFlag:Boolean = false;
private var leftFlag:Boolean = false;
private var rightFlag:Boolean = false;
//самолет
private var plane:Sprite;
//рисунок самолета
private var planeGraphics:Sprite;
//отображение векторов
private var vectorsGraphics:Sprite;
public function airplane()
{
//начальная скорость 10
propellingForce = new Point(10, 0);
//сила гравитации 10
gravitation = new Point(0, 10);
plane = new Sprite();
plane.x = 30
plane.y = stage.stageHeight * .5;
planeGraphics = new Sprite();
drawPlane(planeGraphics.graphics);
plane.addChild(planeGraphics);
vectorsGraphics = new Sprite();
plane.addChild(vectorsGraphics);
addChild(plane);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyboardHandler);
}
private function drawPlane(gr:Graphics):void
{
gr.beginFill(0x694246);
gr.drawRect(0, 0, 30, 10);
gr.endFill();
}
private function enterFrameHandler(event:Event):void
{
if (upFlag)
{
planeGraphics.rotation -=2;
}
if (downFlag)
{
planeGraphics.rotation +=2;
}
if (rightFlag)
{
propellingForce.normalize(propellingForce.length * 1.02);
}
if (leftFlag)
{
propellingForce.normalize(propellingForce.length * 0.98);
}
//поворачиваем вектор тяги по оси самолета
propellingForce = Point.polar(propellingForce.length, planeGraphics.rotation * TO_RADIAN);
/*поворачиваем вектор подъемной силы перпендикулярно оси самолета,
длина вектора является проекцией тяги на ось x (такое вот нехилое упрощение)
*/
lift = Point.polar(propellingForce.x, planeGraphics.rotation * TO_RADIAN - Math.PI * .5);
//считаем суммарный вектор
force = propellingForce.add(gravitation).add(lift);
plane.y += force.y;
//раскомментировать для полета
//plane.x += force.x;
drawVectors();
}
private function drawVectors():void
{
var gr:Graphics = vectorsGraphics.graphics;
gr.clear();
var liftPos:Point = vectorsGraphics.globalToLocal(lift);
var gravitationPos:Point = vectorsGraphics.globalToLocal(gravitation);
var propellingPos:Point = vectorsGraphics.globalToLocal(propellingForce);
var forcePos:Point = vectorsGraphics.globalToLocal(force);
//подъемная сила
gr.lineStyle(1, 0xFF0000);
gr.lineTo(lift.x, lift.y);
gr.moveTo(0,0);
gr.lineStyle(1, 0x00FF00);
gr.lineTo(gravitation.x, gravitation.y);
gr.moveTo(0,0);
gr.lineStyle(1, 0x0000FF);
gr.lineTo(propellingForce.x, propellingForce.y);
gr.moveTo(0,0);
gr.lineStyle(2, 0xFFFF00);
gr.lineTo(force.x, force.y);
}
private function keyboardHandler(event:KeyboardEvent):void
{
var value:Boolean = event.type == KeyboardEvent.KEY_DOWN;
switch (event.keyCode)
{
case Keyboard.UP:
upFlag = value;
break;
case Keyboard.DOWN:
downFlag = value;
break;
case Keyboard.LEFT:
leftFlag = value;
break;
case Keyboard.RIGHT:
rightFlag = value;
break;
}
}
}
}