Войти
ПрограммированиеФорумФизика

physx - разные вопросы (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
16:43, 27 авг. 2009

Mephisto std

enum CollisionGroup
{
  GROUP_NON_COLLIDABLE,
  GROUP_COLLIDABLE_NON_PUSHABLE,
  GROUP_COLLIDABLE_PUSHABLE,
};

#define COLLIDABLE_MASK  (1<<GROUP_COLLIDABLE_NON_PUSHABLE)

virtual void NxController::move  (  const NxVec3 &  disp, 
  NxU32  activeGroups, 
  NxF32  minDist, 
  NxU32 &  collisionFlags, 
  NxF32  sharpness = 1.0f, 
  const NxGroupsMask *  groupsMask = NULL
)  [pure virtual]

  Moves the character using a "collide-and-slide" algorithm.

Parameters:
disp  a displacement vector 
activeGroups  a filtering mask for collision groups. If a bit is set, corresponding group is active. 
minDist  the minimum travelled distance to consider. If travelled distance is smaller, the character doesn't move. This is used to stop the recursive motion algorithm when remaining distance to travel is small. 
collisionFlags  returned collision flags, collection of NxControllerFlag 
sharpness  to prevent sudden height changes due to the autostep feature, the motion can be smoothed using a feedback filter. This coefficient defines the amount of smoothing. The smaller, the smoother. (1.0 means no smoothing). 
groupsMask  Alternative mask used to filter shapes, see NxScene::overlapAABBShapes(). 

Другими словами, COLLIDABLE_MASK задаёт то, какие из объектов будут колидится...

> Не хватает нормального описания как в directX.

Чем тебя не устраивает описание?


#16
16:50, 27 авг. 2009

Mephisto std

>либо останавливать перемещение, когда капсула натыкается на объек
Не совсем представляю, как ты собираешься останавливать перемещение...

>Не хватает нормального описания как в directX
Как так не хватает? Вроде там все нормально с этим. Насчет COLLIDABLE_MASK тебе уже сказали. Если выбросить динамики из  COLLIDABLE_MASK, то капсула будет просто проходить через них.

#17
17:33, 27 авг. 2009

Всёё понятно, ребята, спасибо)
Сразу и проблема моя решилась - стол, на который можно запрыгнуть, но и подвинуть.
.надо просто сделать для таких объектов группу скажем TABLEGROUP, при движении контроллера
добавлять её в маску коллизий (если я правильно помню, это так делается

#define COLLISIONMASK (1<<GROUP1) | (1<<GROUP2) | ...
итого у нас контроллер не может двигаться сквозь стол, а чтобы толнуть его, пишем
  virtual NxControllerAction onShapeHit(const NxControllerShapeHit& hit)
  {
    if(hit.shape)
    {
      NxCollisionGroup group = hit.shape->getGroup();
      if(group == GROUP_COLLIDABLE_NON_PUSHABLE)
      {
        NxActor& actor = hit.shape->getActor();
        if(actor.isDynamic())
        {
          // We only allow horizontal pushes. Vertical pushes when we stand on dynamic objects creates
          // useless stress on the solver. It would be possible to enable/disable vertical pushes on
          // particular objects, if the gameplay requires it.  
          if(hit.dir.y==0.0f)
          {
            NxF32 coeff = actor.getMass() * hit.length * 1.0f;
            actor.addForceAtLocalPos(hit.dir*coeff, NxVec3(0,0,0), NX_IMPULSE);
          }
        }
      }
    }
    return NX_ACTION_NONE;
  }
как в сэмпле
Вроде всё получилось)

#18
19:30, 27 авг. 2009

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

#19
22:58, 27 авг. 2009

Mephisto std

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

И вот мы коснулись части, которую целиком писал я.

Вообщем кончилось все тем, что меч сам-собой - вообще без физики. А трассировки на дамаг - сами-собой. Трассировками. Без всяких там триггеров. И еще там много чего пришлось сделать, что бы заработало как надо.

#20
2:08, 28 авг. 2009

MNAndrew
что-то я не вполне понял почему?)
и что такое трассировки в данном случае не вполне понятно...
Мне представлялся вопрос так: сделать меч таким, чтобы он проходил сквозь, но при касании вызывал
контакт репорт. Неужели в физикс такю очевидную вещь не предусмотрели???

К слову, мя жутко бесит как в том же обливионе сделана эта шняга - там где ударить можно только
по одному противнику, даже если меч проходит через всех врагов разом.

#21
8:27, 28 авг. 2009

Mephisto std
>что-то я не вполне понял почему?)
Ну.. в конце-концов было сделано так.. и вроде всех устроило, наверняка можно сделать лучше.

>и что такое трассировки в данном случае не вполне понятно...
Э.. трассировки этож всегда rayCast.

