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

physx sdk 2.8.3 (2 стр)

Страницы: 1 2
#15
9:32, 12 янв 2010

>А сколько времени прошло? Месяц есть? Если нет, то жди.
три дня всего)) Ясно, буду ждать...

>Да скачайте 2.8.1, если так надо -> http://download.chip.eu/ru/download_ru_4689047.html
Да этот у меня есть уже, если честно. У меня возникла проблема с NxCharacter.dll
при вызове NxControllerManager createController(scene, desc); падает с access violation reading чего-то там. При том, что пример Lesson1201_Character_Controller работает. Вроде делаю все правильно, проблема видимо с совместимостью dll. На каком-то форуме у кого-то была такая же проблема, и все решили что проблема в этом. Он переименовал NxCharacterCHECKED.dll в NxCharacter.dll и все заработало. Мне это не помогло.

Еще вопрос по static triangle meshes. У меня мир исходно solid - твердое вещество, в котором прорезается воздух(csg) .
Ну как скала, в которой вырубаются помещения. То есть в самом простом случае это куб с вывернутыми нормалями. Так вот если бросить небольшой(0.2 метра) обьект примерно с 10 метров так, чтобы он успел набрать скорость, то он пролетит сквозь пол((. SKIN_WIDTH стандартный - 2.5 см. Увеличение его отчасти помогает, но это не решение. Я так понимаю, physx нужен пол, имеющий хоть какую-то толщину?. В моем случае это невозможно.

Можно как-то ограничить макс скорость/дельту перемещения обьекта?

http://img85.imageshack.us/img85/628/95481673.jpg

#16
10:07, 12 янв 2010

Ящер
> NxControllerManager createController(scene, desc);
Полностью перекомпилируй проект. И убери старые pch.

> Еще вопрос по static triangle meshes. У меня мир исходно solid - твердое
> вещество, в котором прорезается воздух(csg) .
> Ну как скала, в которой вырубаются помещения. То есть в самом простом случае
> это куб с вывернутыми нормалями. Так вот если бросить небольшой(0.2 метра)
> обьект примерно с 10 метров так, чтобы он успел набрать скорость, то он
> пролетит сквозь пол((. SKIN_WIDTH стандартный - 2.5 см. Увеличение его отчасти
> помогает, но это не решение. Я так понимаю, physx нужен пол, имеющий хоть
> какую-то толщину?. В моем случае это невозможно.
Разберись с CCD.

#17
10:33, 12 янв 2010

> Полностью перекомпилируй проект. И убери старые pch.
попробую. Хотя ребилд то я уже вроде делал.
> Разберись с CCD.
оо, спасибо! Похоже это чудесная весчь)) Теперь я знаю, куда копать.

Image Hosting

#18
10:50, 12 янв 2010

Все равно падает, не в этом дело. Ладно.

Сложно вообще сделать простенькую физику персонажа, в частности игрока(вид от первого лица) стандартными методами? Скажем, капсулой + 6d joint для "всегда вертикального" положения туловища? И прикладывать к ней силы(скорости?)? Тогда по лестнице как ее перемещать? Прыгать можно только в момент, когда стоишь на земле, а как это узнать?

Я всего три дня занимаюсь physX. Мне просто не хочется глубоко вникать в работу физ. движка, так как физика у меня второстепенна и "вся в себе". Такого количества возможностей мне не надо. Для начала хотелось бы просто побродить от первого лица и периодически натыкаться на стены и ящики.

#19
11:42, 12 янв 2010

Ящер
> Все равно падает, не в этом дело. Ладно.
А где лежит NxCharacter.dll? И соответствует ли его версия версии .lib и PhysX SDK.

#20
11:46, 12 янв 2010

Ящер
> Сложно вообще сделать простенькую физику персонажа, в частности игрока(вид от
> первого лица) стандартными методами? Скажем, капсулой + 6d joint для "всегда
> вертикального" положения туловища? И прикладывать к ней силы(скорости?)? Тогда
> по лестнице как ее перемещать? Прыгать можно только в момент, когда стоишь на
> земле, а как это узнать?
NxCharacter - это фактически кинематический эктор снабженный сенсорами Up, Down и Side + еще некоторые мелочи, связанные с перемещением по неровным поверхностям.

#21
12:38, 12 янв 2010

> А где лежит NxCharacter.dll? И соответствует ли его версия версии .lib и PhysX SDK.
При первом запуске она его не нашла. 
Единственный NxCharacter.dll нашелся в C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\Bin\win32, который я скопировал в папку к exe.

Кроме этого я для пробы копировал к exe остальные dll оттуда же.
То есть и lib и dll из одного источника. И все чудесно работает, кроме NxCharacter.

> некоторые мелочи, связанные с перемещением по неровным поверхностям.
вот это и настораживает

#22
12:56, 12 янв 2010

Ящер
> И все чудесно работает, кроме NxCharacter.
Это странно. У меня 2.8.1.13 и никаких проблем нет. Может в инициализации ошибка, или в менеджере памяти. Покажи код инита NxControllerManager, и реализацию NxUserAllocator, и собственно подробно сам вызов NxControllerManager::createController(scene, desc) вместе с NxControllerDesc. Скорее всего ошибка где-то там.

> вот это и настораживает
Это да. Вручную с нуля его делать совсем не интересно :)

#23
14:10, 12 янв 2010

Вот, держи почти гов-, ой то есть псевдокод:

Дело не в аллокаторе. Потому что до этого был аллокатор из семплов. Как падало, так и падает. malloc стандартный.


class UserAllocator : public NxUserAllocator
{
public:
    CRITICAL_SECTION criticalSection;

    UserAllocator();
    virtual ~UserAllocator();

    void    reset();

    void*    malloc(size_t size);
    void*    malloc(size_t size, NxMemoryType type);
    void*    mallocDEBUG(size_t size, const char* file, int line);
    void*    mallocDEBUG(size_t size, const char* file, int line, const char* className, NxMemoryType type);
    void*    realloc(void* memory, size_t size);
    void    free(void* memory);
};

UserAllocator::UserAllocator()
{
    InitializeCriticalSection(&criticalSection);
}

UserAllocator::~UserAllocator()
{

}

void UserAllocator::reset()
{

}

void* UserAllocator::malloc(size_t size)
{
    EnterCriticalSection(&criticalSection);
    void *ptr = ::malloc(size);
    LeaveCriticalSection(&criticalSection);
    return ptr;
}

void* UserAllocator::malloc(size_t size, NxMemoryType type)
{
    return malloc(size);
}

void* UserAllocator::mallocDEBUG(size_t size, const char* file, int line)
{
    return malloc(size);
}

void* UserAllocator::mallocDEBUG(size_t size, const char* file, int line, const char* className, NxMemoryType type)
{
    return malloc(size);
}

void* UserAllocator::realloc(void* memory, size_t size)
{
    EnterCriticalSection(&criticalSection);
    void *ptr = ::realloc(memory, size);
    LeaveCriticalSection(&criticalSection);
    return ptr;
}

void UserAllocator::free(void* memory)
{
    EnterCriticalSection(&criticalSection);
    ::free(memory);
    LeaveCriticalSection(&criticalSection);
}

class MyControllerHitReport : public NxUserControllerHitReport
{
public:
    virtual NxControllerAction onShapeHit(const NxControllerShapeHit& hit)
    {
        return NX_ACTION_NONE;
    }

    virtual NxControllerAction onControllerHit(const NxControllersHit& hit)
    {
        return NX_ACTION_NONE;
    }
};

Init()
{
    userAllocator = NEW UserAllocator;
    nxPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, userAllocator, 0);
    <...>

    nxControllerManager = NxCreateControllerManager(userAllocator);
    assert(nxControllerManager);

    MyControllerHitReport mReport;

    NxCapsuleControllerDesc desc;
    desc.position.x = 0;
    desc.position.y = 0;
    desc.position.z = 0;
    desc.height = 0.5f;
    desc.radius = 0.5f;
    desc.skinWidth = 0.1f;
    desc.slopeLimit = cosf(NxMath::degToRad(45.0f));
    desc.stepOffset = 0.5f;
    desc.upDirection = NX_Y;
    desc.climbingMode = CLIMB_EASY;
    desc.callback = &mReport;


    nxControllerManager->createController(nxScene, desc); // все заканчивается вот здесь
}

