LibGDX: Масштабируйте линию проекции движения, чтобы она всегда была одинаковой длины

#debugging #libgdx #line #shapes

Вопрос:

Я работаю над игрой в LibGDX. Прямо сейчас я работаю над тем, чтобы провести линию от текущего положения тела движущегося объекта в направлении, в котором он движется. Может быть, я неправильно выразился, так что вот мое очень художественное представление того, о чем я говорю.

Сущность прыгает, двигаясь вверх и вправо: проведите линию от сущности вверх и влево

Объект перемещается вправо: проведите линию от объекта вправо

Проблема, с которой я сталкиваюсь, заключается в том, что вертикальные линии всегда намного длиннее диагональных линий, а диагональные линии всегда намного длиннее горизонтальных линий. Я хочу, чтобы линия, проецируемая из объекта, всегда была одинаковой длины независимо от направления.

Ниже приведен код, используемый для рисования линий из центра тела объекта. Как вы можете видеть, я масштабирую линию (например, на 25,0 f). Может быть, есть формула, которую я мог бы использовать для динамического изменения этого скаляра в зависимости от направления?

 public class BodyMovementProjection implements Updatable {

    public final Body body;
    public final ShapeRenderer shapeRenderer;

    public boolean debugProjection = false;
    public float scalar = 25.0f;

    private final Vector2 posThisFrame = new Vector2();
    private final Vector2 posLastFrame = new Vector2();
    private final Vector2 projection = new Vector2();
    
    private float[] debugColorVals = new float[4];

    public BodyMovementProjection(Body body) {
        this.body = body;
        this.shapeRenderer = body.entity.gameScreen.shapeRenderer;
    } // BodyMovementProjection constructor

    @Override
    public void update() {
        body.aabb.getCenter(posThisFrame);
        posLastFrame.set(posThisFrame).sub(body.bodyMovementTracker.getSpritePosDelta());
        projection.set(posThisFrame).sub(posLastFrame).scl(scalar).add(posLastFrame);
        if (debugProjection) {
            shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
            shapeRenderer.setColor(debugColorVals[0], debugColorVals[1], debugColorVals[2], debugColorVals[3]);
            shapeRenderer.line(posLastFrame, projection);
            shapeRenderer.end();
        } // if
    } // update

    public void setDebugColorVals(float r, float g, float b, float a) {
        debugColorVals[0] = r;
        debugColorVals[1] = g;
        debugColorVals[2] = b;
        debugColorVals[3] = a;
    } // setDebugColorVals

} // BodyMovementProjection
 

Ответ №1:

Нормализуйте перед масштабированием. Нормализуя, вы делаете вектор направления 1 единицей длины, а масштабируя его после на 25, вы каждый раз получаете вектор, равный 25 единицам, независимо от того, как далеко друг от друга находятся текущая и предыдущая позиции.

Комментарии:

1. Я даже не подумал об этом. Спасибо, я разберусь с этим. (Я новичок здесь, работаю над первой игрой в LibGDX в свободное время. Я определенно заржавел в своей геометрии и алгебре!)