>Мне представлялся вопрос так: сделать меч таким, чтобы он проходил сквозь, но при касании вызывал
>контакт репорт. Неужели в физикс такю очевидную вещь не предусмотрели???
Вот уж не знаю, я так не сильно специалист - думаю можно создать триггер, и он пришлет onEnter, только это не то, что надо.. ведь нам надо именно castClosestShape, чтобы не бить через препятствие.

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

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

PS: игра, что мы делали, называется "черная метка". Поиграй. Конечно сравнивать ее с ААА проектами глупо.. AG ее подопустил, в игромании же написали - "первый вменяемый русский шутер".. я с этим почти соглассен, для нашего разработчика достаточно качественная игра. На AG дема была.

#22
17:46, 28 авг. 2009

MNAndrew
а, помню помню) хороший проект, до ААА не дотягивает только наполнением - модельки там, сюжет). А двиг вот вполне мощен!

>Вот уж не знаю, я так не сильно специалист - думаю можно создать триггер, и он пришлет onEnter, только это не то, что надо.. ведь нам надо именно >castClosestShape, чтобы не бить через препятствие.
По поводу препятствия - я ваще хочу сделать, чтоб, если меч на что наткнулся - сразу удар прекратился, а то надоело, что все
через стены машут - ерунда какая-то)

>>и что такое трассировки в данном случае не вполне понятно...
>Э.. трассировки этож всегда rayCast.
Те вы брали основание меча, выпускали оттуда короткий луч и смотрели, куда он вперится?

#23
18:19, 28 авг. 2009

Mephisto std
>По поводу препятствия - я ваще хочу сделать, чтоб, если меч на что наткнулся - сразу удар прекратился, а то надоело, что все
>через стены машут - ерунда какая-то)

В черной метке так и сделано.

>Те вы брали основание меча, выпускали оттуда короткий луч и смотрели, куда он вперится?

Ну.. примерно так. Только не основание меча, а специальный даммик, который анимировал аниматор, т.е. он мог быть и не в начале меча ( например при ударах ногами )... и луч был не такой уж короткий ( он у каждого перса настраивался.. но как правило был метра 2 уж точно, что сильно больше, чем визуальная часть меча ).. потом пускался не один луч, а делалось несколько апроксимаций, между позой предудущего кадра и текущего..

Вообщем там все не так просто.. не в том смысле, что уж действительно сложно.. но и не просто луч.

#24
21:20, 28 авг. 2009

MNAndrew
Я сперва попробую триггерами, если не устроит - будем по-твоему)
спасибо тебе за помощь)

#25
19:59, 31 авг. 2009

новый вопрос!
Возможно ли у уже готового объекта переключать тип? кинематический-статический-динамический?
для чего нужно: сделать хочу рэгдолл, обычно скелет кинематический, но при смерти он должен становится кинематическим.
Пытаюсь понять, как это сделать?

#26
21:22, 31 авг. 2009

Mephisto std
> Возможно ли у уже готового объекта переключать тип? кинематический-статический-динамический?

Ну лови кусок из сдк.

To create a kinematic actor, first create a dynamic actor, and then set its kinematic flag either in the body descriptor or with NxActor::raiseBodyFlag(NX_BF_KINEMATIC). When you want the kinematic actor to become a normal dynamic body again, turn off the kinematic flag with clearBodyFlag(NX_BF_KINEMATIC).

Вот еще кусок

NX_BF_FROZEN_POS_X  Enable/disable freezing for this body/actor.

Note:
This is an EXPERIMENTAL feature which doesn't always work on in all situations, e.g. for actors which have joints connected to them.

To freeze an actor is a way to simulate that it is static. The actor is however still simulated as if it was dynamic, it's position is just restored after the simulation has finished. A much more stable way to make an actor temporarily static is to raise the NX_BF_KINEMATIC flag.

т.е. какая тебе разница - статик или кинематик актор?

#27
19:27, 2 сен. 2009

ща попробую - забавно нарно будет выглядеть)

#28
16:03, 5 сен. 2009

Добрый день.

Использую С++...
Мне требуется сделать так чтобы актёр имеющий вес, висел в воздухе.

Пытался применять силу в верх, но как определить эту силу, равную отрицательной силе тяжести у меня не получается.

По идее, F = m * a;

m = ...... ->getMass() // - так находится масса актёра
a = 9.8;
NxVec3 Vector (0, 0, 1); // вектор силы

Но ничего не получается, силы не достаточно, актёр падает вниз почти так же как если не применять силу.

Подскажите пожалуйста как решить задачку.

#29
16:12, 5 сен. 2009

smt005
можно так сделать
actor->raiseBodyFlag(NX_BF_DISABLE_GRAVITY);

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумФизика

Тема в архиве.