Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

РЕАЛИСТИЧНАЯ Физика в игре.


Страницы:   1 2 3

Stalker_23b ©   (2004-01-09 23:13:00) 

Я хочу использовать в игре физическую библиотеку ODE, встроенную в GLScene. Но при ее использовании, я ставлю игровой процесс в рамки физичности. То есть я не могу просто взять и нарисовать скелетную анимацию персонажа, ибо теперь все его руки и ноги имеют массу и инерцию, и подчиняются физическим законам.
  Вообще я хочу написать файтинг роботов, который выглядел бы полностью физично. То есть при ударе, робот по всем законам физики вмазывается в стену и сползает по ней, при попадании в определенную часть тела толчок происходит именно туда, и т.д. И проблема моя в том, что, если я хочу анимировать двуногих роботов, до мне нужно написать алгоритм полностью физической ходьбы, ударов и т.д. - так как это делает человек. Но это очень сложно. Фактически, чтобы робот хотя бы умел стоять, ему постоянно нужно совершать кучу телодвижений, чтобы самобалансироваться. И как это реализовать - непонятно.
  Но я могу воздействовать на физическую систему, прилагая какие угодно силы и ограничения к частям тела робота. Как, с помощью этих ухищрений, добиться того, чтобы двуногий робот мог стоять, ходить, прыгать и драться?
  Мда...сложноватый вопрос получился...короче, как сделать физичную, но подконтрольную систему???


md3   (2004-05-22 20:04:00) [1]

Мастера, извините что не в тему, но в ОДЕ и меня такой глюк:
загружаю в Оде какой-нибудь mesh(3ds)из GLfreeform ,и mesh
просто пролетает через пол или застревает в кубе если падает
на него.как этого глюка избежать.help....


md3   (2004-05-22 20:03:00) [2]

Мастера, извините что не в тему, но в ОДЕ и меня такой глюк:
загружаю в Оде какой-нибудь mesh(3ds)из GLfreeform ,и mesh
просто пролетает через пол или застревает в кубе если падает
на него.


Napilnik   (2004-02-26 19:49:00) [3]

Кен кажется я знаю в чем проблема с колесом.Я думаю что если колесо соединить джоинтом с корпусом мотоцикла то все проблемы исчезнут  т.к джоинт накладывает ограничения на вращение колеса по определённым координатам.Следовательно оно по идее не не будет
бултыхатся в воздухе абы какю


Кен   (2004-01-27 04:21:00) [4]


> Alek Aaz ©   (26.01.04 14:09) [40]
> 2Ken
> >Помоему где то годик назад ты нечто подобное уже писал.
> :)

Ту программу можно как бы разделить на части. Та часть, которая отвечает за диалоги, сумку героя и квестовую логику можно считать законченной. Хоть сейчас бери да пиши в ней текстовый квест. Можно даже в виде dll оформить да выложить здесь, чтоб народ пользовался. ( код не покажу ! :) )

Другая часть программы - редактор. Добавление в программу объектов (пальмы, камни, дома в формате 3ds), возможность их крутить, масштабировать, перемещать, добавлять кубы коллизий. Автоматическая загрузка и сохранение. В принципе давольно примитивно, но своё дело делает.

Ну и так мелочь ещё. Камера которая плавнолетает за героем как в Томб Рэйдере. Пули, которые могут убивать и самоликвидироваться когда улетают слишком далеко, ещё вроде что то там было ...


Кен   (2004-01-27 04:10:00) [5]


> Alek Aaz ©   (26.01.04 14:09) [40]
> 2Ken
> >Помоему где то годик назад ты нечто подобное уже писал.
> :)

Исходники живы. Код я комментировал, так, что при желании можно будет легко воскресить.
А забросил я всё это тогда из-за нереалистичной физики, которую писал сам. А потом, когда посмотрел ODE, то понял, что надо не велосипед с физикой изобретать, а прикрутить к программе ODE, с тех пор вот и прикручиваю ...

