![]() |
Показать все 62 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Физика (https://hlfx.ru/forum/showthread.php?threadid=3714)
Физика
Всем здрасте, давно я сюда не заходил....
Началось всё так: что-то стукнуло мне по башке и я решил написать свой физдвижок. Причём на ФПС и т.д. мне было наплевать Мне для начала хотелось написать просто физику, которая бы была похожа на настоящую. Сначало всё шло хорошо, колижн детектор очень хорошо получился. Но дальше надо было писать солвер. Так как я только в 9 класе, у меня нету необходимых знаний по физике. Но всё же, я решил сделать для начала физку хотябы без учёта угловой скорости. Вот что из этого получилось: http://rghost.ru/42319766
Да, знаю, это физикой назвать сложно, но всё же она почти как в ХЛ =)
Потом я всё таки попытался добавить вращение, и получилось из этого нечто нехорошее:
http://rghost.ru/42320019
А теперь просьба к знающим людям ( к ксероксу, в волатиле помойму норм физика, или к ДМу, ведь в ксаше тоже есть физика ), помочь мне доделать мой физдвижок, а именно вращения, или хотябы обьяснить, как высчитываеться угловая скорость и привести все необходимые формулы
Зарание спасибо
Добавлено 17-12-2012 в 22:03:
Сомневаюсь, но возможно в поиске проблем вам поможет кусок кода:
1 | void CSolver::SolveCollision( CollisionPoint CP ) |
2 | { |
3 | s_ConvexObject &A = gConvexObjects[ CP.a ]; |
4 | s_ConvexObject &B = gConvexObjects[ CP.b ]; |
5 | Vector normal = CP.SA.axis; |
6 | Vector ContactPoint = CP.point; |
7 | normal.Normalize(); |
8 |
9 | Vector relativeVelocity = ( B.linearVelocity + CrossProduct( ContactPoint - B.origin, B.angularVelocity ) ) |
10 | - ( A.linearVelocity + CrossProduct( ContactPoint - A.origin, A.angularVelocity ) ); |
11 | float velocityProjection = DotProduct( relativeVelocity, normal ); |
12 | if( velocityProjection >= 0 ) |
13 | return; |
14 | float ImpulseA; |
15 | float ImpulseB; |
16 |
17 | if( !A.invMass ) |
18 | { |
19 | ImpulseA = 0; |
20 | ImpulseB = velocityProjection; |
21 | } |
22 | else if( !B.invMass ) |
23 | { |
24 | ImpulseA = velocityProjection; |
25 | ImpulseB = 0; |
26 | } |
27 | else |
28 | { |
29 | ImpulseA = ( 1 / B.invMass ) / ( 1 / A.invMass + 1 / B.invMass ) * velocityProjection; |
30 | ImpulseB = ( 1 / A.invMass ) / ( 1 / A.invMass + 1 / B.invMass ) * velocityProjection; |
31 | } |
32 |
33 | A.linearVelocity = |
34 | A.linearVelocity + normal * ImpulseA; |
35 | B.linearVelocity = |
36 | B.linearVelocity - normal * ImpulseB; |
37 |
38 | // Если не делить на 100500, то вращение будет очень быстрое |
39 | A.angularVelocity = A.angularVelocity |
40 | + CrossProduct( normal * ImpulseA, ContactPoint - A.origin ) / 100000000; |
41 |
42 | B.angularVelocity = B.angularVelocity |
43 | + CrossProduct( -normal * ImpulseB, ContactPoint - B.origin ) / 100000000; |
44 |
45 | } |
ONeiLL
Я в физике ничего не понимаю, в волатиле - Newton Game Dynamics.
__________________
XaeroX спс, буду искать инфу =)
вы уже определились что мы подразумеваем под "angular velocity" ?
Я надеюсь это значение потом не берется как углы эйлера?
А насчёт написания собственной физики - бесполезное занятие. Никто не оценит. Симуляторы физики очень плотно привязаны к ряду негативных факторов, таких как конечная точность вычисления чисел с плавающей точкой, проблемы округления чисел из сопроцессоров до "форматных" дабла и флоата, таймер и влияние фризов на его работу, собственно тип солвера, метод работы коллижен детектора и еще сотни других тонкостей. Обычно эти самописные движки либо проваливают тела при каждом удобном случае либо конструкции составленные из тел крайне нестабильны либо это всё дико тормозит, а чаще - всё вместе.
Но кое-какая практическая польза всё же наличествует. Понимая что ты делаешь тебе будет потом проще прикрутить готовый физ.двиг к своему движку. А практика показывает, что там еще поверх придется дописать тонны кода. Да вот пример из практики, так сказать. Допустим PhysX - коробки, ящики, всё хорошо. Мы хотим взаимодействовать с игроком тоже.
Мало этого - игрок хочет взаимодействовать с окружением тоже. Я напомню что это две абсолютно разные вещи. Т.е. когда игрок толкает ящики - это одно, а когда ящики толкают игрока - совершенно другое.
Но при этом конечно хочется сохранить оригинальную халфовскую физику, лазанье по лестницам и прочее. И как быть? В Физиксе нету нормальных методов для управления игроком. То, что есть, назвать нормальной реализацией язык не поворачивается. Игрок постоянно стрянет в этих объектах, либо упорно их выдавливает куда попало.
Причём в своих же собственных демках (я про PhysX). Что делать?
Я над этой проблемой размышлял почти три недели. И надо признать, без ложной скромности - разрешил, хотя и не до конца, но лучше чем в Source.
Во всяком случае, многие мне говорили, что в ксаш-моде взаимодействие игрока и физтел приятнее реализовано. Вот для всего этого - действительно надо знать и понимать как оно устроено. А своё писать - да ну нафиг.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша я пишу для самообразования
Ну а что ты хотел? Вращение - это всегда непросто. Это же не взаимодействие одного тела с со статической геометрией. Это взаимодействие двух тел, и каждое столкновение влияет на оба тела.
В результате система либо идёт вразнос (когда кубики "взрываются"), либо успокаивается через определенное время. ЧСХ, успокоить систему без слипера крайне непросто. И очень мало движков может этим похвастаться.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
слипер - что это? Гугл молчит =( Или я плохо ищю
Слипер? Ну вот то условие после которого тела засыпают и солвер для них не вызывается. Простейший аналог в халфе - флаг FL_ONGROUND.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша, аа, понял.
У меня Солвер прекращает работу если тела больше не проникают друг в друга
Если так уж хочется писать свою физику - пиши её персонально для халфы либо для всех Quake-движков. Народ переодически пытается прикрутить её к кваке, и каждый раз фейлит, поскольку это вообщем достаточно непростое дело. А если бы был специальный физ. движок заточенный для использования с квакой, то очень бы много народу его с удовольствием использовало, не сомневайся.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша, я не уверен что даже отдельно я его сделаю. Поэтому сначала буду пилить как отдельный движок, а потом уже......
Теперь кубики не взрываются =) Но и не успокаиваются
http://rghost.ru/42333874
не успокаивается, потому что реституции нету )
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша , обязательно попытаюсь её реализовать
pRoxxx OpenGL без всяких плюшек. Тупо треугольники рисовал и в нормаль красил
задроты, круто!
__________________
vk.com/skullcapstudios
marikcool , осталось только вращения доделать, трение - и думаю что будет норм. Из всего для меня самое сложное - вращение
ONeiLL
Сложное это шобы со всем этим игрок коллидил нормально.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro в своем двиге это сделать не сложно. Вот в хл если делать, то да. А тут нет
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
http://rghost.ru/42384104
Уже намного лучше работает =)
Я по доброму завидую школьникам которые могут написать свой собственный физ движок))) Молодец продолжай в том же духе. И прислушайся к советам ДМ. Первая квака с фз движком это же мечта
Cybermax возможно потом когда нибудь..... когда доведу до ума этот физ двиг =)
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
http://rghost.ru/42483010
Зацените плиз. У кого какой ФПС был?
__________________
Gunship Stuff
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
спасибо. Буду оптимизировать.
Добавлено 24-12-2012 в 19:06:
Дядя Миша это что за комп у тебя такой? А глюки какие-то были?
У меня счетчик ФПС менялся так быстро, что я не смог разобрать чотам.
Из самой демки - все доминошки почему то прыгают, хотя должны находиться в состоянии покоя. Ну еще они утопают друг в дружке.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Ща попытаюсь исправить. Возможно у меня ФПС не правильно меряет
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
gamedev.ru - там тоже моя тема
Там мне не хило помогли кстать
Добавлено 24-12-2012 в 20:01:
Вот так нормально?
~150 начале, ~110 в конце. запускал под wine, в фоне крутился расчёт на pythonе
__________________
http://www.moddb.com/mods/monorail-quest
thambs, радует что хоть у кого-то оно 100 даёт
//ну что за бескультурье выкладывать архив без корневой директории.
второй тест 160>100. коробки дрожат после остановки.
__________________
http://www.moddb.com/mods/monorail-quest
а по какому условию ты коробки засыпаешь?
__________________
http://www.moddb.com/mods/monorail-quest
Тоесть? не понял вопрос
у меня всё вот так:
сначала ищем тела, которые пересекаются. Если такие есть, то ищем точки пересечения. Потом по формулам рассчитываем импульсы, и применяем их к телам.
ONeiLL
ну вообще такие вещи дрожжат, из за того, что касание -- вырожденный случай пересечения, и, вследствие ошибок (округления и не только), твой решатель будет постоянно то детектировать столкновение, то его отсутствие. поэтому надо выдумать какое то условие, чтоб он не обрабатывал неподвижные, касающиеся тела. ну первое что ну ум приходит -- запоминать импульсы и моменты импульсов с прошлого кадра, и если они изменились незначительно, то не обрабатывать такое столкновение. это будет аналогом введения фиктивной силы трения -- так часто делают, что бы уберечь от численного разбалтывания <<грубые>> алгоритмы расчёта эволюции системы.
__________________
http://www.moddb.com/mods/monorail-quest
а я кажется понял почему всё трясётся. Я у себя реализовал warmstarting и псевдоскорости. Так эти самые псевдоскорости походу у меня с бажиной
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
ну вот и супер, спасибо вам =)
Добавлено 24-12-2012 в 21:26:
Во: http://www.gamedev.ru/code/forum/?id=69788
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
у него 700 ФПС. Я в шоке. Про такой быстрый collision detection я только мечтать могу. Никак не пойму, как через суму Минковского разделяющую ось найти
Вот мечтай и учись у него. Может он тебе даже даст какое-нибудь напутствие
Мне однажды дал напутствие автор GUNgine. Думаю я вполне оправдал то, что он во мне тогда увидел.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
60fps
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
750 и 100
Ну запустил прогу сначала было 750 потом упало до 150 и потом до 100 и так и осталось
120-90
__________________
vk.com/skullcapstudios
спс. Есть одна идея как ещё можно поднять ФПС......
Решил продолжить работу над движком. Исправил несколько глюков. Но придумать, как его ускорить я что-то не могу никак.
Добавлено 17-01-2013 в 21:44:
и как правильно вставлять видео? [ video][ /video] - и просто пустое место, а плеера нету О_о
Уметь надо. http://www.youtube.com/watch?v=ИДЕНТИФИКАТОР. Всё остальное из адреса удалить.
И так, я уже готов поделится сорсами этого двига. Не знаю, можно ли его где-то заюзать, но просто посмотреть как оно работает думаю можно
http://rghost.ru/43822079
ONeiLL debug информацию студии и ILE ты вложил в архив для солидности?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
случайно
Добавлено 22-02-2013 в 22:53:
хотя, где ты нашёл дебаг инфу? её я вроди потёр
*.sdf - 20 мегабайт.
Ну чтоже посмотрел исходники. Очень даже неплохо написано. А еще из плюсов я бы отметил работающий барнакль. Вот товарищи, учитесь.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
ONeiLL
Интегратор, как я понимаю, обычный, методом прямоугольников? Что-то посеръёзнее прикрутить не пробовал, скажем, велосити-верле?
__________________
Интегратор самый обычный... Что-то покруче делать не пробовал, и думаю что это и не надо. Там столько допущений и упрощений в самом двиге, что точный интегратор это не исправит
Временная зона GMT. Текущее время 10:23. | Показать все 62 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024