簡體   English   中英

LibGDX:如何在不修改原始向量的情況下將向量與標量相乘? (Java游戲中的簡單重力系統)

[英]LibGDX: how do I multiply vector with scalar without modifing original vector? (simple gravity system in Java game)

我目前正在使用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.
    }

這是行不通的,因為Vector2的scl()方法直接更改了向量本身,如LibGDX的Vector2類所示:

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

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

我怎樣才能做到這一點? 還是我完全錯了? 在LibGDX中,有沒有更簡單的方法可以使用“ *”運算符將向量與標量相乘?

Vector2 force = _gravity.cpy().scl(_mass);

cpy()方法返回向量的副本,因此最終將副本乘以_mass而不是原始向量。

與使用new Vector2()創建副本相比,此解決方案的微小優勢在於,它無需修改即可用於任何矢量維度。

方法(和其他方法)不創建新向量的原因是避免創建垃圾。 創建垃圾將導致垃圾收集器被清理,這可能(並且將)引起堆高。 對於游戲,您通常需要避免頻繁的提速。

因此,如果只需要一次,則可以使用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);

您可以在縮放向量之前嘗試復制向量,如下所示:

new Vector2(_gravity).scl(_mass);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM