Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

Физика авто/батискафа   Найти похожие ветки 

 
!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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.059 c
1-1151931242
Шурик
2006-07-03 16:54
2006.08.20
Работа с MSWord


2-1153393351
Mintos
2006-07-20 15:02
2006.08.20
Перевод фамилий


3-1150401719
keymaster
2006-06-16 00:01
2006.08.20
Детский вопрос


15-1152883380
pasha_golub
2006-07-14 17:23
2006.08.20
ShortLine


2-1154415522
ANB
2006-08-01 10:58
2006.08.20
Как узнать имя сертификта в контейнере (дискета) через CryptoAPI?