HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Newton Dynamics (https://hlfx.ru/forum/showthread.php?threadid=4032)
Отправлено pRoxxx 28-07-2013 в 20:08:
Newton Dynamics
Уже вторую неделю мучаюсь над телом игрока, до этого передвигал его с помощью NewtonBodySetMatrix, всё бы хорошо но боксы иногда таки залетали в игрока. По сему сделал передвижение тела игрока через NewtonSetBodyForce, но тут вылезла новая проблема боком, тело игрока начало вращать при ударах по нему физ боксов. Хотел бы узнать как можно выключить вращение для определенных боксов? И как с этим боролся тов. Xaerox?
Отправлено XaeroX 28-07-2013 в 20:22:
Очень просто. Контроллер игрока реализован по принципу physics shadow. Его двигает движковый код, а за ним каждый кадр телепортируется физбокс. При этом физбоксу надо обновлять скорости, чтобы игрок мог толкать другие объекты.
Минус этого подхода в том, что как следует потоптавшись на каком-нибудь пистолетике
(мелком несолидном объекте, но тем не менее физическом), его можно "продавить" в пол. Но в остальном - всё более-менее работает.
Цитата:
pRoxxx писал:
Хотел бы узнать как можно выключить вращение для определенных боксов?
Поставить огромный момент инерции по всем осям, скажем 1e9?
См. функцию NewtonBodySetMassMatrix.__________________
Отправлено pRoxxx 28-07-2013 в 20:54:
Physics shadow в смысле ? NewtonCreateConvexHullModifier/NewtonConvexHullModifierSetMatrix? Если через NewtonBodySetMatrix то объекты пролетают иногда через игрока ибо мы телепортируем бокс игрока.
Отправлено XaeroX 28-07-2013 в 21:28:
Цитата:
pRoxxx писал:
Physics shadow в смысле ?
Это терминология хл2. В волатиле это просто называется static. И для дверей/поездов, и для игрока.
Цитата:
pRoxxx писал:
Если через NewtonBodySetMatrix то объекты пролетают иногда через игрока ибо мы телепортируем бокс игрока.
Объекты пролетают потому, что это ньютон такой.
Интересно, через сколько времени ты начнёшь его проклинать, а заодно разработчика вместе со всеми его родственниками? Я где-то через полгода начал. 
Ты момент инерции поставил? Что получается?__________________
Отправлено pRoxxx 29-07-2013 в 04:42:
Цитата:
XaeroX писал:
Интересно, через сколько времени ты начнёшь его проклинать, а заодно разработчика вместе со всеми его родственниками? Я где-то через полгода начал.
Уже проклинаю. (= Прошло чуть более полу года.
Цитата:
XaeroX писал:
Ты момент инерции поставил? Что получается?
Да, чуть меньше стал крутиться, на форум им писал, они мне советую на 3.10 переходить ибо там плеер контроллер лучше, только мне этот контроллер не нужен. (=
Отправлено XaeroX 29-07-2013 в 06:36:
Тогда без вариантов, делай shadow.
Если есть желание ковыряться в чужом коде и куча времени, поизучай сорцы физики бетки хл2. Там, правда, хавок, но это не принципиально.
Если желания нет (как у меня), тогда делай статичный объект с огромной массой и двигай его вручную, в коде физики игрока.
Вот код апдейта shadow из волатилы - может, поможет...
C++ Source Code:
1 | void Physics_UpdateShadow( edict_t *ed, bool blocked ) |
3 | vec3_t shadowPos, shadowAngles, shadowAxis0, shadowAxis1, shadowAxis2; |
4 | vec3_t shadowVel, shadowAvel; |
7 | if ( !ed->physicsPrivate ) |
10 | if ( ed->physicsFlags & PHYS_FLAG_RAGDOLL ) { |
11 | NewtonRagdoll_Update( ed ); |
15 | if ( blocked && ( ed->physicsFlags & PHYS_FLAG_BLOCKED ) ) |
18 | NewtonBody *pBody = static_cast<NewtonBody*>(ed->physicsPrivate); |
20 | shadowPos = ConvertPositionToNewton( ed->v.origin ); |
23 | shadowVel = ConvertPositionToNewton( ed->v.velocity ); |
24 | shadowAvel = -ConvertPositionToNewton( ed->v.avelocity ); |
25 | ed->physicsFlags &= ~PHYS_FLAG_BLOCKED; |
29 | ed->physicsFlags |= PHYS_FLAG_BLOCKED; |
32 | #if !defined(__USE_DOUBLE_PRECISION__) |
33 | NewtonBodySetVelocity( pBody, shadowVel ); |
34 | NewtonBodySetOmega( pBody, shadowAvel ); |
36 | dFloat dvel[3], davel[3]; |
37 | for ( int i = 0; i < 3; ++i ) { |
38 | dvel[i] = shadowVel[i]; |
39 | davel[i] = shadowAvel[i]; |
41 | NewtonBodySetVelocity( pBody, dvel ); |
42 | NewtonBodySetOmega( pBody, davel ); |
45 | NewtonUtil_MatrixIdentity4x4( bodyMatrix ); |
47 | if (ed->v.flags & FL_ORIENTED) { |
48 | shadowAxis0 = ConvertAxisToNewton( ed->v.axis0 ); |
49 | shadowAxis1 = ConvertAxisToNewton( ed->v.axis1 ); |
50 | shadowAxis2 = ConvertAxisToNewton( ed->v.axis2 ); |
51 | NewtonUtil_MatrixSetOrientation4x4( bodyMatrix, shadowAxis0, shadowAxis1, shadowAxis2 ); |
53 | shadowAngles = ConvertRotationToNewton( ed->v.angles ); |
54 | NewtonUtil_MatrixSetEulerAngles4x4( bodyMatrix, shadowAngles ); |
56 | NewtonUtil_MatrixSetTranslation4x4( bodyMatrix, shadowPos ); |
57 | NewtonBodySetMatrix( pBody, bodyMatrix ); |
63 | const float offset = 1.0f; |
65 | absMin = ConvertPositionToNewton( ed->v.absmin - vec3_t( offset, offset, offset ) ); |
66 | absMax = ConvertPositionToNewton( ed->v.absmax + vec3_t( offset, offset, offset ) ); |
68 | #if !defined(__USE_DOUBLE_PRECISION__) |
69 | NewtonWorldForEachBodyInAABBDo( g_pWorld, absMin, absMax, NewtonCallback_BodyWake, NULL ); |
71 | dFloat dMin[3], dMax[3]; |
72 | for ( int i = 0; i < 3; ++i ) { |
76 | NewtonWorldForEachBodyInAABBDo( g_pWorld, dMin, dMax, NewtonCallback_BodyWake, NULL ); |
__________________
Отправлено pRoxxx 29-07-2013 в 09:12:
Благодарю, особенно за NewtonWorldForEachBodyInAABBDo, странно что я эту функцию раньше не видел.
Отправлено XaeroX 29-07-2013 в 09:23:
pRoxxx
Незашто. 
Когда-нибудь волатила станет опенсорцной (кстати, где адамикс), тогда посмотришь всю реализацию целиком. Если, конечно, к тому времени не плюнешь на ньютон и не перейдёшь на что-то другое.
__________________
Отправлено Дядя Миша 29-07-2013 в 15:22:
Да гамно этот ваш Нутон, я сразу говорил. Физикс надо юзать.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ONeiLL 29-07-2013 в 15:58:
а что если по приколу момент инерции присвоить 1.0f / 0.0f (типа бесконечность) ? 
Отправлено pRoxxx 30-07-2013 в 06:40:
Цитата:
ONeiLL писал:
а что если по приколу момент инерции присвоить 1.0f / 0.0f (типа бесконечность) ?
С каких пор стало возможно на ноль делить?
Отправлено nemyax 30-07-2013 в 06:46:
Цитата:
pRoxxx писал:
С каких пор стало возможно на ноль делить?
Это видимо в надежде, что ньютон такое отлавливает и обрабатывает. Он в какой-то версии может и поотлавливать, а в следующей возьмёт да и забудет =)
Отправлено XaeroX 30-07-2013 в 07:17:
pRoxxx
Отключай floating point exceptions и дели сколько угодно. 
Но можно значение INF и вручную сформировать, в принципе.
__________________
Отправлено Government-Man 30-07-2013 в 10:25:
Цитата:
XaeroX писал:
Но можно значение INF и вручную сформировать, в принципе.
#include <math.h>
float fl = INFINITY;
Начиная с C99.
Отправлено Дядя Миша 30-07-2013 в 10:38:
Government-Man а NAN есть? 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'