HLFX.Ru Forum Страницы (5): [1] 2 3 4 5 »
Показать все 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)


Отправлено ONeiLL 17-12-2012 в 19:03:

Физика

Всем здрасте, давно я сюда не заходил....
Началось всё так: что-то стукнуло мне по башке и я решил написать свой физдвижок. Причём на ФПС и т.д. мне было наплевать Мне для начала хотелось написать просто физику, которая бы была похожа на настоящую. Сначало всё шло хорошо, колижн детектор очень хорошо получился. Но дальше надо было писать солвер. Так как я только в 9 класе, у меня нету необходимых знаний по физике. Но всё же, я решил сделать для начала физку хотябы без учёта угловой скорости. Вот что из этого получилось: http://rghost.ru/42319766

Да, знаю, это физикой назвать сложно, но всё же она почти как в ХЛ =)
Потом я всё таки попытался добавить вращение, и получилось из этого нечто нехорошее:
http://rghost.ru/42320019

А теперь просьба к знающим людям ( к ксероксу, в волатиле помойму норм физика, или к ДМу, ведь в ксаше тоже есть физика ), помочь мне доделать мой физдвижок, а именно вращения, или хотябы обьяснить, как высчитываеться угловая скорость и привести все необходимые формулы
Зарание спасибо

Добавлено 17-12-2012 в 22:03:

Сомневаюсь, но возможно в поиске проблем вам поможет кусок кода:

C++ Source Code:
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
}


Отправлено XaeroX 17-12-2012 в 19:06:

ONeiLL
Я в физике ничего не понимаю, в волатиле - Newton Game Dynamics.

Цитата:
ONeiLL писал:
как высчитываеться угловая скорость и привести все необходимые формулы

Наверное, надо гуглить "момент инерции", "теорема штейнера" и т.п...

__________________

xaerox on Vivino


Отправлено ONeiLL 17-12-2012 в 19:07:

XaeroX спс, буду искать инфу =)


Отправлено Дядя Миша 17-12-2012 в 19:25:

вы уже определились что мы подразумеваем под "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'


Отправлено ONeiLL 17-12-2012 в 19:35:

Дядя Миша я пишу для самообразования

Цитата:
Дядя Миша писал:
Я надеюсь это значение потом не берется как углы эйлера?

Конечно же нет

У меня в движке только ФПС проседает сильно, ну и нету поворотов. Вот так.... Уже пол дня долбусь с этими вращениями

Добавлено 17-12-2012 в 22:35:

Вот последняя демка, только без вращений
http://rghost.ru/42321402


Отправлено Дядя Миша 17-12-2012 в 19:37:

Ну а что ты хотел? Вращение - это всегда непросто. Это же не взаимодействие одного тела с со статической геометрией. Это взаимодействие двух тел, и каждое столкновение влияет на оба тела.
В результате система либо идёт вразнос (когда кубики "взрываются"), либо успокаивается через определенное время. ЧСХ, успокоить систему без слипера крайне непросто. И очень мало движков может этим похвастаться.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ONeiLL 17-12-2012 в 19:39:

слипер - что это? Гугл молчит =( Или я плохо ищю


Отправлено Дядя Миша 17-12-2012 в 19:42:

Слипер? Ну вот то условие после которого тела засыпают и солвер для них не вызывается. Простейший аналог в халфе - флаг 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'


Отправлено ONeiLL 17-12-2012 в 19:44:

Дядя Миша, аа, понял.
У меня Солвер прекращает работу если тела больше не проникают друг в друга


Отправлено Дядя Миша 17-12-2012 в 20:47:

Если так уж хочется писать свою физику - пиши её персонально для халфы либо для всех Quake-движков. Народ переодически пытается прикрутить её к кваке, и каждый раз фейлит, поскольку это вообщем достаточно непростое дело. А если бы был специальный физ. движок заточенный для использования с квакой, то очень бы много народу его с удовольствием использовало, не сомневайся.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ONeiLL 18-12-2012 в 12:55:

Дядя Миша, я не уверен что даже отдельно я его сделаю. Поэтому сначала буду пилить как отдельный движок, а потом уже......

Теперь кубики не взрываются =) Но и не успокаиваются
http://rghost.ru/42333874


Отправлено Дядя Миша 18-12-2012 в 15:32:

не успокаивается, потому что реституции нету )

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ONeiLL 18-12-2012 в 16:00:

Дядя Миша , обязательно попытаюсь её реализовать


Отправлено pRoxxx 18-12-2012 в 16:00:

Цитата:
ONeiLL писал:
Дядя Миша, я не уверен что даже отдельно я его сделаю. Поэтому сначала буду пилить как отдельный движок, а потом уже......

Теперь кубики не взрываются =) Но и не успокаиваются
http://rghost.ru/42333874

LOL как на батуте, а что за рендер такой ужасный?


Отправлено ONeiLL 18-12-2012 в 16:14:

pRoxxx OpenGL без всяких плюшек. Тупо треугольники рисовал и в нормаль красил


Временная зона GMT. Текущее время 04:59. Страницы (5): [1] 2 3 4 5 »
Показать все 62 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024