Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在PhysX中编辑一个角色_C++_Physx - Fatal编程技术网

C++ 在PhysX中编辑一个角色

C++ 在PhysX中编辑一个角色,c++,physx,C++,Physx,所以,现在,我正试图为一个游戏设计一个直升机系统。我遇到的问题是,我想编辑直升机的重力,并且只有在我使用它时,但现在它导致所有使用PhysX的对象失去重力 这是我正在使用的函数。g_pPhysicsWorld->physxsscene->setGravity(HeliGravity)可能是导致问题的原因 void obj_Vehicle::HelicopterPhysx() // controls of helicopter { if (isHelicopter == true)

所以,现在,我正试图为一个游戏设计一个直升机系统。我遇到的问题是,我想编辑直升机的重力,并且只有在我使用它时,但现在它导致所有使用PhysX的对象失去重力

这是我正在使用的函数。
g_pPhysicsWorld->physxsscene->setGravity(HeliGravity)可能是导致问题的原因

  void obj_Vehicle::HelicopterPhysx() // controls of helicopter
{
    if (isHelicopter == true)
    {
        const float fTimePassed = r3dGetFrameTime();
        PxTransform pose = vd->vehicle->getRigidDynamicActor()->getGlobalPose();
        r3dVector angles;
        r3dPoint3D position(0,0,0);
        PxVec3 HeliGravity(0,0,0);

        if (HasDriver() && HSpeed > 70)
        {
            if (Keyboard->IsPressed(kbsRight)) // Rotate Left
            {
                if (!(Keyboard->IsPressed(kbsW) || Keyboard->IsPressed(kbsS)))
                    HelyX+=0.5f;
            }
            else if (Keyboard->IsPressed(kbsLeft)) // rotate Right
            {
                if (!(Keyboard->IsPressed(kbsW) || Keyboard->IsPressed(kbsS)))
                    HelyX-=0.5f;
            }
            if (Keyboard->IsPressed(kbsW) && distanceFromGround>=5) // move front
            {
                HeliGravity = PxVec3(0,-1.0,0);
                if (HelyY<15.0f)
                    HelyY+=0.5f;
                //HelyUp=-0.1f;

                if (HelyFB>1 && FB>=0)
                    FB=HelyFB-=0.25f;
            }
            else {
                if (FB >0 && HelyFB<20)
                    FB=HelyFB+=0.05f;

                if (HelyY>0)
                {
                    HelyY-=0.5f;
                    if (HelyY<0) HelyY = 0;
                }
            }
            if (Keyboard->IsPressed(kbsS) && distanceFromGround>=5) // Move back
            {   
                if (HelyY>-15.0f)
                    HelyY-=0.5f;

                if (HelyFB>5 && FB<=0)
                    FB=abs(HelyFB-=0.5f)*-1;
            }
            else {
                if (FB <0 && HelyFB<20)
                    FB=abs(HelyFB+=0.05f)*-1;
                if (HelyY<0)
                {
                    HelyY+=0.5f;
                }
            }
            if (Keyboard->IsPressed(kbsD) && distanceFromGround>=10) // move Right
            {
                if (HelyZ>-30.0)
                    HelyZ-=0.5f;

                if ((Keyboard->IsPressed(kbsW) || Keyboard->IsPressed(kbsS)))
                {
                    HelyX+=0.5f;
                }
                else {
                    if (HelyLR>5 && LR>=0)
                        LR=HelyLR-=0.5f;
                }
            }
            else {
                if (LR >0 && HelyLR<20)
                    LR=HelyLR+=0.1f;
                if (HelyZ<0)
                {
                    HelyZ+=0.5f;
                }
            }

            if (Keyboard->IsPressed(kbsA) && distanceFromGround>=10) // move Left
            {

                if (HelyZ<30.0)
                    HelyZ+=0.5f;

                if ((Keyboard->IsPressed(kbsW) || Keyboard->IsPressed(kbsS)))
                {
                    HelyX-=0.5f;
                }
                else {
                    if (HelyLR>5 && LR<=0)
                        LR=abs(HelyLR-=0.5f)*-1;
                }

            }
            else {
                if (LR <0 && HelyLR<20)
                    LR=abs(HelyLR+=0.1f)*-1;

                if (HelyZ>0)
                {
                    HelyZ-=0.5f;
                    if (HelyZ<0) HelyZ = 0;
                }
            }
            if (Keyboard->IsPressed(kbsQ) && HSpeed > 70) // move up
            {
                //r3dOutToLog("###### distanceFromGround %f\n",distanceFromGround);
                //if (distanceFromGround<100)
                    //HelyUp=0.1f;
                HeliGravity = PxVec3(0,2,0); //m70b1jr gravity
            }
            else if (Keyboard->IsPressed(kbsZ)) // Move down
            {
                HeliGravity = PxVec3(0,-1,0);
                //HelyUp=-0.1f;
            }
        }
        else {

            if (distanceFromGround>0)
            {
                if (HSpeed < 50 || !CheckFuel())
                {
                    //r3dOutToLog("######## HSpeed: %f\n",HSpeed);
                    //Gravity = PxVec3(0,-9.81f,0);
                    if (HelyUp>0)
                        HelyUp=-0.1f;
                }
            }
        }
        pose.p.y+=HelyUp;
        if (HelyFB>=20)
            FB=0;
        if (HelyLR>=20)
            LR=0;
        //r3dOutToLog("######## HelyFB: %f FB: %f\n",HelyFB,FB);
        position = r3dPoint3D(pose.p.x,pose.p.y,pose.p.z) + (GetvForw() / FB) + (GetvRight() / LR);
                if (HelyUp<0)
                {
                    HelyUp+=0.001f;
                }
                else if (HelyUp>0)
                {
                    HelyUp-=0.001f;
                    if (HelyUp<0) HelyUp = 0;
                }

        //g_pPhysicsWorld->PhysXScene->setGravity(HeliGravity); // m70 test

        D3DXMATRIX RotateMatrix,RotateMatrix2,toOrigin,fromOrigin,boneTransform;
        D3DXMatrixTranslation(&toOrigin, -GetPosition().x, -GetPosition().y, -GetPosition().z);
        D3DXMatrixTranslation(&fromOrigin, pose.p.x, pose.p.y, pose.p.z);

        D3DXMatrixRotationYawPitchRoll(&RotateMatrix,R3D_DEG2RAD(HelyX),R3D_DEG2RAD(HelyY),R3D_DEG2RAD(HelyZ));
        D3DXMatrixMultiply(&boneTransform, &fromOrigin, &RotateMatrix);

        D3DXMatrixMultiply(&boneTransform, &boneTransform, &toOrigin);

        PxMat33 orientation(PxVec3(boneTransform._11, boneTransform._12, boneTransform._13),
                        PxVec3(boneTransform._21, boneTransform._22, boneTransform._23),
                        PxVec3(boneTransform._31, boneTransform._32, boneTransform._33));
        pose.q = PxQuat(orientation);

        /*D3DMATRIX m = GetRotationMatrix();*/
        pose.p.x=position.x;//HelyFB;
        pose.p.z=position.z;//HelyLR;

        /*HelyLR=position.z;
        HelyFB=position.x;*/
        vd->vehicle->getRigidDynamicActor()->setGlobalPose(pose);
        SetPosition(r3dPoint3D(position.x,pose.p.y,position.z)); //Another test
        r3dPoint3D vel = GetVelocity();
        vel.x *= pose.p.x;
        vel.y *= pose.p.y;
        vel.z *= pose.p.y;
        if(vel.Length() < 0.001f) vel = r3dPoint3D(0, 0, 0);
        SetVelocity(vel);
    }
}
void obj_Vehicle::HelicopterPhysx()//直升机控制
{
如果(ISHELICOPER==真)
{
常量浮点fTimePassed=r3dGetFrameTime();
PxTransform pose=vd->vehicle->getRigidDynamicActor()->getGlobalPose();
r3dVector角;
r3dPoint3D位置(0,0,0);
PxVec3直升机重量(0,0,0);
如果(HasDriver()&&HSpeed>70)
{
如果(键盘->按下(kbsRight))//向左旋转
{
如果(!(键盘->IsPressed(kbsW)| |键盘->IsPressed(kbsS)))
HelyX+=0.5f;
}
否则(键盘->按下(kbsLeft))//向右旋转
{
如果(!(键盘->IsPressed(kbsW)| |键盘->IsPressed(kbsS)))
HelyX-=0.5f;
}
如果(键盘->按下(kbsW)&&distance from地面>=5)//向前移动
{
重力=PxVec3(0,-1.0,0);
如果(HelyY1&&FB>=0)
FB=直升机飞行高度b-=0.25f;
}
否则{
如果(FB>0&&helyf0)
{
HelyY-=0.5f;
如果(HelyIspressed(kbsS)和与地面的距离>=5)//向后移动
{   
如果(HelyY>-15.0f)
HelyY-=0.5f;
如果(HelyFB>5&&FBIsPressed(kbsW)| |键盘->IsPressed(kbsS)))
{
HelyX+=0.5f;
}
否则{
如果(直升机高度>5&&LR>=0)
LR=HelyLR-=0.5f;
}
}
否则{
如果(LR>0&&HelyLR=10)//向左移动
{
如果(HelyZIsPressed(kbsW)| |键盘->IsPressed(kbsS)))
{
HelyX-=0.5f;
}
否则{
如果(直升机高度>5&&LR0)
{
如果(HSpeed<50 | |!检查燃油()
{
//r3doutolog(“HSpeed:%f\n”,HSpeed);
//重力=PxVec3(0,-9.81f,0);
如果(HelyUp>0)
HelyUp=-0.1f;
}
}
}
姿势p.y+=HelyUp;
如果(直升机飞行高度>=20)
FB=0;
如果(直升机>=20)
LR=0;
//r3doutolog(“直升机起落架:%f FB:%f\n”,直升机起落架,FB);
位置=r3dPoint3D(pose.p.x、pose.p.y、pose.p.z)+(GetvForw()/FB)+(GetvRight()/LR);
if(HelyUp0)
{
HelyUp-=0.001f;
if(helyupphyscene->setGravity(HeliGravity);//m70测试
D3DX矩阵旋转矩阵,旋转矩阵X2,toOrigin,fromOrigin,boneTransform;
D3DXMatrixTranslation(&toOrigin,-GetPosition().x,-GetPosition().y,-GetPosition().z);
D3DX矩阵翻译(&fromOrigin,pose.p.x,pose.p.y,pose.p.z);
D3DXMatrix旋转压路机(&RotateMatrix,R3D_DEG2RAD(HelyX),R3D_DEG2RAD(HelyY),R3D_DEG2RAD(HelyZ));
D3DXMatrixMultiply(&BonetTransform,&fromOrigin,&RotateMatrix);
D3DXMatrixMultiply(&BonetTransform,&BonetTransform,&toOrigin);
PxMat33定向(PxVec3(boneTransform.\u 11,boneTransform.\u 12,boneTransform.\u 13),
PxVec3(BonetTransform.\u 21,BonetTransform.\u 22,BonetTransform.\u 23),
PxVec3(boneTransform._31,boneTransform._32,boneTransform._33));
姿势q=PxQuat(方向);
/*D3DMATRIX m=GetRotationMatrix()*/
pose.p.x=position.x;//HelyFB;
pose.p.z=position.z;//HelyLR;
/*HelyLR=位置z;
HelyFB=位置x*/
vd->vehicle->getRigidDynamicActor()->setGlobalPose(姿势);
设置位置(r3dPoint3D(position.x,pose.p.y,position.z));//另一个测试
r3dPoint3D vel=GetVelocity();
水平x*=姿势p.x;
y级*=姿势p.y;
水平z*=姿势p.y;
如果(水平长度()<0.001f)水平=r3dPoint3D(0,0,0);
设定速度(vel);
}
}
setGravity()
用于设置影响所有演员的场景的全局重力

如果您想为某个演员设置“个人”重力,则必须禁用该演员的全局重力:

PxActor::setActorFlag(PxActorFlag::eDISABLE_GRAVITY, false);
然后给演员添加你自己的力量:

void PxRigidBody::addForce(const PxVec3& force, PxForceMode::Enum mode, bool autowake);

请注意,必须在每个更新帧上调用
addForce()

当我这样做时,它会使我的游戏崩溃。