LibGDX:如何在不修改原始向量的情况下将向量与标量相乘?(Java游戏中的简单重力系统)

维佐

我目前正在使用LibGDX在我的游戏中实现一个简单的重力系统。但是,我发现将向量与向量相乘以及将向量与标量相乘的方式有些不同。

在Unity中,我将像这样实现重力:

    public Vector3 velocity;
    public Vector3 acceleration;

    private void FixedUpdate()
    {
        transform.position += velocity*Time.fixedDeltaTime;

        Vector3 force = Physics.gravity*GetComponent<Rigidbody>().mass;
        acceleration = force/GetComponent<Rigidbody>().mass;

        velocity = velocity + acceleration*Time.fixedDeltaTime;
    }
}

向量乘法非常简单。

在LibGDX中,我正在尝试以下操作:

    import com.badlogic.gdx.math.Vector2;

    final protected Vector2 _gravity = new Vector2(0f, -9.82f);
    final protected float _mass = 1f;
    protected Vector2 _velocity;
    protected Vector2 _acceleration;

    public void Update(float deltaTime)
    {
        // Transform is a class containing a Vector2 called Position
        Transform.Position.add(_velocity.scl(deltaTime));

        Vector2 force = _gravity.scl(_mass);
        _acceleration = force.scl(1f/_mass);    
        _velocity = _velocity.add(_acceleration.scl(deltaTime));

        System.out.println(_velocity);
        // _velocity gets smaller and smaller and finally hits 0.
    }

这是行不通的,因为Vector2scl()方法直接更改了向量本身,如LibGDX的Vector2类所示:

public Vector2 scl (float scalar) {
        x *= scalar;
        y *= scalar;
        return this;
    }

我假设我希望它返回一个新的Vector2,而不是直接更改向量本身。

我怎样才能做到这一点?还是我完全错了?在LibGDX中,有没有更简单的方法可以使用“ *”运算符将向量与标量相乘?

方法(和其他方法)不创建新向量的原因是为了避免创建垃圾。创建垃圾将导致垃圾收集器被清理,这可能(并且将)引起堆高。对于游戏,您通常要避免频繁的提速。

因此,如果只需要一次,则可以使用cpy()方法或new关键字。但是对于经常调用的方法(例如您的update方法),您确实想避免这种情况。相反,您可以使用成员向量。

final Vector2 force = new Vector2();
public void update(float delta) {
    ...
    force.set(_gravity).scl(mass);
    ...
}

请注意,对于类似的操作,position += velocity * time您可以使用mulAdd方法。

position.mulAdd(velocity, deltaTime);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档