Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Архитектура подписывания на события PhysX

05.11.2016, 21:08. Показов 1561. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые форумчане. Пишу игровой движок на основе ECS. (В ученических целях). Есть небольшой вопросик по поводу архитектуры постоения.
Итак:
В движке для симуляции физики использую библиотеку PhysX от NVidia. В PhysX, чтобы получить доступ к информации о столкновении нужно написать кастомный FilterShader - функцию, которая будет выполняться каждый раз, когда произошло то или иное столкновение. Если нужно реагировать/не реагировать на столкновение, то в этой функции выставляются специальные флаги(enum). К примеру вот мой FilterShader:
Объявление
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef VEHICLEFILTERSHADER_H
#define VEHICLEFILTERSHADER_H
 
#include "BTSFramework.h"
 
enum
{
    COLLISION_FLAG_GROUND           =   1 << 0,
    COLLISION_FLAG_WHEEL            =   1 << 1,
    COLLISION_FLAG_CHASSIS          =   1 << 2,
    COLLISION_FLAG_OBSTACLE         =   1 << 3,
    COLLISION_FLAG_DRIVABLE_OBSTACLE=   1 << 4,
    COLLISION_FLAG_BULLET           =   1 << 5,
 
    COLLISION_FLAG_GROUND_AGAINST   =                                                           COLLISION_FLAG_CHASSIS | COLLISION_FLAG_OBSTACLE | COLLISION_FLAG_DRIVABLE_OBSTACLE,
    COLLISION_FLAG_WHEEL_AGAINST    =                                   COLLISION_FLAG_WHEEL |  COLLISION_FLAG_CHASSIS | COLLISION_FLAG_OBSTACLE,
    COLLISION_FLAG_CHASSIS_AGAINST  =           COLLISION_FLAG_GROUND | COLLISION_FLAG_WHEEL |  COLLISION_FLAG_CHASSIS | COLLISION_FLAG_OBSTACLE | COLLISION_FLAG_DRIVABLE_OBSTACLE,
    COLLISION_FLAG_OBSTACLE_AGAINST =           COLLISION_FLAG_GROUND | COLLISION_FLAG_WHEEL |  COLLISION_FLAG_CHASSIS | COLLISION_FLAG_OBSTACLE | COLLISION_FLAG_DRIVABLE_OBSTACLE,
    COLLISION_FLAG_DRIVABLE_OBSTACLE_AGAINST=   COLLISION_FLAG_GROUND                        |  COLLISION_FLAG_CHASSIS | COLLISION_FLAG_OBSTACLE | COLLISION_FLAG_DRIVABLE_OBSTACLE,
    COLLISION_FLAG_BULLET_AGAINST   =           COLLISION_FLAG_GROUND | COLLISION_FLAG_WHEEL |  COLLISION_FLAG_CHASSIS | COLLISION_FLAG_OBSTACLE | COLLISION_FLAG_DRIVABLE_OBSTACLE,
};
 
PxFilterFlags VehicleFilterShader
(PxFilterObjectAttributes attributes0, PxFilterData filterData0, 
 PxFilterObjectAttributes attributes1, PxFilterData filterData1,
 PxPairFlags& pairFlags, const void* constantBlock, PxU32 constantBlockSize);
 
#endif VEHICLEFILTERSHADER_H
Определение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "VehicleFilterShader.h"
 
PxFilterFlags VehicleFilterShader
(PxFilterObjectAttributes attributes0, PxFilterData filterData0, 
 PxFilterObjectAttributes attributes1, PxFilterData filterData1,
 PxPairFlags& pairFlags, const void* constantBlock, PxU32 constantBlockSize)
{
    PX_UNUSED(attributes0);
    PX_UNUSED(attributes1);
    PX_UNUSED(constantBlock);
    PX_UNUSED(constantBlockSize);
 
    if( (0 == (filterData0.word0 & filterData1.word1)) && (0 == (filterData1.word0 & filterData0.word1)) )
        return PxFilterFlag::eSUPPRESS;
 
        pairFlags = PxPairFlag::eCONTACT_DEFAULT;
 
        if( ( filterData0.word0 == COLLISION_FLAG_BULLET ) )
         pairFlags |= PxPairFlag::eNOTIFY_TOUCH_PERSISTS;
 
    return PxFilterFlags();
}
Флаги естественно выставляются не просто так, а для того, чтобы выполнилось то, или иное событие. Чтобы реализовать события в PhysX, нужно наследоваться от класса PxSimulationEventCallback, и переопределить все чисто виртуальные методы:
Объявление:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef MYEVENTCALLBACK_H
#define MYEVENTCALLBACK_H
 
#include "BTSFramework.h"
 
using namespace BTSFramework;
 
class MyEventCallback : public PxSimulationEventCallback
{
public:
    void onConstraintBreak(PxConstraintInfo* constraints, PxU32 count);
    void onWake(PxActor** actors, PxU32 count);
    void onSleep(PxActor** actors, PxU32 count);
    void onContact(const PxContactPairHeader& pairHeader, const PxContactPair* pairs, PxU32 nbPairs);
    void onTrigger(PxTriggerPair* pairs, PxU32 count);
};
 
#endif MYEVENTCALLBACK_H
Определение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "MyEventCallback.h"
 
void MyEventCallback :: onConstraintBreak(PxConstraintInfo* constraints, PxU32 count)
{
}
 
void MyEventCallback :: onWake(PxActor** actors, PxU32 count)
{
}
 
void MyEventCallback :: onSleep(PxActor** actors, PxU32 count)
{
}
 
void MyEventCallback :: onContact(const PxContactPairHeader& pairHeader, const PxContactPair* pairs, PxU32 nbPairs)
{
}
 
void MyEventCallback :: onTrigger(PxTriggerPair* pairs, PxU32 count)
{
}
Собственно, теперь задача. Есть к примеру система, которая занимается проверкой нажатия кнопки "Огонь", и если она нажата, то собственно создает снаряд, и направляет его в ту сторону, куда направлена пушка. Вот как это реализовано у меня:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
...
void MissileControllerSystem :: executeSystem()
{
    for( auto btsComponent : _btsComponents )
    {
        if( BTSInput :: getInstance() -> isKeyReleased( VK_SPACE ) )
        {
            // Получаем все необходимые данные
            auto        componentMissle     =   static_cast<ComponentControllerMissile*>( btsComponent );
            auto        recoilObjects       =   componentMissle -> getRecoilObjects();
            float       speed               =   componentMissle -> getSpeed();
            auto        objectMissile       =   componentMissle -> getObject();
 
            auto        componentTransform  =   objectMissile       ->  getComponentTransform();
            XMFLOAT3    rotationMissile     =   componentTransform  ->  getGlobalRotation();
            auto        directionCannon     =   XMVector3Transform( XMVectorSet( 0.0f, 0.0f, 1.0f, 0.0f ), XMMatrixRotationRollPitchYaw( rotationMissile.x, rotationMissile.y , rotationMissile.z ) );
 
            // Создаем снаряд
            createRocketObject( *objectMissile, speed, directionCannon );
 
            // Придаем отдачу всем зависимым объектам
            for( auto recoilObject : recoilObjects )
            {
                auto componentRigidBody     =   recoilObject -> findComponent<BTSComponentRigidBody>();
                auto rigidBody              =   static_cast<PxRigidDynamic*>( componentRigidBody -> getPhysicsActor() );
 
                rigidBody                   ->  setLinearVelocity( PxVec3( -directionCannon.x * speed / 25, -1.0f, -directionCannon.z * speed / 25 ) );
            }
        }
    }
}
...
Все круто работает. Просто замечательно Тут возникла нужна удалять снаряд при столкновении с чем-либо....и тут ступр...
В FilterShader, который я описал выше, я написал вот так:
C++
1
2
3
4
...
    if( ( filterData0.word0 == COLLISION_FLAG_BULLET ) )
        pairFlags |= PxPairFlag::eNOTIFY_TOUCH_PERSISTS;
...
Это значит, что если коллизия связана с снарядом, то выставляем флаг PxPairFlag::eNOTIFY_TOUCH_PERSISTS, который непосредственно будет вызывать onContact(const PxContactPairHeader& pairHeader, const PxContactPair* pairs, PxU32 nbPairs) из класса MyEventCallback, который я тоже описал выше. Все круто, все тоже работает. При столкновении снаряда сразу же выполняется событие onContact(...)

Теперь вопрос: Как мне все это более грамотно написать? Чтобы я не передавал в MyEventCallback объект снаряда, там не удалял его в onContact, а как нибудь более логично. Без костылей.
Нужно что-то типо такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
...
void RocketSystem :: executeSystem()
{
    for( auto btsComponent : _btsComponents )
    {
        auto componentRocket    =   static_cast<ComponentRocket*>( btsComponent );
        auto objectRocket       =   componentRocket -> getObject();
        
        if( componentRocket -> isCollision() )
            removeRocketObject( *objectRocket );
    }
}
...
Или фиг знает, может есть идеи?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.11.2016, 21:08
Ответы с готовыми решениями:

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

Как изменить алгоритм подписывания SOAP-сообщения на асимметричный
Делаю клиента, в котором нужно подписать сообщение при помощи rsa-sha1, но, используя WSHttpBinding, выдается алгоритм hmac-sha1, на что...

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и как ее исправить?

1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
08.11.2016, 21:14  [ТС]
Кто нибудь Знает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2016, 21:14
Помогаю со студенческими работами здесь

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

Ошибка "в указанном dsn архитектура драйвера и архитектура приложения"
Вот такая ошибка при нажатии на кнопку &quot;Проверить соединение&quot; Я прочитал, что это возможно из за того, что моя система 64, а...

Nvidia PhysX
выскакивает такая ошибка ,как решить?

Подружить PhysX с Qt
Здравствуйте! Вообщем нужно подключить PhysX к проекту Qt, дык вот незадача, PhysX не компилится под MinGW, поэтому в Qt Creator он не...

nvidia PhysX
ситуация такова... Удалил через &quot;программы и компоненты&quot; nvidia PhysX... начал устанавливать его заново пишет ошибку &quot;installation...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru