Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.044 c
15-1153510455
Андрей Пазик
2006-07-21 23:34
2006.08.20
Интернет-форумы как помойная яма


15-1153734381
PSPF2003
2006-07-24 13:46
2006.08.20
Ошибка в 17 строке


2-1153988032
1519
2006-07-27 12:13
2006.08.20
Завершение работы


15-1153814754
Pazitron_Brain
2006-07-25 12:05
2006.08.20
Можно соединить КПК с


4-1146230527
Asics777
2006-04-28 17:22
2006.08.20
Проассоциировать разные форматы с добавлением своих иконок





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский