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

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

Страницы: 1 2 3 4 Следующая »
#30
14:25, 12 сен. 2009

Добрый день.

Опять появилась проблема, вот кусок кода:

class IndexNxActor { public: NxActor * index; };

IndexNxActor * Actor = new IndexNxActor[countActors]; 

void Функция() // - вызывается каждый кадр
{
gScene->releaseActor(*Actor[tact].index);
Actor[tact].index = CreateSphere(position);
tact++;
if ( tact == countActors) tact = 0;
}


Цель: создать источник актёров (типа частиц), которые исчезают через некоторое время.

Проблема: когда курсор не двигается, всё работет - актёры удаляются,
но когда начинаю двигать курсор, актёры не удаляются.

Такое чувство как будто во время движения курсора происходит изменение указателя Actor[tact].index.

А вообще, может то что я хочу можно сделать по другома?


#31
14:36, 12 сен. 2009

Использую Visual C++ 9, API.
Проект начинал из заготовки от NeHe .

#32
15:27, 12 сен. 2009

Lesson407_Particle_Systems.exe
Посмотри как там сделано и также делай...

#33
11:12, 19 сен. 2009

Executor, спасибо за подсказку.

Подскажите пожалуйста как можно реализовать пулю. А именно, как определить столкновение актёра-пулю с актёром-объектом, и координаты контакта.

Пытался разобрать пример 303 но ничего не понял. В уроке одно описывают, в примере другое, в мануале третье...
Из всех примеров которые я читал по PhysX, этот самый плохой.

#34
13:40, 19 сен. 2009

smt005
>Подскажите пожалуйста как можно реализовать пулю. А именно, как определить столкновение актёра-пулю с актёром-объектом, и координаты контакта.

Я конечно не сильно много видел, но ни разу не видел, что бы пулю делали актором... зачем это?

Недостаточно разве точки с направлением и скоростью и трассировки с текущей позиции до следующей?

#35
14:35, 19 сен. 2009

MNAndrew
> Недостаточно разве точки с направлением и скоростью и трассировки с текущей
> позиции до следующей?
Хочется чтобы пуля летела по законым физики, с рекошетом, а в дальнейшем делать экзотические оружия, где скорость снаряда маленькая и т.д...

#36
15:47, 19 сен. 2009

MNAndrew
> Недостаточно разве точки с направлением и скоростью и трассировки с текущей
> позиции до следующей?

smt005
>Хочется чтобы пуля летела по законым физики, с рекошетом, а в дальнейшем делать экзотические оружия, где скорость снаряда маленькая и т.д...

Чтобы пуля летела по законам физики, я думаю, тебе не очень надо... просто потому, что этого не будет заметно в обычном шутере. А если тебе нужна именно честная баллистика, то поведение актора тебя тоже не устроит. Так что советую сделать без актора, а как я советовал выше.

>, где скорость снаряда маленькая и т.д...

Способ, который я предложил, никак этого не исключает.

Но в любом случае тебе ничего не мешает создавать актор в момент выстрела, давать ему импульс и ловить от него контакт репорт. Но потенциально вижу больше проблем и меньше гибкости в настройке.

Рикошет также ничего не мешает сделать самому.. просто изменить направление пули в точке контакта на нормаль.

PS: не знаю почему ответ получился жирным шрифтом...

#37
16:13, 19 сен. 2009

Трассировка луча не сгодится, если пуля большая, то бишь если это какойто здоровый снаряд... В Ньютоне например есть ConvexCast для такой цели... Поидее работает через контакт репорт и является лишь некоторой упрощённой обёрткой...
С контакт репортами в ФизХ почти не работал, поэтому не могу ничего подсказать, а что конкретно в примере и доке не так?

#38
16:37, 19 сен. 2009

Executor
>Трассировка луча не сгодится, если пуля большая, то бишь если это какойто здоровый снаряд... В Ньютоне например есть ConvexCast для такой цели... Поидее >работает через контакт репорт и является лишь некоторой упрощённой обёрткой...

В физиксе тоже можно сделать свип тест.

You can perform a sweep with an entire actor, including all its constituent shapes, by using the NxActor::linearSweep() method. The results are returned via an NxSweepQueryHit structure.

In the current implementation actor sweep tests are only conducted using the actor shapes which are:

Capsules
Spheres
Boxes

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

А актор.. предполагаю, что у него очень хорошие шансы пролетать сквозь геометрию.. и придется еще ccd крутить.

#39
17:32, 19 сен. 2009

MNAndrew
> Чтобы пуля летела по законам физики, я думаю, тебе не очень надо
Уточню, пусть НЕ пуля, а другое понятие...
> Трассировка луча не сгодится, если пуля большая, то бишь если это какойто здоровый снаряд

Представим: из оружия вылетает шар с диаметром 1 метр и весом 1 кг, летит со скоростью 5 м/с. Врезаясь в стенки он отлетает от них и таких рекошетов может быть много. Соприкасаясь с целью (которых может быть много), он наносит им повреждение (требуется найти точку соприкосновения, направление и силу). И ещё, эти шары могут отскакивать друго от друга.

> ловить от него контакт репорт
> просто изменить направление пули в точке контакта на нормаль.
Вот в этом у меня загвоздка.

