我正试图制作一个自上而下的太空飞船游戏,我希望这个运动有点逼真.360度惯性,重力等
我的问题是我可以让船在惯性运动的情况下360°运行没有问题,但我需要做的是对发动机的运行速度施加限制,同时不限制推/拉船的其他力.
因此,如果发动机转速最大为500且船舶从重力井转向1000,那么当它的发动机打开时,该船不会进入1500,但是如果指向远离角度的话,那么它可能会变慢下.
对于它的价值,我正在使用Construct,而我所需要的只是数学.
感谢您的帮助,我想要解决这个问题.
Lef*_*ium 25
(请参阅下面的我正在使用的C++代码段和运行演示 [仅限Windows].)
说明:
洛伦兹因子的定义,其中v是速度,c是光速: 
这是有效的,因为随着速度的增加,洛伦兹因子接近无穷大.物体需要施加无限大的力才能穿过光速.在较低的速度下,洛伦兹因子非常接近1,接近经典的牛顿物理学.
随着速度的增加,洛伦兹因子图:
![]()
注意:我之前尝试通过玩摩擦设置来解决我的小行星游戏中的类似问题.当我读到你的问题^^时,我想出了这个解决方案
更新:我尝试实现这一点并发现了一个潜在的缺陷:随着光速c的接近,包括减速在内,所有方向的加速都受到限制!(反直觉,但在现实世界中这种情况会发生特殊的相对论吗?)我想这个算法可以被修改以考虑速度和力矢量的方向...... 该算法已被修改以考虑向量的方向所以这艘船不会在高速时"失去控制性".
更新:这是我的小行星游戏的代码片段,它使用洛伦兹因子来限制游戏对象的速度.它运作得很好!
更新:*添加了此算法的可下载演示(仅限Windows).我不确定是否所有依赖项都包含在zip中; 如果遗漏了什么,请告诉我.并且玩得开心^^
void CObject::applyForces()
{
// acceleration: change in velocity due to force f on object with mass m
vector2f dv = f/m;
// new velocity if acceleration dv applied
vector2f new_v = v + dv;
// only apply Lorentz factor if acceleration increases speed
if (new_v.length() > v.length())
{
// maximum speed objects may reach (the "speed of light")
const float c = 4;
float b = 1 - v.length_squared()/(c*c);
if (b <= 0) b = DBL_MIN;
double lorentz_factor = 1/sqrt(b);
dv /= lorentz_factor;
}
// apply acceleration to object's velocity
v += dv;
// Update:
// Allow acceleration in the forward direction to change the direction
// of v by using the direction of new_v (without the Lorentz factor)
// with the magnitude of v (that applies the Lorentz factor).
if (v.length() > 0)
{
v = new_v.normalized() * v.length();
}
}
Run Code Online (Sandbox Code Playgroud)