Unity3d:带刚体的球体回旋

Unity3d: Backspin of Sphere with Rigidbody

我无论如何都不是物理专家,因此我无法真正说出我正在寻找的效果是如何调用的。我暂时称它为 "Backspin" :)

想象一下这个场景:

你面前有一个乒乓球在打乒乓球table。你用手指在上面施加压力(用很大的力从球的顶部到底部)。乒乓球会在向前移动时从您的手指上滑落,但会向后旋转。因此,尽管它向前移动,但由于向后旋转,它最终会回滚给您:D

我希望这是有道理的。我真的不知道这个效果是怎么叫的,所以我真的无法查找解决方案。

我确实有一个简单的平面,上面有一个球体(附有刚体)。我想通过在屏幕上滑动来模拟这种确切的效果。但最重要的是,如何才能达到这种效果?效果还应该受到球上施加压力的确切位置(左侧或右侧)的影响。我只是想让它在向后旋转的同时向前移动,并最终由于它的反作用力而回滚(不是完全相同的位置,而是更真实)。

我尝试过 Addforce 和 Addtorque 但没有成功。

非常感谢任何帮助。

祝你有愉快的一天!

编辑:到目前为止我所拥有的:

public float spin = 1000f;
public float force = 20f;
public float angularVelocity = 100f;
private Rigidbody rb;
private Vector3 oldPos;
private Quaternion oldRot;
public int pressed = 0;

void Start () {
    oldPos = transform.position;
    oldRot = transform.rotation;
    rb = GetComponent<Rigidbody> ();
    rb.maxAngularVelocity = angularVelocity;
}

void FixedUpdate ()
{
    Debug.Log(rb.velocity.magnitude);

    if (Input.GetKey(KeyCode.Space))
    {
        Debug.Log("pressed");
        pressed = 1;
        rb.AddForce(new Vector3(0,0,force),ForceMode.VelocityChange);
        rb.AddTorque (new Vector3 (-spin, 0, 0), ForceMode.Force);
    }
}

编辑 2:

public float spin = 1000f;
public float force = 20f;
public float angularVelocity = 100f;
private Rigidbody rb;
private Vector3 oldPos;
private Quaternion oldRot;
public int pressed = 0;
public float forceTime = 1f;
public float startBack = 0.25f;

void Start () {
    oldPos = transform.position;
    oldRot = transform.rotation;
    rb = GetComponent<Rigidbody> ();
    rb.maxAngularVelocity = angularVelocity;
}

void FixedUpdate ()
{
    Debug.Log(rb.velocity.magnitude);
    if (pressed == 2)
    {
        rb.AddForce(new Vector3(0,0,-force),ForceMode.Acceleration);

    }
    else if (pressed == 1 && rb.velocity.magnitude <= startBack && rb.velocity.magnitude >= 0f)
    {
        pressed = 2;
        StartCoroutine("StopForce");
    }
    else if (Input.GetKeyDown(KeyCode.Space) && pressed == 0)
    {
        Debug.Log("pressed");
        rb.AddForce(new Vector3(0,0,force),ForceMode.VelocityChange);
        rb.AddTorque (new Vector3 (-spin, 0, 0), ForceMode.Force);
        pressed = 1;
    }
}
IEnumerator StopForce () {
    yield return new WaitForSeconds(forceTime);
    pressed = 3;
}

开始一个新项目。添加地形和球体。向球体添加一个刚体并将“阻力”更改为 1。将球设置在中间地形的顶部。将此代码添加到您的球体游戏对象

Rigidbody rb;

void Start () {
    rb = GetComponent<Rigidbody> ();
    rb.maxAngularVelocity = 100;
    rb.AddForce(new Vector3(20,0,0),ForceMode.VelocityChange);
    rb.AddTorque (new Vector3 (0, 0, 1000), ForceMode.Force);
}

中提琴。请注意,代码放在启动方法中而不是更新,因为不应连续添加力