0

我正在使用 PhysX 3.3.0。

我的角色是一个胶囊控制器,我需要能够检索控制器的实际速度,这似乎比应该完成的要难得多。

我已经尝试在场景的主要模拟之后检索与控制器关联的演员的速度,但是这只是返回虚假值,很可能是因为控制器只是引擎盖下的运动学演员。

现在,我能想到的唯一选择是自己跟踪速度,但这并不是那么简单。我可以轻松地跟踪自己对速度的更改,例如通过运动输入应用的速度。然而,只要控制器不与任何东西发生碰撞,这才是准确的。通过移动功能移动控制器后,控制器的速度可能已因与地板或墙壁等的碰撞而改变。移动功能返回碰撞标志,但它们只告诉我侧面某处是否发生碰撞,底部或顶部,但这不够准确,无法手动得出新的速度。

这似乎是一个相当大的疏忽,所以也许我只是在这里遗漏了一些东西。如果 PhysX 不提供这样的功能,我如何准确跟踪控制器的速度?

// 编辑

这就是我在场景模拟后获取速度的方式:

void ControllerPhysObj::UpdateVelocity()
{
    physx::PxRigidDynamic *actor = m_controller->getActor();
    physx::PxVec3 vel = actor->getLinearVelocity();
    m_velocity.x = vel.x;
    m_velocity.y = vel.y;
    m_velocity.z = vel.z;
}

m_controller 是一个 PxCapsuleController。

4

1 回答 1

0

问题是如何移动控制器。如果您使用的是PxController::move,那么您可以通过将实际位移矢量除以更新帧的时间来轻松确定速度。

实际位移向量是调用PxController::move之前和之后胶囊位置的差异。

更新帧的时间(很可能)是您为PxScene::simulate提供的时间(很可能是因为您可能有更详细的更新周期方法)。

于 2014-09-03T08:29:36.410 回答