使用C#获取一个在Unity3D中摆动的对象

Flo*_*olk 1 c# physics unity-game-engine

我想在Unity3D中模拟一艘船.我需要它能够做的就像真正的船只在水中碰到某些东西时会摇晃.我已经把船碰撞了,所有的轴都解锁了.然而,这意味着船将旋转,然后继续以奇怪的角度行驶(就像面向天空).

有没有办法让船试图恢复原来的旋转,没有捕捉到确切的值,而只是前后"摇摆",然后放慢速度,最终再次停止正确的旋转?


这是我尝试使用的代码:

void FixedUpdate ()
{
    wobble();
}

void wobble()
{
    if (this.transform.eulerAngles.x < 270)
    {
        this.rigidbody.AddTorque((float)19, (float)0, (float)0, ForceMode.Force);
    }
    else if (this.transform.eulerAngles.x > 270)
    {
        this.rigidbody.AddTorque((float)-19, (float)0, (float)0, ForceMode.Force);
    }
    else{}

    if (this.transform.eulerAngles.z < 0)
    {
        this.rigidbody.AddTorque((float)19, (float)0, (float)0, ForceMode.Force);
    }
    else if (this.transform.eulerAngles.z > 0)
    {
        this.rigidbody.AddTorque((float)-19, (float)0, (float)0, ForceMode.Force);
    }
    else{}
}
Run Code Online (Sandbox Code Playgroud)

但是,现在当我的物体碰到某物时,它就会开始失控.有任何想法吗?

Tom*_*ock 5

您可以使用补间.一个美妙的技术更改值是-顺利两个值.在这种情况下,您可以从笨拙的弹跳角度到两个之间的补间坐姿旋转.有很好的插件可以像iTween一样使用,这很棒,但我会告诉你一些半假超级谷物代码,让你开始"旋转校正"的概念

让我们说我的船撞了一个漂亮的大浪,它指向我的船向上20度角.

我在X上的欧拉角是20,我可以通过增加以恒定速率减小值来将其返回到0.我只是在这里展示X,但你可以重复Z轴的过程.我会排除Y,因为你会在Y上使用你的船的方向而你不想搞砸你的船只航行.

Update()

    float angleDelta;

    // check if value not 0 and tease the rotation towards it using angleDelta
    if(transform.rotation.X > 0 ){
        angleDelta = -0.2f;
    } elseif (transform.rotation.X < 0){
        angleDelta = 0.2f;
    }

    transform.rotation.X += angleDelta;
}
Run Code Online (Sandbox Code Playgroud)

这个令人难以置信的简单实现完成了这项工作,但却拥有令人难以置信的"活泼"和"紧张"的美妙享受.所以我们想添加一些平滑处理,使它成为更加逼真的船.

我们通过在angleDelta中添加一个变量来实现这一点:

Vector3 previousAngle;
float accelerationBuffer = 0.3f;
float decelerationBuffer = 0.1f;

Update()

    Vector3 angleDelta;

    //assuming that x=0 is our resting rotation
    if(previousAngle.X > transform.rotation.X && transform.rotation.X > 0){
        //speed up rotation correction - like gravity acting on boat
        angleDelta.X += (previousAngle.X - transform.rotation.X) * accelerationBuffer;

    } elseif(previousAngle.X < transform.rotation.X && transform.rotation.X > 0
        //angle returning to resting place: slow down the rotation due to water resistatnce
        angleDelta.X -= (previousAngle.X - transform.rotation.X) * deccelerationBuffer;
    }


    //If boat pointing to sky - reduce X
    if(transform.rotation.X > 0 ){
        transform.rotation.X -= angleDelta.X * Time.deltaTime;

    //If boat diving into ocean - increase X
    } elseif (transform.rotation.X < 0){
        transform.rotation.X += angleDelta.X * Time.deltaTime; //Must not forget to use deltaTime!
    }

    //record rotation for next update
    previousAngle = transform.rotation;
}
Run Code Online (Sandbox Code Playgroud)

这是一个令人难以置信的粗略草案,但它涉及我正在尝试解释的理论 - 你需要相应地调整自己的代码,因为你没有包含任何你自己的代码(pastebin一个片段给我们,也许我们可以详细说明更多!)