我已经升级到了PhysX 3.2,几天来一直在努力让我的测试箱通过重力移动,但它就是不能做到。
我遵循了PhysX文档,但以我的方式实现了它。这几乎是一个默认设置:
physx::PxSceneDesc sceneDesc = physx::PxSceneDesc((physx::PxTolerancesScale()));
sceneDesc.gravity = physx::PxVec3(0.0f, -9.8f, 0.0f);
if(!sceneDesc.cpuDispatcher)
{
physx::PxDefaultCpuDispatcher* mCpuDispatcher = physx::PxDefaultCpuDispatcherCreate(4);
if(!mCpuDispatcher)
LOG("PxDefaultCpuDispatcherCreate failed!");
sceneDesc.cpuDispatcher = mCpuDispatcher;
}
if(!sceneDesc.filterShader)
sceneDesc.filterShader = &physx::PxDefaultSimulationFilterShader;
physxScene = physMgr->getSDK()->createScene(sceneDesc);创建动态执行元:
PxRigidDynamic* body = mPxSDK->createRigidDynamic(Convert::toPxTransform(transform));
PxRigidBodyExt::updateMassAndInertia(*body, 1.0f);
mPxScene->addActor(*body);添加长方体形状:
PxBoxGeometry geometry = PxBoxGeometry(Convert::toPxVector3(size));
if(geometry.isValid())
{
PxMaterial* material = api->createMaterial(0.5f, 0.5f, 0.1f);
PxShape* shape = createShape(actor, geometry, material);
PxRigidBodyExt::updateMassAndInertia(*body, 33.0f);
}将场景模拟为:
float elapsedTime = float((float)mTime.getElapsedTime() / 1000.0f);
mAccumulator += elapsedTime;
if(mAccumulator < mStepSize)
{
return;
}
else
{
mAccumulator -= mStepSize;
mPxScene->simulate(mStepSize);
mDynamicBodySys->updateGameObjectPositions();
mPxScene->fetchResults(true);
mTime.restart();
}当我查看Visual Debugger时,我可以看到框和帧计数在增加。但它不动了。演员的形状和盒子的形状似乎有正确的属性。LinearVelocity在负Y轴上增加,它的质量是33等,但姿态仍然是零/单位。我遗漏了什么?
发布于 2012-03-20 17:44:14
解决了。错误存在于我自己的逻辑中。有一个同步逻辑问题,PhysX试图更新我的图形,同时我的定位逻辑告诉PhysX用它以前的位置更新。所以它被卡住了,看起来从来没有被模拟过。
https://stackoverflow.com/questions/9768234
复制相似问题