Жду когда появится на ODE больше демок и примеров, чтобы можно было хоть откуда нибудь позаимствовать код, хоть посмотреть, как это правильно писать. Чудаки они вообще. Написать движок и почти не написать как его использовать.
Только примеры нужны не на чистом ODE, а на том, что под GLScene, потому, что на чистом, любая мелочь - это три страницы кода, и мне лень столько писать.


> 2Alex Storm
> Лучше с CVS не заморачиваться, на http://glscene.sourceforge.net/index.php
> болтается GLScene_SnapShot_231203.zip (4.2 MB). Вроде достаточно
> работоспособный snapshot :)

Они раз в год обновления выкладывают. Ждать замучишься.


Alek Aaz   (2004-01-26 14:09:00) [6]

2Ken
>Помоему где то годик назад ты нечто подобное уже писал. :)
Да помню, помню ... :) руки не доходят... Будет время - бильярд накропаю :)
Поддерживать мотоцикл не буду, т.к. не понимаю в ODE ничего. Перевел маленькую статейку о DelphiODE с материнского сайта. Ничего особенного, так, общие принципы. Может выложу куда...

2Alex Storm
Лучше с CVS не заморачиваться, на http://glscene.sourceforge.net/index.phpболтается GLScene_SnapShot_231203.zip (4.2 MB). Вроде достаточно работоспособный snapshot :)

2Stalker_23b
>dJointSetHingeParam(TODejointHinge.jointID,dParamVel,10) - примерно так, через экспортную функцию ОДЕ, ты можешь влиять на СКОРОСТЬ вращения джоинта.
Думаешь кто-нибудь понял о чем речь? :) Особенно про джоинт :)
>А вообще - читайте хэлп по ОДЕ
Народ бъет себя в грудь, что читал. Но я давно заметил, что на родной мове материал почемуто лучше усваивается. Если буду переводить ODE User Guide поможешь?

Идея тут родилась. Не знаю, покатит или нет.
ИМХО. В принципе, SMD анимация это текстовый файл. На сайте http://www.geocities.com/stuart_gooding/есть програмка Skeletal Mesh Collider (SMC) Editor описывающая smd модельку геометриями ODE (в основном капсулами). Берем анимацию (текстовый файл smd) и переводим в вид косточка-направление силы-время действия.
Только я не понял, еще формата smd анимации, но думаю, не сложно будет это сделать(мне кажется косточка должна быть вида x,y,z единичный вектор+h длина или xyz координаты начала и конца косточки в данный момент времени).
Скажем так:
кость: FingR01
направление: 1 кадр (получаем вектор косточки), 10 кадр (получаем вектор косточки)вычитаем один из другого, строим нормали  или что там необходимо и получаем вектор-направление, куда двигался конец косточки относительно своего начала(ну или как там это грамотно называется, пусть математики поправят) на протяжении 10 кадров.
Время действия силы - знаем что движение было 10 кадров, а кадров 24 в секунду (или сколько их там) тогда сила должна действовать на косточку 0,41666 секунды. Либо вообще не выставлять время действия, а гнать в константе покадрово. (скажем кость такая-то, направление такое-то, а в следующем кадре сменить направление) У косточки есть своя геометрия к ней и садим всякими dJointAddHingeTorque силы.
Причем не надо вычислять все силы дейстующие на косточку, а только ту которая "создается" роботом для выполнения движения.
При соприкосновении с чужой головой, туловищем или стеной ODE сама добавит нужные силы и нужные моменты. При накаутирующем ударе(когда робот впечатывается в стенку)силы "создаваемые" роботом можно убрать и он полетит как Нормально Летающий Объект. Или не убирать их. Будет как в китайских фильмах-литит кунфуист от полученного удара метров за 300, а сам в воздухе руками и ногами махает. Просто силу к роботу нужно приложить Большую, я бы даже сказал ЧУДОВИЩНУЮ. И тогда силы "создаваемые" роботом будут просто ничтожны и их можно будет не рассматривать. Для ярых реалистов сценарий нокаута: удар - потеря сознания (убрали "создаваемые" роботом силы)- робот валится на пол как мешок.
Так как это не чистая анимация то можно использовать не TActor, а TFreeForm или вообще разбить фигуру на три составляющие башка, тело с руками, ноги. Как в примере с моделькой md3 (Quake 3).    
Во... Наверное так лучше всего сделать.
>Фактически, чтобы робот хотя бы умел стоять, ему постоянно нужно совершать кучу телодвижений, чтобы самобалансироваться.
Нифига! Робот может ничего не делать если проекция центра массы робота не вышла за площадь его опоры (ступней). Скажем, стоит брусок, мы его отклоняем чуть и отпускаем. Если проекция центра массы вышла за площадь опоры, он упадет, если нет - вернется в первоначальное положение. Собственно, если проекция не вышла за пределы-че роботу волноваться? самобалансироваться- просто центр массы робота загоняется в площадь его опоры. Чем меньше площадь тем сложнее это сделать (на канате устоять простому смертному вообще невозможно).
Скажем для ног сделать следующие анимашки: стойки (у меня где-то самоучитель по ушу и карате был :) можно надергать оттуда), шаг вперед левой ногой, вперед правой ногой, шаг назад (левой, правой),шаг в сторону (левой, и правой ногой), перекрестный ход. Про всякие маваши-гири пока забываем.
Скажем робот "работает" в стойке его выводят из равновесия ударом чего-нибудь (например кулака :), но для эксперимента можно в него шарики тяжелые пулять). Если центр массы его не сместился критически он ничего не предринимает, если появилась угроза опрокидывания, делает шаг назад или в бок. В общем никаких нейросетей, простая геометрия. Хочет двигаться вперед, смещает центр массы вперед и делает шаг. Мля... Мне проще на листке нарисовать :) ...
Мля... устал писать... Ладно, подумаю, завтра допишу...


