В настоящее время я реализую простую систему гравитации в своей игре, используя 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.
}
Это не работает, так как метод scl() класса Vector2 напрямую изменяет сам вектор, что можно увидеть в классе Vector2 библиотеки LibGDX:
public Vector2 scl (float scalar) {
x *= scalar;
y *= scalar;
return this;
}
Я предполагаю, что хочу, чтобы он возвращал новый Vector2 вместо того, чтобы напрямую изменять сам вектор.
Как я могу это сделать? Или я совсем не прав? Есть ли в LibGDX более простой способ умножать векторы на скаляры с помощью оператора «*»?