LibGDX:缩放运动投影线以始终保持相同长度
LibGDX: Scale Movement Projection Line to Always be the Same Length
我正在 LibGDX 开发一款游戏。现在,我正在努力从移动实体的 body 当前位置沿其移动方向画一条线。也许我没有说对,所以这是我对我所说内容的艺术表现。
我遇到的问题是垂直线总是比对角线长得多,而对角线总是比水平线长得多。我想要的是无论方向如何,从实体投影的线总是相同的长度。
下面是用于从实体 body 的中心绘制线条的代码。如您所见,我正在缩放线(例如,按 25.0f)。也许有一个公式可以用来根据方向动态更改此标量?
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 个单位,然后将其缩放 25 个单位,每次都得到一个 25 个单位的向量,无论当前位置和先前位置相距多远。
我正在 LibGDX 开发一款游戏。现在,我正在努力从移动实体的 body 当前位置沿其移动方向画一条线。也许我没有说对,所以这是我对我所说内容的艺术表现。
我遇到的问题是垂直线总是比对角线长得多,而对角线总是比水平线长得多。我想要的是无论方向如何,从实体投影的线总是相同的长度。
下面是用于从实体 body 的中心绘制线条的代码。如您所见,我正在缩放线(例如,按 25.0f)。也许有一个公式可以用来根据方向动态更改此标量?
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 个单位,然后将其缩放 25 个单位,每次都得到一个 25 个单位的向量,无论当前位置和先前位置相距多远。