Кен   (2004-01-26 03:40:00) [7]

Компилируем, запускаем, жмём на кнопку 2. Появляется капсула. Жмём на кнопки a s d w , чтобы её подкручивать. В результате она крутится чёрти-как, и всё это часто зависает.

Проблема в строчках
    TempDyn1.AddTorque(AffineVectorMake(0,10,0));
    TempDyn1.AddTorque(AffineVectorMake(0,-10,0));
    TempDyn1.AddTorque(AffineVectorMake(0,0,10));
    TempDyn1.AddTorque(AffineVectorMake(0,0,-10));

Как их правильно настроить, чтобы капсула нормально крутилась и поворачивала ?


Кен   (2004-01-26 03:23:00) [8]

Ладно. Сообща будем писать мотоцикл. ( если конечно кто поддержит )
Изменения/дополнения к демке simple .

в uses дописываем Keyboard
...
var
 TempDyn1 : TGLODEDummy; // TGLODEDynamicBehaviour;

procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
 newTime: Double);
const
 cStep = 0.001;
var
 i : integer;
begin
 // -----------------
 // Прикладываем моменты, чтобы вращать и поворачивать колесо.
 // Требуется додумать как правильно их прикладывать
 // Управление клавишами adsw
 // Всё это часто вылетает с ошибками. Почему не знаю.
 if IsKeyDown('a') then begin
   if TempDyn1 <> nil then begin
     TempDyn1.AddTorque(AffineVectorMake(0,10,0));
   end;
 end;
 if IsKeyDown('d') then begin
   if TempDyn1 <> nil then begin
     TempDyn1.AddTorque(AffineVectorMake(0,-10,0));
   end;
 end;
 if IsKeyDown('w') then begin
   if TempDyn1 <> nil then begin
     TempDyn1.AddTorque(AffineVectorMake(0,0,10));
   end;
 end;
 if IsKeyDown('s') then begin
   if TempDyn1 <> nil then begin
     TempDyn1.AddTorque(AffineVectorMake(0,0,-10));
   end;
 end;
 // -----------------

 for i:=0 to Trunc(deltaTime/cStep) do
   GLODEManager1.Step(cStep);
end;

...

// Кнопка 2. Запихивает созданную капсулу в TempDyn1, чтобы ею можно было управлять.
procedure TForm1.Button2Click(Sender: TObject);
begin
 TempDyn1 := TGLODEDummy(ODEObjects.AddNewChild(TGLODEDummy));
 with TempDyn1 do begin
 // with TGLODEDummy(ODEObjects.AddNewChild(TGLODEDummy)) do begin
   Manager:=GLODEManager1;
   Position.SetPoint(Random,Random+3,Random);
   with TODEElementCapsule(AddNewElement(TODEElementCapsule)) do begin
     Position.SetPoint(0,0,0);
     Radius:=0.5*Random+0.25;
     Length:=Random+0.5;
   end;
   Color.Red:=0.5*Random+0.5;
   Color.Green:=0.5*Random+0.5;
   Color.Blue:=0.5*Random+0.5;

   VisibleAtRuntime:=True;
 end;
end;


Кен   (2004-01-26 03:13:00) [9]


> Stalker_23b   (25.01.04 20:37) [34]
> 2 Кен : Нахрена тебе управлять колесом от мотоцикла без
> самого мотоцикла?

До целого мотоцикла ещё дорости надо. Если ты не можешь с одним колесом справиться, то где уж тебе целый мотоцикл управлять ?


> Stalker_23b   (26.01.04 01:14) [36]
> Но если все таки нужно, то вот как:
>  dBodyAddForce - просто приложить силу к телу (в заданном
> направлении)
>  dBodyAddForceAtPos - приложить силу к телу в точке в АБСОЛЮтнЫХ
> КООРДИНАТАХ, т.е. система отсчета не будет вращаться и перемещаться
> вместе с ним.
>  dBodyAddRelForceAtPos - тоже самое, но в локальных координатах
> тела.

А код то где ? Код, а не описания !


Stalker_23b   (2004-01-26 01:14:00) [10]

Бред какой-то. Есть корпус, к нему с помощью джоинта привязано колесо, и его совершенно спокойно можно крутить, есть несколько методов (см. выше). Зачем катить колесо само по себе??? Но если все таки нужно, то вот как:
 dBodyAddForce - просто приложить силу к телу (в заданном направлении)
 dBodyAddForceAtPos - приложить силу к телу в точке в АБСОЛЮтнЫХ КООРДИНАТАХ, т.е. система отсчета не будет вращаться и перемещаться вместе с ним.
 dBodyAddRelForceAtPos - тоже самое, но в локальных координатах тела.

 Чтобы катить колесо, имхо надо просто прилагать силу к нему в должном направлении. Но все равно оно поворачивать не сможет, если оно одно. Ты пишешь симулятор одноколесного мотоцикла? :)


MrAngel   (2004-01-25 22:01:00) [11]

Это наверное нужно при столкновении со стеной и прочими обьектами ? :-)


Stalker_23b   (2004-01-25 20:37:00) [12]

2 Кен : Нахрена тебе управлять колесом от мотоцикла без самого мотоцикла?


Alex Storm   (2004-01-25 09:11:00) [13]

Спасибо за помощь, Кен!

P.S.: Извини за такой вопрос частый :)


Кен   (2004-01-25 04:45:00) [14]


> Stalker_23b   (24.01.04 23:02) [30]
> 2 KEN :
>   Управление колесом нужно делать не через приложение сил
> к колесу,

Вопрос не через что, а куда моменты прикладывать. В какой системе координат.
Есть демка simple , в ней есть капсулы, возьми капсулу и попробуй ею управлять как колесом мотоцикла ( или катка ). Две кнопки - повороты, две - вперёд назад.
Могёшь ?


Кен   (2004-01-25 04:23:00) [15]


> Alex Storm   (24.01.04 18:13) [29]
> >GLScene скачай. Там демки есть с ODE. Сделай поиск в файлах
> >демок по "ODE" и найдёшь.
>
> Недавно закачал GLScene_v09b_Full с сайта www.GLScene.org
> Поискал в демках стандартным виндовым поисковиком, но ничего
> не нашел. Чего делать? :)
>
> Н-да, и еще - советовали скачать последние версии файлов
> GLS с помощью CVS-клиента... Скажите, где его найти?

О Боже, это спрашивают чуть ли не в каждой ветке о GLScene.

Для скачки программ с сорсфоржа используется программа специальная. http://www.tortoisecvs.org/Читай фак на http://glscene.sourceforge.net/faq.htm

Когда программулина заинсталилась, перегрузилась - создаешь папку скажем GLScene_CVS. Открываешь ее "проводником". На пустом месте жмешь правую кнопку мыша и выбираешь пункт CVS > Make New Module
Появилось окошко. В нем:
Protocol - без изменений (pserver)
Server - рисуешь там cvs.sourceforge.net
Port - лучше оставить пустым
Repository directory - пишешь /cvsroot/glscene  
User name - пишешь anonymous
Module - какую директорию хочешь закачать Delphi7, Demos или Source. Чувствителен к регистру букв.
Жмешь Ok. Иногда ругается на пароль. Не помню, что ему указал, кажется жал просто Ок. Начинает качать директории. В последствии в своей папке переодически жмешь CVS Checkout выбираешь папку которую хочешь посмотреть обновления


Stalker_23b   (2004-01-24 23:02:00) [16]

2 KEN :
  Управление колесом нужно делать не через приложение сил к колесу, а через АнгулярМоторы или приложение сил напрямую к джоинту. Поясню: у тебя есть корпус и колесо, связанное с ним. например, через TODEJointHinge. Чтобы крутить колесо, есть 3 пути:
 1. dJointSetHingeParam(TODejointHinge.jointID,dParamVel,10) - примерно так, через экспортную функцию ОДЕ, ты можешь влиять на СКОРОСТЬ вращения джоинта.
 2. dJointAddHingeTorque(...) - примерно так ты можешь напрямую добавлять силы к телам, связанным джоинтом, координаты посчитаются сами.
 3. Создать АнгулярМотор и работать с ним. Это гиморный метод, так что RTFM.
  Не забудь указать максимальную силу воздействия для джоинта :
dJointSetHingeParam(TODejointHinge.jointID,dParamFMax,10000)- примерно так...
  А вообще - читайте хэлп по ОДЕ (для си) - там ВСЕ написано. Многие полезные функции не реализованы в методах GLScene ODE, приходится юзать напрямую.
  Будут вопросы по ОДЕ - задавайте.
 
  з.Ы. Ихвините за кривость наприсания - я пьяяяяян.............


Alex Storm   (2004-01-24 18:13:00) [17]

>GLScene скачай. Там демки есть с ODE. Сделай поиск в файлах >демок по "ODE" и найдёшь.

Недавно закачал GLScene_v09b_Full с сайта www.GLScene.org
Поискал в демках стандартным виндовым поисковиком, но ничего не нашел. Чего делать? :)

Н-да, и еще - советовали скачать последние версии файлов GLS с помощью CVS-клиента... Скажите, где его найти?


Кен   (2004-01-24 02:42:00) [18]


> Alek Aaz ©   (22.01.04 06:55) [26]
> Черт его знает, я с ODE не разбирался, но скоро начну.

Помоему где то годик назад ты нечто подобное уже писал. :)

Я хочу сделать управление передним колесом мотоцикла на ODE, чтобы его можно было поворачивать и разгонять, но немогу понять к каким координатам привязать приложение моментов. Координаты колеса вращаются вместе с ним. Координаты мира тоже не то, потому, что колесо может поворачиваться в разные стороны. Короче, в результате колесо не поворачивается, а заваливается бесконца на бок и раскручивается не по оси, а чёрти как.

Если будешь разбираться, то подскажи как его ( колесо мотоцикла ) правильно сделать. В смысле как правильно прилагать к нему моменты.


> Alex Storm   (22.01.04 21:44) [27]
> Простите за глупый вопрос, но хотелось бы знать, как использовать
> физическую библиотеку ODE ?

GLScene скачай. Там демки есть с ODE. Сделай поиск в файлах демок по "ODE" и найдёшь.


Alex Storm   (2004-01-22 21:44:00) [19]

Простите за глупый вопрос, но хотелось бы знать, как использовать физическую библиотеку ODE ?


Alek Aaz   (2004-01-22 06:55:00) [20]

Черт его знает, я с ODE не разбирался, но скоро начну.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо