Форум: "Игры";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизФизика авто/батискафа Найти похожие ветки
← →
!Trinix © (2005-11-24 18:55) [0]Мне необходимо сделать что-то вроде симулятора батискафа. Чтобы сделать реалестичное движение батискафа решил его физику движения сделать на подобие физики автомобиля. Разумеется у батискафа нет колес и из-за этого силу тяги (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]
← →
XProger © (2005-11-24 19:20) [1]Что за батискаф то?
Ато есть варианты с несколькими пропеллерами и с хвостом...
← →
XProger © (2005-11-24 19:46) [2]Вообщем, если повороты происходят в одной плоскости, то всё достаточно просто расчитывается.
Двигатель даёт момент вращения относительно центра тяжести батискафа. При этом на батискаф действуют силы "трения" с водой (зависит от скорости поворота). Результирующее ускорение прибавляешь к скорости поворота.
На листочке нарисуй, и книжки по термеху почитай для более чёткого понимания сути...
← →
Jeer © (2005-11-25 10:07) [3]Все не так просто, как ты нарисовал даже для продолльного движения без вращения.
Если все же хочется попроще на циркуляции, то введи зависимость коэф.гидродинамического сопротивления Cy по оси y от угла скольжения + момент инерции вращения.
Далее - разложение сил в связанной системе координат.
← →
!Trinix © (2005-11-25 14:13) [4]а можно увидеть, как вы видите это на коде. повторюсь, что очень реальная физика необязательна, я из-за этого даже тягу сам указываю. мне просто нужно, чтобы эта махина двигалась и все.
← →
Ф (2005-11-25 14:26) [5]Кстати здесь судя по всему нужна длина батискафа и еще куча физических параметров (при разной угле наклона разное трение и тп), а вот G по моему где-то должно сокращаться.
главное разница между массой воды и массой батискафа.
← →
XProger © (2005-11-25 17:42) [6]!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 - векторные величины :)
← →
!Trinix © (2005-11-27 06:58) [7]XProger,
1) Max_W - это вес тела?
2) acc, MAX_ACCELATE - ?
3) Что ты сделал с моей переменной speed? (у меня это модуль скорости)
4) k - ?
5) pos - это текущая позиция корабля (x,y) ?
Извини, но похоже, что мы называем одинаковые вещи разными именами и я не могу понять значения всех твоих переменных.
← →
XProger © (2005-11-27 07:28) [8]Декартова система координат. Ось Y смотрит вверх. Поворот и происходит в плоскости XOZ
Max_W - константа, описывающая максимальное угловое ускорение при повороте. Т.к. физика тебе нужна нереальная - подбирай методом тыка ;)
acc - текущее ускорение - вектор
MAX_ACCELATE - конастанта - максимальное ускорение сообщаемое двигателем
speed - вектор скорости - забудь про свой код ;)
k - коэфицент дополнительного торможения, впринципе можно убрать (= 1) , т.к. скорость ограничивается константой MAX_SPEED
pos - радиус-вектор позиции объекта
← →
XProger © (2005-11-27 08:34) [9]поправка, Max_W - угловая скорость.
← →
!Trinix © (2005-11-27 10:15) [10]2 Ф
Ну, можно и с указанием массы. Например, масса батискафа = 3000 кг. Но проблемма с массой воды, ведь речь идет о гигантской глубине, с большим давлением, а здесь трудно определить массу.
А важность физики мне не нужна времмено, пока я с ней разбираюсь. Потом буду ее улучшать.
← →
!Trinix © (2005-11-27 10:43) [11]2 XProjer
Ааа, врубился. XProjer, ивини, это наверное моя ошибка. Вот эту тему я и создал, чтобы узнать на какой угол батискаф должен повернуться в определенный момент времени, чтобы это выглядило более или менее реально. А из-за плохой формулировки вопроса ты это воспринял слишком буквально и предложил лишь мне наугад подобрать угол поворота. Sorry, но похоже, что физика мне нужна несколько более реальная.
Код, который я выложил выше является выводом формул из статьи "Техника движения автомобиля" от Марко Монстра (Marco Monster). Единственная проблема его статьи, что я не очень могу воспринять, как он описал высчитывание угла поворота, вот и из-за этого я и обратился к вам.
← →
XProger © (2005-11-27 12:23) [12]Нормальный батискаф с 2 движками по бокам может разворачиваться прямо на месте :)
Так что, можно ввести угловое ускорение и исходя из него (аналогично speed) вычислять угловую скорость, на которую будет изменяться ang объекта :)
← →
!Trinix © (2005-11-27 15:44) [13]О, круто, но как найти угловую скорость?
← →
XProger © (2005-11-28 02:33) [14]!Trinix, угловое ускорение у тебя постоянно. Как и ускорение линейное. Следовательно угловая скорость расчитывается также как и линейная скорость!
Возьми в библиотеке книжку по теоретической механике, не ленись!
← →
!Trinix © (2005-11-28 08:00) [15]Я не ленюсь, но библиотека маленькая, я же не в крупном городе.
← →
Jeer © (2005-11-28 10:24) [16]очень упрощенно:
- при вращении аппарат достигнет уст.скорости при равенстве момента вращающего (двигатель в поворотной насадке) и суммы моментов динамического и гидравлического сопротивления.
Мвр = Мдин + Мс
Вращающий момент опр-ся Мвр = 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 15:34) [17]Хорошо, сейчас я перевожу программу в 3Д, попробую ваши предложения. Спасибо.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.047 c