无数次我使用欧拉积分为小玩具游戏实现了物理模拟:按下箭头键,它设置加速度,然后整合加速度并添加到速度,然后整合速度并添加到获得最终职位的位置。我到处看到这一点。游戏物理模拟:基于能量加速
但是当我想到动能时,我意识到它不是“现实”的。如果给出像汽车这样的东西,发动机会产生功率(kW),而不是力量/加速度。随着恒定的加速度,虚拟发动机的功率随着速度的增加而增加。在我的情况下,这是一艘飞船,但我想尝试在一个方向上施加恒定的力量,而不是持续加速。
我的评估是否正确,跟踪能量比加速度更真实?如果是这样,它实际上跟踪能量矢量而不是速度矢量更有意义吗?但之后我必须转换为速度来整合。所以我已经完成了一维仿真和它的工作,当然我可以使用E = 0.5 * m * v * v并且求解v。但是当使用向量时,我不能采用“平方根”的能量(矢量)。我可以找到方向相同的矢量,但幅度是原始的平方根,但是这是物理上正确的吗?
我以为肯定有人必须这样做,但我搜索并搜索了网页,没有看到它。所以,也许我离开了基地。基本上,我想要做的是采取传统的“向上箭头和太空飞船以恒定加速度加速”并将其改变为“按箭头和飞船上升以恒定速率获得动能”,但在2D案例,而不是1D案件(我已经有1D案件)。
更新:根据Exceptyon的接受的答案JavaScript代码:
function sq(x) {
return x * x;
}
//Square cosine, preserving sign
function cos2(x) {
var ret = Math.cos(x);
if (ret >= 0) {
return sq(ret);
} else {
return -sq(ret);
}
}
//Square sine, preserving sign
function sin2(x) {
var ret = Math.sin(x);
if (ret >= 0) {
return sq(ret);
} else {
return -sq(ret);
}
}
function Ship() {
this.x = 20; //m
this.y = 40; //m
this.dx = 0; //m/s
this.dy = 0; //m/s
this.ex = 0; //J
this.ey = 0; //J
this.pangle = Math.PI/2; //pointing angle
this.mass = 1; //kg
this.power = 200; //W
this.update = function(dt) {/*...*/} //update x/y based on dx/dy
/**
* Direct translation of Exceptyon's equations, but preserving sign in cos^2, sin^2 and sqrt
* operations.
* @param dt delta time in seconds
*/
this.speedup2 = function(dt) {
this.ex += this.power * dt * cos2(this.pangle);
this.ey += this.power * dt * -sin2(this.pangle);
var signx = this.ex > 0 ? 1 : -1;
var signy = this.ey > 0 ? 1 : -1;
this.dx = Math.sqrt(2 * Math.abs(this.ex)/this.mass) * signx;
this.dy = Math.sqrt(2 * Math.abs(this.ey)/this.mass) * signy;
};
/**
* Modified variation of Exception's post where I transform energy "vector" into velocity, that
* I believe is equivalent.
*/
this.speedup = function(dt) {
this.ex += Math.cos(this.pangle) * this.power * dt;
this.ey += -Math.sin(this.pangle) * this.power * dt;
var totalEnergy = Math.sqrt(this.ex * this.ex + this.ey * this.ey);
var speed = Math.sqrt(2 * totalEnergy/this.mass);
var ratio = speed/totalEnergy;
this.dx = this.ex * ratio;
this.dy = this.ey * ratio;
this.speed = Math.sqrt(this.dx * this.dx + this.dy * this.dy);
};
}
能源是一个标量。您需要处理矢量量,如力和加速度。你之前就有过。顺便说一句 - 能量以速度的平方增加。恒定的加速度使能量呈指数级增长。 –
我想你可能会混淆一些基本的物理概念。 “恒定能量”对加速没有意义。例如一个完整的燃料箱具有恒定的能量,它只是坐在那里。功率是应用能量的速率。谷歌为此的第一次袭击是http://hyperphysics.phy-astr.gsu.edu/hbase/work.html这可能会有所帮助。 –
没有能量的方向。也没有哪一个更“现实”,因为它们都是真实的,它们基本上都是以同样的方式看待,但是具有不同的角度。在你的情况下,更“适合”的是矢量方法,这是一个/ V/S(此外,这篇文章没有与编程无关) –