Как определить мировую границу для PhysX в UE4? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь использовать PxBroadPhaseType::eMBP alogrithm для моего проекта ue4.

Как упомянуто в документе:

PxBroadPhaseType :: eMBP - это новый алгоритм, представленный в PhysX 3.3. Это альтернативный широкофазный алгоритм, который не страдает от тех же проблем с производительностью, что и eSAP, когда все объекты движутся или при вставке большого количества объектов. Однако его общая производительность, когда многие объекты спят, может быть ниже, чем у eSAP, и для работы требуется, чтобы пользователи определяли границы мира.

Но где я могу определить границы мира? Я не могу найти такую ​​переменную в PxSceneDesc или PxScene.

1 Ответ

0 голосов
/ 21 ноября 2018

Следуя этой статье: https://wessamfathi.com/2018/04/17/the-case-of-million-collision-bodies/ мне кажется, что вам нужно определить PxBroadPhaseRegion и добавить их в вашу сцену.

 if (UPhysicsSettings::Get()->bEnableMBPForBroadphase)
{
    PSceneDesc.broadPhaseType = PxBroadPhaseType::eMBP;
}

bool bIsValid = PSceneDesc.isValid();
if (!bIsValid)
{
    UE_LOG(LogPhysics, Log, TEXT("Invalid PSceneDesc"));
}

// Create scene, and add to map
PxScene* PScene = GPhysXSDK->createScene(PSceneDesc);

if (UPhysicsSettings::Get()->bEnableMBPForBroadphase && PScene->getBroadPhaseType())
{
    TArray<PxBounds3> Regions;
    const uint32 SubDivs = UPhysicsSettings::Get()->MBPRegionSubdiv;
    Regions.SetNumUninitialized(SubDivs * SubDivs);

    const PxBounds3 LevelBounds = PxBounds3::centerExtents(PxVec3(PxZero), U2PVector(UPhysicsSettings::Get()->MBPWorldBounds));

    PxU32 Num = PxBroadPhaseExt::createRegionsFromWorldBounds(Regions.GetData(), LevelBounds, SubDivs, 2);
    check(Num == SubDivs * SubDivs);

    for (const PxBounds3& Bounds : Regions)
    {
        PxBroadPhaseRegion Region;
        Region.bounds = Bounds;
        Region.userData = nullptr;
        PScene->addBroadPhaseRegion(Region);
    }
}
...