HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Newton Dynamics
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
pRoxxx
Житель форума

Дата регистрации: Jan 2011
Проживает: UA DP
Сообщений: 360
Возраст: 32

Рейтинг



Newton Dynamics

Уже вторую неделю мучаюсь над телом игрока, до этого передвигал его с помощью NewtonBodySetMatrix, всё бы хорошо но боксы иногда таки залетали в игрока. По сему сделал передвижение тела игрока через NewtonSetBodyForce, но тут вылезла новая проблема боком, тело игрока начало вращать при ударах по нему физ боксов. Хотел бы узнать как можно выключить вращение для определенных боксов? И как с этим боролся тов. Xaerox?

Сообщить модератору | | IP: Записан
Сообщение: 123471

Старое сообщение 28-07-2013 20:08
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Очень просто. Контроллер игрока реализован по принципу physics shadow. Его двигает движковый код, а за ним каждый кадр телепортируется физбокс. При этом физбоксу надо обновлять скорости, чтобы игрок мог толкать другие объекты.
Минус этого подхода в том, что как следует потоптавшись на каком-нибудь пистолетике
(мелком несолидном объекте, но тем не менее физическом), его можно "продавить" в пол. Но в остальном - всё более-менее работает.

Цитата:
pRoxxx писал:
Хотел бы узнать как можно выключить вращение для определенных боксов?

Поставить огромный момент инерции по всем осям, скажем 1e9?
См. функцию NewtonBodySetMassMatrix.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 123472

Старое сообщение 28-07-2013 20:22
-
pRoxxx
Житель форума

Дата регистрации: Jan 2011
Проживает: UA DP
Сообщений: 360
Возраст: 32

Рейтинг



Physics shadow в смысле ? NewtonCreateConvexHullModifier/NewtonConvexHullModifierSetMatrix? Если через NewtonBodySetMatrix то объекты пролетают иногда через игрока ибо мы телепортируем бокс игрока.

Сообщить модератору | | IP: Записан
Сообщение: 123473

Старое сообщение 28-07-2013 20:54
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
pRoxxx писал:
Physics shadow в смысле ?

Это терминология хл2. В волатиле это просто называется static. И для дверей/поездов, и для игрока.
Цитата:
pRoxxx писал:
Если через NewtonBodySetMatrix то объекты пролетают иногда через игрока ибо мы телепортируем бокс игрока.

Объекты пролетают потому, что это ньютон такой.
Интересно, через сколько времени ты начнёшь его проклинать, а заодно разработчика вместе со всеми его родственниками? Я где-то через полгода начал.

Ты момент инерции поставил? Что получается?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 123474

Старое сообщение 28-07-2013 21:28
-
pRoxxx
Житель форума

Дата регистрации: Jan 2011
Проживает: UA DP
Сообщений: 360
Возраст: 32

Рейтинг



Цитата:
XaeroX писал:
Интересно, через сколько времени ты начнёшь его проклинать, а заодно разработчика вместе со всеми его родственниками? Я где-то через полгода начал.

Уже проклинаю. (= Прошло чуть более полу года.
Цитата:
XaeroX писал:
Ты момент инерции поставил? Что получается?

Да, чуть меньше стал крутиться, на форум им писал, они мне советую на 3.10 переходить ибо там плеер контроллер лучше, только мне этот контроллер не нужен. (=

Сообщить модератору | | IP: Записан
Сообщение: 123475

Старое сообщение 29-07-2013 04:42
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Тогда без вариантов, делай shadow.
Если есть желание ковыряться в чужом коде и куча времени, поизучай сорцы физики бетки хл2. Там, правда, хавок, но это не принципиально.
Если желания нет (как у меня), тогда делай статичный объект с огромной массой и двигай его вручную, в коде физики игрока.
Вот код апдейта shadow из волатилы - может, поможет...

C++ Source Code:
1
void Physics_UpdateShadow( edict_t *ed, bool blocked )
2
{
3
  vec3_t shadowPos, shadowAngles, shadowAxis0, shadowAxis1, shadowAxis2;
4
  vec3_t shadowVel, shadowAvel;
5
  dFloat bodyMatrix[16];
6
 
7
  if ( !ed->physicsPrivate )
8
    return;
9
 
10
  if ( ed->physicsFlags & PHYS_FLAG_RAGDOLL ) {
11
    NewtonRagdoll_Update( ed );
12
    return;
13
  }
14
 
15
  if ( blocked && ( ed->physicsFlags & PHYS_FLAG_BLOCKED ) )
16
    return;
17
 
18
  NewtonBody *pBody = static_cast<NewtonBody*>(ed->physicsPrivate);
19
 
20
  shadowPos = ConvertPositionToNewton( ed->v.origin );
21
 
22
  if (!blocked) {
23
    shadowVel = ConvertPositionToNewton( ed->v.velocity );
24
    shadowAvel = -ConvertPositionToNewton( ed->v.avelocity );
25
    ed->physicsFlags &= ~PHYS_FLAG_BLOCKED;
26
  } else {
27
    shadowVel.Clear();
28
    shadowAvel.Clear();
29
    ed->physicsFlags |= PHYS_FLAG_BLOCKED;
30
  }
31
 
32
#if !defined(__USE_DOUBLE_PRECISION__)
33
  NewtonBodySetVelocity( pBody, shadowVel );
34
  NewtonBodySetOmega( pBody, shadowAvel );
35
#else
36
  dFloat dvel[3], davel[3];
37
  for ( int i = 0; i < 3; ++i ) {
38
    dvel[i] = shadowVel[i];
39
    davel[i] = shadowAvel[i];
40
  }
41
  NewtonBodySetVelocity( pBody, dvel );
42
  NewtonBodySetOmega( pBody, davel );
43
#endif
44
 
45
  NewtonUtil_MatrixIdentity4x4( bodyMatrix );
46
 
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 );
52
  } else {
53
    shadowAngles = ConvertRotationToNewton( ed->v.angles );
54
    NewtonUtil_MatrixSetEulerAngles4x4( bodyMatrix, shadowAngles );
55
  }
56
  NewtonUtil_MatrixSetTranslation4x4( bodyMatrix, shadowPos );
57
  NewtonBodySetMatrix( pBody, bodyMatrix );
58
 
59
  if ( !blocked )
60
  {
61
    vec3_t absMin;
62
    vec3_t absMax;
63
    const float offset = 1.0f;
64
 
65
    absMin = ConvertPositionToNewton( ed->v.absmin - vec3_t( offset, offset, offset ) );
66
    absMax = ConvertPositionToNewton( ed->v.absmax + vec3_t( offset, offset, offset ) );
67
 
68
#if !defined(__USE_DOUBLE_PRECISION__)
69
    NewtonWorldForEachBodyInAABBDo( g_pWorld, absMin, absMax, NewtonCallback_BodyWake, NULL );
70
#else
71
    dFloat dMin[3], dMax[3];
72
    for ( int i = 0; i < 3; ++i ) {
73
      dMin[i] = absMin[i];
74
      dMax[i] = absMax[i];
75
    }
76
    NewtonWorldForEachBodyInAABBDo( g_pWorld, dMin, dMax, NewtonCallback_BodyWake, NULL );
77
#endif
78
  }
79
}