#24
14:56, 12 янв 2010

Других потоков в тот момент нет. Работать с памятью может только этот класс.
Причем сейчас подключено так:

#pragma comment(lib, "NxCharacter.lib")

Если же все подключить через linker options->command line, то ошибки не происходит, а nxControllerManager->createController просто возвращает 0.

В общем, бог с ним.

#25
17:04, 12 янв 2010

Ящер
Для начала глупый вопрос: nxScene уже создана?
Далее:
MyControllerHitReport mReport у тебя размещается в стеке (пространство Init) и по завершении Init() освобождается со всеми вытекающими.
Да, аллокатор вроде в порядке, но тем не менее вместо своей реализации UserAllocator попробуй NxUserAllocatorDefault (#include <NxUserAllocatorDefault.h>), и создавай его не с помощью new а в статической памяти (в глобальном пространстве или как член класса, которому принадлежит Init() ). Если это не поможет, значит глюк действительно в .dll/.lib.

#26
8:43, 13 янв 2010

>>Для начала глупый вопрос: nxScene уже создана?
)))
>>MyControllerHitReport mReport у тебя размещается в стеке (пространство Init)
Спасибо, я знаю.)))) Это по-быстрому для теста. В данном случае это неважно, тк она не успевает выйти из функции.
Пробовал MyCharacterController.h  из samples, там свой UserAllocator, все тоже самое.
В итоге, видимо проблема в совместимости. Может, в настройках проекта.

#27
17:54, 17 янв 2010

Все, я нашел.
Я тупо взял пример из sdk  и руками  скопировал настройки из своего проекта в проект SampleCharacterController...
Ии... он тоже стал падать, тамже)))
Опытным путем я выяснил что причина в memory alignment. У меня стоит 4, а в dll, судя по-всему - 8. Получается, что значение default - это 8.
В общем, теперь все ок. Спасибо за помощь.

Страницы: 1 2
ПрограммированиеФорумФизика

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