PhysX两轮载具简单实现


想实现一个摩托车的物理载具,所以先在Snippet里面改了一下

PxVehicleNoDrive

看到UE4中是用PxVehicleNoDrive实现的,就想在SnippetVehicleNoDrive快速改一下看下效果,结果改了几行代码就基本看到效果了

1.修改轮子个数

VehicleDesc initVehicleDesc()
{
    // 省略...
    // two wheels
    const PxU32 nbWheels = 2;

2.修改报错

主要是默认是四个轮子的,然后默认代码传多了,删掉即可

void startBrakeMode()
{
    gVehicleNoDrive->setBrakeTorque(0, 1000.0f);
    gVehicleNoDrive->setBrakeTorque(1, 1000.0f);
    //gVehicleNoDrive->setBrakeTorque(2, 1000.0f);
    //gVehicleNoDrive->setBrakeTorque(3, 1000.0f);
}
void startHandbrakeTurnLeftMode()
{
    //gVehicleNoDrive->setBrakeTorque(2, 1000.0f);
    //gVehicleNoDrive->setBrakeTorque(3, 1000.0f);
    gVehicleNoDrive->setDriveTorque(0, 1000.0f);
    gVehicleNoDrive->setDriveTorque(1, 1000.0f);
    gVehicleNoDrive->setSteerAngle(0, 1.0f); 
    gVehicleNoDrive->setSteerAngle(1, 1.0f); 
}
void startHandbrakeTurnRightMode()
{
    //gVehicleNoDrive->setBrakeTorque(2, 1000.0f);
    //gVehicleNoDrive->setBrakeTorque(3, 1000.0f);
    gVehicleNoDrive->setDriveTorque(0, 1000.0f);
    gVehicleNoDrive->setDriveTorque(1, 1000.0f);
    gVehicleNoDrive->setSteerAngle(0, -1.0f); 
    gVehicleNoDrive->setSteerAngle(1, -1.0f); 
}
void releaseAllControls()
{
    gVehicleNoDrive->setDriveTorque(0, 0.0f);
    gVehicleNoDrive->setDriveTorque(1, 0.0f);
    //gVehicleNoDrive->setDriveTorque(2, 0.0f);
    //gVehicleNoDrive->setDriveTorque(3, 0.0f);
    gVehicleNoDrive->setBrakeTorque(0, 0.0f);
    gVehicleNoDrive->setBrakeTorque(1, 0.0f);
    //gVehicleNoDrive->setBrakeTorque(2, 0.0f);
    //gVehicleNoDrive->setBrakeTorque(3, 0.0f);
    gVehicleNoDrive->setSteerAngle(0, 0.0f);
    gVehicleNoDrive->setSteerAngle(1, 0.0f);
    //gVehicleNoDrive->setSteerAngle(2, 0.0f);
    //gVehicleNoDrive->setSteerAngle(3, 0.0f);
}

3.控制台提示参数不对

..\..\PhysXVehicle\src\PxVehicleUpdate.cpp (244) : invalid parameter : PxVehicleComputeSprungMasses: sprungMassCoordinates must all be valid coordinates

断点看一下就知道问题在哪里了,主要是计算便宜的时候坐标是无穷大,修改下下面的代码即可

void computeWheelCenterActorOffsets
(const PxF32 wheelFrontZ, const PxF32 wheelRearZ, const PxVec3& chassisDims, const PxF32 wheelWidth, const PxF32 wheelRadius, const PxU32 numWheels, PxVec3* wheelCentreOffsets)
{
            // 两个轮子的时候deltaZ算的时候除以0了
        //const PxF32 deltaZ = (wheelFrontZ - wheelRearZ) / (numLeftWheels - 1.0f);
        PX_UNUSED(numWheels);
        PX_UNUSED(wheelWidth);
        //front wheel offset from origin.
        wheelCentreOffsets[0] = PxVec3(0.f, -(chassisDims.y / 2 + wheelRadius), wheelRearZ);
        //rear wheel offsets from origin.
        wheelCentreOffsets[1] = PxVec3(0.f, -(chassisDims.y / 2 + wheelRadius), wheelFrontZ);
}

PVD效果

two wheels

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 OpenSceneGraph 中,可以使用组合节点(Composite Node)将载具节点和场景节点组合起来,形成一个复合节点。这个复合节点可以被添加到场景图中,从而实现载具模型在场景模型中漫游的效果。 具体实现步骤如下: 1. 创建载具节点和场景节点,加载对应的模型文件,设置节点参数。 2. 创建组合节点,将载具节点和场景节点添加到组合节点中。 3. 将组合节点添加到场景图中,即可完成载具模型在场景模型中漫游的效果。 4. 可以通过设置载具节点的位置、姿态等参数来控制载具的运动,从而实现漫游效果。 下面是一个简单的示例代码: ```cpp osg::ref_ptr<osg::Node> vehicleNode = osgDB::readNodeFile("vehicle.osg"); osg::ref_ptr<osg::Node> sceneNode = osgDB::readNodeFile("scene.osg"); // 创建组合节点 osg::ref_ptr<osg::Group> compositeNode = new osg::Group; compositeNode->addChild(vehicleNode); compositeNode->addChild(sceneNode); // 将组合节点添加到场景图中 osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(compositeNode); // 设置载具节点的位置和姿态 osg::Vec3d pos(0, 0, 0); osg::Quat rot(osg::DegreesToRadians(-90.0), osg::Vec3d(1, 0, 0)); osg::ref_ptr<osg::MatrixTransform> vehicleTransform = new osg::MatrixTransform; vehicleTransform->setMatrix(osg::Matrix::translate(pos) * osg::Matrix::rotate(rot)); vehicleTransform->addChild(vehicleNode); // 更新载具节点的位置和姿态 double dt = 0.01; while (true) { // 更新载具节点的位置和姿态 pos += osg::Vec3d(1, 0, 0) * dt; rot *= osg::Quat(osg::DegreesToRadians(1.0), osg::Vec3d(0, 0, 1)); vehicleTransform->setMatrix(osg::Matrix::translate(pos) * osg::Matrix::rotate(rot)); // 等待一段时间,更新场景图 osg::Timer::instance()->sleep(10); osgViewer::Viewer::frame(); } ``` 这段代码中,我们创建了一个组合节点 compositeNode,将载具节点和场景节点添加到其中。然后将组合节点添加到场景图中,形成一个复合的场景图。 在代码的最后,我们通过不断更新载具节点的位置和姿态,来模拟载具在场景中的漫游过程。每次更新位置和姿态后,我们等待一段时间,再调用 osgViewer::Viewer::frame() 函数,来更新场景图的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值