首页 文章

Unity3d:带有刚体的球体后旋

提问于
浏览
1

我绝不是物理专家,因此我无法确定我所寻找的效果如何被称为 . 我现在称它为“Backspin”:)

想象这个场景:

在乒乓球桌前面有一个乒乓球 . 你用手指对它施加压力(用很大的力量从球的顶部到底部) . 乒乓球将从你的手指向前滑动但向后旋转 . 因此,尽管它向前移动,但由于其向后旋转,它最终会回滚到你: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);
    }
}

EDIT2:

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 回答

  • 1

    开始一个新项目 . 添加地形和球体 . 向球体添加刚体并将“拖动”更改为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);
    }
    

    中提琴 . 请注意,代码放在start方法中而不是更新,因为不应连续添加强制

相关问题