__________________

Сообщить модератору | | IP: Записан
Сообщение: 123477

Старое сообщение 29-07-2013 06:36
-
pRoxxx
Житель форума

Дата регистрации: Jan 2011
Проживает: UA DP
Сообщений: 360
Возраст: 32

Рейтинг



Благодарю, особенно за NewtonWorldForEachBodyInAABBDo, странно что я эту функцию раньше не видел.

Сообщить модератору | | IP: Записан
Сообщение: 123479

Старое сообщение 29-07-2013 09:12
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


pRoxxx
Незашто.
Когда-нибудь волатила станет опенсорцной (кстати, где адамикс), тогда посмотришь всю реализацию целиком. Если, конечно, к тому времени не плюнешь на ньютон и не перейдёшь на что-то другое.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 123480

Старое сообщение 29-07-2013 09:23
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Да гамно этот ваш Нутон, я сразу говорил. Физикс надо юзать.

__________________
My Projects: download page

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

Цитата:

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

Сообщить модератору | | IP: Записан
Сообщение: 123491

Старое сообщение 29-07-2013 15:22
-
ONeiLL
CrazyUkrainian

Дата регистрации: Dec 2011
Проживает: Украина, Житомир
Сообщений: 562
Возраст: 26

Рейтинг



а что если по приколу момент инерции присвоить 1.0f / 0.0f (типа бесконечность) ?

Отредактировано ONeiLL 29-07-2013 в 16:12

Сообщить модератору | | IP: Записан
Сообщение: 123492

Старое сообщение 29-07-2013 15:58
- За что?
pRoxxx
Житель форума

Дата регистрации: Jan 2011
Проживает: UA DP
Сообщений: 360
Возраст: 32

Рейтинг



Цитата:
ONeiLL писал:
а что если по приколу момент инерции присвоить 1.0f / 0.0f (типа бесконечность) ?

С каких пор стало возможно на ноль делить?

Сообщить модератору | | IP: Записан
Сообщение: 123507

Старое сообщение 30-07-2013 06:40
- За что?
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4136

Рейтинг



Цитата:
pRoxxx писал:
С каких пор стало возможно на ноль делить?

Это видимо в надежде, что ньютон такое отлавливает и обрабатывает. Он в какой-то версии может и поотлавливать, а в следующей возьмёт да и забудет =)

Сообщить модератору | | IP: Записан
Сообщение: 123508

Старое сообщение 30-07-2013 06:46
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


pRoxxx
Отключай floating point exceptions и дели сколько угодно.
Но можно значение INF и вручную сформировать, в принципе.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 123511

Старое сообщение 30-07-2013 07:17
-
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


Цитата:
XaeroX писал:
Но можно значение INF и вручную сформировать, в принципе.


#include <math.h>
float fl = INFINITY;

Начиная с C99.

Сообщить модератору | | IP: Записан
Сообщение: 123518

Старое сообщение 30-07-2013 10:25
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



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'

Сообщить модератору | | IP: Записан
Сообщение: 123519

Старое сообщение 30-07-2013 10:38
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 03:20. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Newton Dynamics
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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