加速和减速到手指位置

本文关键字:手指 位置 加速 | 更新日期: 2023-09-27 18:06:22

我在Unity上有一个3D对象,我想要的是在用户按压屏幕时移动这个对象。问题是,它需要先加速,然后,当它到达按下的位置,它开始减速,直到它完全停止在那一点。

我需要它的工作方式,如果用户移动他的手指,对象将重新计算是否需要根据他的当前情况加速/减速。

我试过这个例子,但是,它只适用于加速,它也似乎有点混乱。所以,我在想是否有人有更好更简单的方法来解决这个问题。物理学能帮上忙吗?如果有,怎么做?

我的代码是c#。

加速和减速到手指位置

采用统一刚体系统,计算简便。这是使用鼠标位置,你可以改变它的触摸。

public class MyDragMove : MonoBehaviour {
    public float speedDelta = 1.0f;
    public float decelerate = 1.0f;
    private bool startDrag;
    private Vector3 prePos;
    void Update () {
        this.rigidbody.drag = decelerate; //Rigidbody system can set drag also. You can use it and remove this line.
        if (Input.GetKeyDown (KeyCode.Mouse0)) {
            prePos = Input.mousePosition;
            startDrag = true;
        }
        if(Input.GetKeyUp(KeyCode.Mouse0))
            startDrag = false;
        if(startDrag)
            ForceCalculate();
    }
    void ForceCalculate()
    {
        Vector3 curPos = Input.mousePosition;
        Vector3 dir = curPos - prePos;
        float dist = dir.magnitude;
        float v = dist / Time.deltaTime;
        this.rigidbody.AddForce (dir.normalized * v * Time.deltaTime * speedDelta);
        prePos = curPos;
    }
}

或仅使用SmoothDamp在最后位置。

public class MyDragMove : MonoBehaviour {
    public float speedDelta = 1.0f;
    public float maxSpeed = 5.0f;
    public Vector3 v;
    private Vector3 prePos;
    void Update () {
        if(Input.GetKey(KeyCode.Mouse0))
            prePos = Input.mousePosition;
        TowardTarget ();
    }
    void TowardTarget()
    {
        Vector3 targetPos = Camera.main.ScreenToWorldPoint (new Vector3(prePos.x, prePos.y, 10f)); //Assume your camera's z is -10 and cube's z is 0
        transform.position = Vector3.SmoothDamp (transform.position, targetPos, ref v, speedDelta, maxSpeed);
    }
}