PDA

Просмотр полной версии : Физика, Угол наклона в полете.


Mkey
11.05.2013, 23:44
Конечно с AS3 тут мало что связано, кроме того что реализуется именно на этом языке.
Хочу попросить помощи людей которые знают физику.
Есть Косм. Корабль который летит по разнообразной траектории и с разной скоростью.
Хочу реализовать наклон при взлете и падение.
На тело действуют три "силы"
Это "скорость" направленная под 90 градусов.
Это Гравитация
Это Сопротивление гравитации. При запуске двигателя она равна (гравитация)х2.
Сейчас использую rotation с изменением по формуле:
sqrt(pow(speed,2)+pow(gravity,2))/25;
25 половина ширины мувиклипа коробля.
Ну и вращение не плавное и какое то говнянное. Видимо формула не та.

Tails
12.05.2013, 03:24
Создайте вашему кораблике вектор движения:
var velacity:Point;

Опишите силы:
var gravity:Point = new Point(0, -2);
var powerUp:Point;

Каждый шаг в игре рассчитывайте действующие силы.
Например сила, поднимающая вверх будет пропорциональна квадрату скорости:
powerUp = new Point(0, velacity.length * velacity.length); // Такое адское взлетание

После расчёта всех сил, просто суммируйте их:
velacity.add(gravity);
velacity.add(powerUp);

Двигаем кораблик в соответствий с новой силой:
ship.x += velacity.x;
ship.y += velacity.y;

Можно сделать угол поворота кораблика в зависимости от какой-то силы, например, пусть кораблик всегда смотрит носом в направлении своего движения:
ship.rotation = Math.atan2(velacity.y, velacity.x) * (180 / Math.PI);

На самом деле, немного тригонометрий, чуточку фантазий и можно сделать вообще любое поведение кораблику!
пс. Я хотел показать принцип, может где-то ошибся..

expl
12.05.2013, 03:28
Это Сопротивление гравитации
С этим ещё можно смириться, антигравитационные технологии, все дела.
Но не с этим:
На тело действуют три "силы"
Это "скорость" направленная под 90 градусов.
Скрость - это не сила, не сила это!

В любом случае если хотите направить корабль вдоль траектории:
- находите изменение координат за кадр dx, dy
- находите угол по этим изменениям

private var _lastX:Number = 0;
private var _lastY:Number = 0;
private onEnterFrame(...):void {
var dx:Number = _ship.x - _lastX;
var dy:Number = _ship.y - _lastY;
_lastX = _ship.x;
_lastY = _ship.y;
if (Math.abs(dx) + Math.abs(dy) > 0.0001) {//Поворачиваемся, только если корабль не стоит на месте
_ship.rotation = Math.atan2(dy, dx) * 180 / Math.PI;
}
}

Mkey
13.05.2013, 01:27
Парни спасибо за помощь, осталось сделать плавное ускорение:)
Скрость - это не сила, не сила это!
Да скорость в кавычках:)