Executor
> а что конкретно в примере и доке не так?
Я любитель и не всё понимаю, и пока не могу понять как это сделать - определить какие актёры соприкоснулись, точки, силу и вектор соприкосновения.

MNAndrew
> актор.. предполагаю, что у него очень хорошие шансы пролетать сквозь
> геометрию.. и придется еще ccd крутить.
В этом разве есть проблема или CCD отжирает много ресурсов?

#40
14:57, 20 сен. 2009

Неужели никто не использовал ContactReport?

К примеру, я смог создать вот такое.

Я понимаю что надо сперва инициализировать SDK, потом настроить материал, создать таймер, в дальнейшем запустить симуляцию.
Как создать актёра.

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

----------------------------------------

В уроке описано так:
    // Iterate through the contact points
    NxContactStreamIterator i(pair.stream);

    while(i.goNextPair())
    {
        while(i.goNextPatch())
        {
            const NxVec3& contactNormal = i.getPatchNormal();
            while(i.goNextPoint())
            {
                const NxVec3& contactPoint = i.getPoint();

            }
        }


В примере описано так:
void CheckContacts()
{
  NxU32 nbActors = gScene->getNbActors();
  NxActor** actors = gScene->getActors();
  while(nbActors--)
  {
    NxActor* actor = *actors++;

    // Get our object back
    ActorUserData* ud = (ActorUserData*)actor->userData;
    if (!ud)  continue;

    if (ud->contactEvents != 0)
    {
      // Code for every contact event: starting, ending, during
    }
   
    // Execute code according to events
    if (ud->contactEvents & NX_NOTIFY_ON_START_TOUCH)
    {
      // Code for the pair starting contact
    }
    if (ud->contactEvents & NX_NOTIFY_ON_END_TOUCH)
    {
      // Code for pair ending contact
    }
    if (ud->contactEvents & NX_NOTIFY_ON_TOUCH)
    {
      // Code for the pair in continual contact
    }
  }
}

А в SDK так:
  class MyContactReport : public NxUserContactReport
    {
        void onContactNotify(NxContactPair& pair, NxU32 events)
        {
        //You can read the contact information out of the
        //contact pair data here.
        }
    } myReport;
Then register this object with the SDK as before:
    scene->setUserContactReport(&myReport);

Везде по разному!

И как к примеру создать Pair ?

#41
11:20, 29 сен. 2009

smt005
объясни плиз, что ты имеешь в вижу под созданием pair?
>>void onContactNotify(NxContactPair& pair, NxU32 events)
вот же он у тебя уже есть, бери пользуйся

>>Везде по разному!
везде по разному используется лишь :)
по поводу примера и SDK:
это ActorUserData "твоя" структура, которая содержит информацию о контакте.

class MyContactReport : public NxUserContactReport
вот здесь из пары получают акторы, в userData которым кладут указатель на заполненную структуру.

void CheckContacts()
здесь же просто получают лист акторов из сцены и проверяют ActorUserData

Прошло более 8 месяцев
#42
22:26, 30 мая 2010

Здрасте! :) Появилось время и хочу продолжить, но с контактРепортом не могу разобраться.

>>void onContactNotify(NxContactPair& pair, NxU32 events)
Первый вопрос.

Что такое events?
Как его инициализировать?

#43
22:51, 30 мая 2010

Вот так я сделал.

class MyContactReport : public NxUserContactReport
{
public:
  void onContactNotify(NxContactPair& pair, NxU32 events)
  {

NxContactStreamIterator i(pair.stream);
    while(i.goNextPair())
    {
    Check("Если до сюда дошло, значит это предложение записывается в файл...");
        while(i.goNextPatch())
        {
            const NxVec3& contactNormal = i.getPatchNormal();
            while(i.goNextPoint())
            {
                const NxVec3& contactPoint = i.getPoint();
            }
        }
    }

  }
} myReport;


Потом, в цикле, каждый кадр:

NxContactPair pair;
NxU32 events;

events = NX_NOTIFY_ON_TOUCH;
myReport.onContactNotify( pair, events);


Но ничего не происходит.

Что я делаю неправильно?

В DebugRender, всё нормально, правильно отображается точка соприкосновения двух объектов.

#44
10:50, 31 мая 2010

class MyContactReport : public NxUserContactReport
{
  public:
      void onContactNotify(NxContactPair& pair, NxU32 events)
      {
        if(events & NX_NOTIFY_ON_START_TOUCH) 
            OutputDebugString("Start touch");
 
        if(events & NX_NOTIFY_ON_END_TOUCH)   
            OutputDebugString("End touch");
 
        if(events & NX_NOTIFY_ON_TOUCH)   
            OutputDebugString("Touch");
   
        NxContactStreamIterator i(pair.stream);
   
        while(i.goNextPair())
        {
          Check("Если до сюда дошло, значит это предложение записывается в файл...");
          while(i.goNextPatch())
          {
              const NxVec3& contactNormal = i.getPatchNormal();
              while(i.goNextPoint())
              {
                  const NxVec3& contactPoint = i.getPoint();
              }
          }
        }
  }
};
, а если так?

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

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