![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Физика авто/батискафа
!Trinix © (2005-11-24 18:55:00)Мне необходимо сделать что-то вроде симулятора батискафа. Чтобы сделать реалестичное движение батискафа решил его физику движения сделать на подобие физики автомобиля. Разумеется у батискафа нет колес и из-за этого силу тяги (Engineforce) я сделал установленной. Мне кажется, что все работает. Но я не могу сделать повороты (я этим занимался когда-то, но это было больше года назад, так что ничего не помню). Помогите, пожалуйста.
Ниже следует код для просчета прямолинейного движения. Примерно в таком же варианте мне необходимы просчеты поворотов.
[code]
const
u = 1; // еденичный вектор, направление батискафа
Engineforce = 5000; // устанавливается программистом
dt = 1; // промежуток за который изменяется скорость
mass = 4000; // масса батискафа
cD = 2.2; // коэф. трения с поверхностью
AC = 2.2; // площадь передней части батискафа
rho = 1.03; // плотность морской воды
g = 9.1; // скорость свободного падения тел
cDrag = 0.5 * cD * AC * rho; // аэродинамичный коэф.
cRR = 30 * cDrag; // коэф. трения
var
fTraction : real; // сила тяги
fDrag : real; // аэродинамическая сила
fRR : real; // сила трения
fLong : real; // продольная сила
a, v, speed : real; // ускорение, скорость, модуль скорости
procedure TForm1.Timer1Timer(Sender: TObject);
begin
fTraction := u*Engineforce; // вычисляем силу тяги
fDrag := -cDrag * v * speed; // вычисляем силу аэро сопр.
//fDrag := 0.5 * cD * AC * rho * v^2; // тоже что и формула выше, но без cDrag
fRR := -cRR * v; // сила трения
fLong := fTraction + fDrag + fRR; // продольная сила
a := fLong/mass; // вычисляем ускорение
v := v + dt * a; // вычисляем скорость
speed := sqrt(v * v); // вычисляем модуль скорости
Label5.Caption := IntToStr(Trunc(fLong));
Label6.Caption := IntToStr(Trunc(a));
Label7.Caption := IntToStr(Trunc(v));
Label8.Caption := IntToStr(Trunc(speed));
end;
[/code]
!Trinix (2005-11-28 15:34:00) [1]Хорошо, сейчас я перевожу программу в 3Д, попробую ваши предложения. Спасибо.
Jeer (2005-11-28 10:24:00) [2]очень упрощенно:
- при вращении аппарат достигнет уст.скорости при равенстве момента вращающего (двигатель в поворотной насадке) и суммы моментов динамического и гидравлического сопротивления.
Мвр = Мдин + Мс
Вращающий момент опр-ся Мвр = R*Fдв*Sin(b)
R - плечо момента
F дв - сила тяги двиг.
b - угол разворота насадки от продольной оси (при b=90, вращение на месте)
Динамический момент Мвр = J*a
J - момент инерции вращения батискафа
a - угловое ускорение a = dw/dt
Момент сопротивления можно принять Mc = k*w^2
w - угловая скорость
Получаем систему ур-ний
R*Fдв*Sin(b) - (J*dw/dt + k*w^2) = 0
Численное интегрирование дает текущую скорость вращения.
Наложив на вращательное движение, еще и поступательное и с учетом Jeer © (25.11.05 10:07) [3] получаем упрощенное описание движения на циркуляции.
!Trinix (2005-11-28 08:00:00) [3]Я не ленюсь, но библиотека маленькая, я же не в крупном городе.
XProger (2005-11-28 02:33:00) [4]!Trinix, угловое ускорение у тебя постоянно. Как и ускорение линейное. Следовательно угловая скорость расчитывается также как и линейная скорость!
Возьми в библиотеке книжку по теоретической механике, не ленись!
!Trinix (2005-11-27 15:44:00) [5]О, круто, но как найти угловую скорость?
XProger (2005-11-27 12:23:00) [6]Нормальный батискаф с 2 движками по бокам может разворачиваться прямо на месте :)
Так что, можно ввести угловое ускорение и исходя из него (аналогично speed) вычислять угловую скорость, на которую будет изменяться ang объекта :)
!Trinix (2005-11-27 10:43:00) [7]2 XProjer
Ааа, врубился. XProjer, ивини, это наверное моя ошибка. Вот эту тему я и создал, чтобы узнать на какой угол батискаф должен повернуться в определенный момент времени, чтобы это выглядило более или менее реально. А из-за плохой формулировки вопроса ты это воспринял слишком буквально и предложил лишь мне наугад подобрать угол поворота. Sorry, но похоже, что физика мне нужна несколько более реальная.
Код, который я выложил выше является выводом формул из статьи "Техника движения автомобиля" от Марко Монстра (Marco Monster). Единственная проблема его статьи, что я не очень могу воспринять, как он описал высчитывание угла поворота, вот и из-за этого я и обратился к вам.
!Trinix (2005-11-27 10:15:00) [8]2 Ф
Ну, можно и с указанием массы. Например, масса батискафа = 3000 кг. Но проблемма с массой воды, ведь речь идет о гигантской глубине, с большим давлением, а здесь трудно определить массу.
А важность физики мне не нужна времмено, пока я с ней разбираюсь. Потом буду ее улучшать.
XProger (2005-11-27 08:34:00) [9]поправка, Max_W - угловая скорость.
XProger (2005-11-27 07:28:00) [10]Декартова система координат. Ось Y смотрит вверх. Поворот и происходит в плоскости XOZ
Max_W - константа, описывающая максимальное угловое ускорение при повороте. Т.к. физика тебе нужна нереальная - подбирай методом тыка ;)
acc - текущее ускорение - вектор
MAX_ACCELATE - конастанта - максимальное ускорение сообщаемое двигателем
speed - вектор скорости - забудь про свой код ;)
k - коэфицент дополнительного торможения, впринципе можно убрать (= 1) , т.к. скорость ограничивается константой MAX_SPEED
pos - радиус-вектор позиции объекта
!Trinix (2005-11-27 06:58:00) [11]XProger,
1) Max_W - это вес тела?
2) acc, MAX_ACCELATE - ?
3) Что ты сделал с моей переменной speed? (у меня это модуль скорости)
4) k - ?
5) pos - это текущая позиция корабля (x,y) ?
Извини, но похоже, что мы называем одинаковые вещи разными именами и я не могу понять значения всех твоих переменных.
XProger (2005-11-25 17:42:00) [12]!Trinix, ну если реальная физика не нужна...
[code]
if Key_left then ang := ang + MAX_W;
if Key_right then ang := ang - MAX_W;
acc := Vector(cos(ang), acc.Y, sin(ang)) * MAX_ACCELATE * (1 - Length(Speed) / MAX_SPEED);
speed := (speed + acc) / k; // k > 1
pos := pos + speed;
[/code]
acc, speed, pos - векторные величины :)
Ф (2005-11-25 14:26:00) [13]Кстати здесь судя по всему нужна длина батискафа и еще куча физических параметров (при разной угле наклона разное трение и тп), а вот G по моему где-то должно сокращаться.
главное разница между массой воды и массой батискафа.
!Trinix (2005-11-25 14:13:00) [14]а можно увидеть, как вы видите это на коде. повторюсь, что очень реальная физика необязательна, я из-за этого даже тягу сам указываю. мне просто нужно, чтобы эта махина двигалась и все.
Jeer (2005-11-25 10:07:00) [15]Все не так просто, как ты нарисовал даже для продолльного движения без вращения.
Если все же хочется попроще на циркуляции, то введи зависимость коэф.гидродинамического сопротивления Cy по оси y от угла скольжения + момент инерции вращения.
Далее - разложение сил в связанной системе координат.
XProger (2005-11-24 19:46:00) [16]Вообщем, если повороты происходят в одной плоскости, то всё достаточно просто расчитывается.
Двигатель даёт момент вращения относительно центра тяжести батискафа. При этом на батискаф действуют силы "трения" с водой (зависит от скорости поворота). Результирующее ускорение прибавляешь к скорости поворота.
На листочке нарисуй, и книжки по термеху почитай для более чёткого понимания сути...
XProger (2005-11-24 19:20:00) [17]Что за батискаф то?
Ато есть варианты с несколькими пропеллерами и с хвостом...