2017-09-01 65 views
1

以下是对一些你会看到的方法做了简单描述:减速而移动的方向

  • 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的幅度插值)。而且,当它变得非常缓慢时,它只会在目标方向上“漂移”。

关于我如何完成此任何想法?我无法弄清楚。这是一个很大的问题,所以非常感谢。

这是使用我制作的大型图书馆,所以如果您有任何问题,请咨询一些内容,但我想我已经介绍了大部分内容。

+2

我不明白你想做什么。如果你只是想减速,那就减少速度矢量的长度。如果您假设[Rayleigh drag](https://en.wikipedia.org/wiki/Drag_(physics)#Drag_at_high_velocity),则阻力以速度的二次方增长。在[Stokes drag](https://en.wikipedia.org/wiki/Drag_(physics)#Very_low_Reynolds_numbers:_Stokes.27_drag)的情况下,它会线性增长。假设一个恒定的船舶质量和一个不断更新的时间框架,你可以这样做:'dragForce = constant * v.length()(^ 2); v = v *(1 - dragForce/v.length())'。 –

+2

顺便说一句,如果它对你的问题至关重要,请不要链接到外部内容。据我所知,如果你输入零向量(因为它的长度小于'amount * amount'),你的插值函数将返回零向量。 –

+0

@NicoSchertler对不起,我不得不张贴在pastebin上,因为它没有格式化在这里,无论我尝试了什么。插值确实有效(我多次使用它)。此时,当没有按键被按下时,船只减速,直到它完全停止,而沿着它正在移动的最后方向。我希望这艘船能做到这一点,但是在某个方向上。之前,我可以将速度内插到零。但我不知道该怎么做,如果我希望它能够改变方向而放慢速度。如果它仍然很难理解,可能会发布一些图片,如果这可能有帮助。 – MCMastery

回答

1

你的interpolate功能确实奇怪。为什么不使用简单的物理模型?例如:

体具有位置(px, py)和速度(vx, vy),也单位方向矢量(dx, dy)是方便

后(小)的时间间隔dt的速度取决于加速度

vx = vx + ax * dt 
vy = vy + ay * dt 

任何外力的变化(电机)导致加速度和变化速度

ax = forcex/mass //mass might be 1 
ay = forcey/mass 

干摩擦力f奥尔塞大小不依赖于速度,它的方向是相反的速度

ax = c * mass * (-dx) 
ay = c * mass * (-dy) 

液体摩擦力大小取决于速度(有针对不同的情况许多不同的方程),它的方向是相反的速度

ax = k * Vmagnitude * (-dx) 
ay = k * Vmagnitude * (-dy) 

因此,对于每个时间间隔添加所有的力量,找到加速度,找到相应的速度,相应地改变位置