0

私はPhysX3.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などです。しかし、ポーズはまだゼロ/アイデンティティです。私は何が欠けていますか?

4

1 に答える 1

0

解決しました。エラーは私自身の論理にありました。同期ロジックの問題があり、PhysXがグラフィックを更新しようとしているのと同時に、ポジショニングロジックがPhysXに以前の位置で更新するように指示していました。そのため、スタックし、シミュレートされていないように見えました。

于 2012-03-20T09:44:14.160 に答える