【发布时间】:2017-09-01 16:28:05
【问题描述】:
以下是您将看到的一些方法的简要说明:
-
this.bounds:返回船的边界(一个矩形) -
this.bounds.getCenter():返回一个Vector2d,表示船边界的中心。 -
getVelocity():Vector2d,代表船的速度(添加到每一帧的位置) -
new Vector2d(angle):一个新的Vector2d,在给定角度(以弧度为单位)时进行归一化 -
Vector2d#interpolate(Vector2d target, double amount): 不是线性插值!如果你想查看interpolate代码,这里是(在Vector2d类中):public Vector2d interpolate(Vector2d target, double amount) { if (getDistanceSquared(target) < amount * amount) return target; return interpolate(getAngle(target), amount); } public Vector2d interpolate(double direction, double amount) { return this.add(new Vector2d(direction).multiply(amount)); }
当玩家不按键时,飞船应该只是减速。这就是我为此所做的:
public void drift() {
setVelocity(getVelocity().interpolate(Vector2d.ZERO, this.deceleration));
}
但是,现在我意识到我希望它在朝向目标时漂移。我试过这个:
public void drift(Vector2d target) {
double angle = this.bounds.getCenter().getAngle(target);
setVelocity(getVelocity().interpolate(new Vector2d(angle), this.deceleration));
}
这当然不会真正达到零速度(因为我正在向一个角度向量插值,它的大小为 1)。此外,它只有在变得非常缓慢时才会真正“漂移”到目标的方向。
关于如何实现这一点的任何想法?我就是想不通。这是一个大问题,非常感谢。
这是使用我制作的一个大型库,所以如果您对某些内容有任何疑问,请询问,不过我想我已经涵盖了大部分内容。
【问题讨论】:
-
我不明白你在做什么。如果您只想减速,则只需减少速度矢量的长度。如果您假设Rayleigh drag,则阻力随速度呈二次方增长。对于Stokes drag,它是线性增长的。假设一个恒定的船质量和一个恒定的更新时间框架,你会做这样的事情:
dragForce = constant * v.length()(^2); v = v * (1 - dragForce / v.length()). -
顺便说一句,如果对您的问题至关重要,请不要链接到外部内容。据我所知,如果您输入零向量,您的插值函数只会返回零向量(因为它的长度小于
amount * amount)。 -
@NicoSchertler 抱歉,我不得不在 pastebin 上发帖,因为无论我尝试什么,这里都没有格式化。插值确实有效(我多次使用它)。现在,船只是在没有按键时减速,直到它完全停止,同时朝着它移动的最后一个方向前进。我希望这艘船也这样做,但朝着某个方向。以前,我可以将速度内插到零。但是我不知道如果我希望它在能够改变方向的同时放慢速度该怎么办。如果仍然难以理解,可能会发布一些图片,如果这可能会有所帮助。
-
你总是要求飞船在目标上停下来吗?这对于简单的拖曳力是不可能的,但如果你的船有某种“刹车”系统就可以了
标签: java math 2d interpolation physics