Главная страница
    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.5 MB
Время: 0.926 c
1-1152080166
ancot
2006-07-05 10:16
2006.08.20
Цвет TMainMenu


2-1154501900
Arsenija
2006-08-02 10:58
2006.08.20
обработка по нажатии ENTER в LabeledEdit


1-1151975555
dwar
2006-07-04 05:12
2006.08.20
indy 9.0.18 проблеммы установки


2-1154528062
cando
2006-08-02 18:14
2006.08.20
биты


15-1153604106
Германн
2006-07-23 01:35
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский