数学向量和旋转(Topdown java game dev – physics problem)
作者:互联网
我一直在做一个自上而下的汽车游戏已经有一段时间了,它似乎总是能够正确地做一件事.在我的实例中,它正确地完成了我的汽车物理.
我的当前轮换无法正常处理我遇到了问题.我知道问题在于我的幅度为0,同时乘以Math.cos / sin方向,但我根本不知道如何解决它.
这是当前的底层代码.
private void move(int deltaTime) {
double secondsElapsed = (deltaTime / 1000.0);// seconds since last update
double speed = velocity.magnitude();
double magnitude = 0;
if (up)
magnitude = 100.0;
if (down)
magnitude = -100.0;
if (right)
direction += rotationSpeed * (speed/topspeed);// * secondsElapsed;
if (left)
direction -= rotationSpeed * (speed/topspeed);// * secondsElapsed;
double dir = Math.toRadians(direction - 90);
acceleration = new Vector2D(magnitude * Math.cos(dir), magnitude * Math.sin(dir));
Vector2D deltaA = acceleration.scale(secondsElapsed);
velocity = velocity.add(deltaA);
if (speed < 1.5 && speed != 0)
velocity.setLength(0);
Vector2D deltaP = velocity.scale(secondsElapsed);
position = position.add(deltaP);
...
}
我的矢量类模拟矢量基础 – 包括加法减法,乘以标量……等.
重新迭代潜在的问题 – 当幅度为0时,幅度* Math.cos(dir)= 0,因此当玩家仅按下没有“加速”方向的右或左箭头键时不会改变.
如果有人需要更多信息,你可以找到它
http://www.java-gaming.org/index.php/topic,23930.0.html
解决方法:
是的,那些物理计算都混淆了.根本问题在于,正如您所知,将加速度乘以方向是错误的.这是因为你的“方向”不仅仅是汽车加速的方向;这是汽车行驶的方向.
解决这个问题的最简单方法是首先分别考虑加速度和转向.首先,加速:为此,你只有一个速度,你有“向上”和“向下”键.为此,代码看起来像这样(包括将接近零速度降低到零的阈值代码):
if (up)
acceleration = 100.0;
if (down)
acceleration = -100.0;
speed += acceleration * secondsElapsed;
if (abs(speed) < 1.5) speed = 0;
另外,你有转向,它会改变汽车运动的方向 – 也就是说,它会改变你乘以速度的单位矢量来获得速度.我也冒昧地修改你的变量名称,看起来更像代码的加速部分,并澄清它们的含义.
if (right)
rotationRate = maxRotationSpeed * (speed/topspeed);
if (left)
rotationRate = maxRotationSpeed * (speed/topspeed);
direction += rotationRate * secondsElapsed;
double dir = Math.toRadians(direction - 90);
velocity = new Vector2D(speed * Math.cos(dir), speed * Math.sin(dir));
您可以使用第二部分速度计算中第一部分的速度简单地组合这两个部分,以获得完整的简单加速和转向模拟.
标签:java,game-physics 来源: https://codeday.me/bug/20190613/1235981.html