Vector 需要我的游戏中2D轨道的帮助吗
在我正在制作的一个游戏中,我的想法是鼠标光标代表一个质心,并且有物体围绕着它旋转。 光标本身不是对象,并且光标与对象之间没有碰撞 理想的方法是,我可以输入目标的x和y坐标,也许还有轨道半径,然后物体进入轨道并不断加速Vector 需要我的游戏中2D轨道的帮助吗,vector,processing,game-physics,game-development,Vector,Processing,Game Physics,Game Development,在我正在制作的一个游戏中,我的想法是鼠标光标代表一个质心,并且有物体围绕着它旋转。 光标本身不是对象,并且光标与对象之间没有碰撞 理想的方法是,我可以输入目标的x和y坐标,也许还有轨道半径,然后物体进入轨道并不断加速 当我移动鼠标时,物体会跟着移动;当我停止它时,它会回到相同的轨道半径 对象的加速度也应该能够改变,从而使鼠标产生或多或少的质量 我认为实现这一点的最好方法可能是使用向量 在射弹类中,我给了每个射弹4个字段:x坐标、y坐标、PVector速度和PVector acc(加速度) 我尝试
当我移动鼠标时,物体会跟着移动;当我停止它时,它会回到相同的轨道半径
对象的加速度也应该能够改变,从而使鼠标产生或多或少的质量 我认为实现这一点的最好方法可能是使用向量 在射弹类中,我给了每个射弹4个字段:x坐标、y坐标、PVector速度和PVector acc(加速度) 我尝试的第一件事是给物体恒定的加速度。速度矢量从零开始,计算加速度矢量,然后将其大小设置为某个值,并将其添加到速度矢量中。 这产生了非常大的轨道,缓慢的加速,当鼠标移动时,轨道就变大了 下一步,我试图使加速度增加,当它更接近质量中心时,受到实际行星的启发。这也不管用。轨道仍然太大,无法控制。有点失望,我试着让加速度不断增加,结果最好。轨道现在越来越小,但它只是不断减小到某个半径,然后停止。如果停止减小的半径是可配置的,这将是完美的,但无论参数如何,轨道总是太大,轨道大小一直缓慢地令人沮丧地减小。我的猜测是,加速度和速度以某种方式达到平衡,然后轨道停止下降
void move(float x,float y,float accm)
{
PVector target = new PVector(x, y);
PVector ball = new PVector(this.x, this.y);
acc = PVector.sub(target, ball);
acc.setMag(accm);
speed.add(acc);
println(acc.mag() + " " + speed.mag());
this.x = this.x + speed.x;
this.y = this.y + speed.y;
}
这是提供最佳结果的函数。在draw()
中调用该函数:
在draw()中
if(mousePressed==true)
{
对于(i=0;i 25)
n=0;
}
通过限制速度矢量并不断增加加速度矢量,幅值差开始增加,并且由于加速度矢量增加且速度矢量恒定且加速度矢量指向目标,矢量之和开始缓慢地越来越指向目标。如果(k<25)
存在限制加速度的条件,通过改变加速度的限制,你可以改变轨道半径。我想你可能会更快地得到答案,并将你的问题表述为“如何在游戏中模拟重力?”
无论如何,我会尝试一下
在类射弹中,我给了每个射弹4个字段:x坐标、y坐标、PVector速度和PVector acc
到目前为止听起来不错,只是不需要将加速度向量与对象一起存储。您将在模拟的每个“记号”上为每个对象计算一个新的加速度向量
我会在这里使用标准的物理术语,并将每个物体的矢量称为速度
,而不是速度
下一步,我试图使加速度增加,当它更接近质量中心时,受到实际行星的启发
如果使用正确的算法计算轨道,这种行为应该会自然发生
你的“太阳”和“行星”都有质量。质量通过重力相互吸引,重力从
记住,Force=mass*acceleration
,加速度为a=m*G/d^2
,其中m
是另一个物体(在本例中是太阳)的质量,d
是两个物体之间的距离。因此,重要的部分是,由于重力作用,物体的加速度随两个物体之间距离的平方而变化
因此,模拟中单个刻度的基本算法如下所示:
- 对于每个行星,计算一个加速度矢量
- 使用到“太阳”的距离的平方作为加速度向量的大小(乘以一个常数,该常数取决于“引力常数”和太阳的质量),方向当然是从行星到太阳的方向
- 将此加速度矢量添加到行星的速度矢量
- 将速度矢量添加到行星的(x,y)位置,使其向前移动
为了使所有这些工作顺利进行,将“太阳”的质量设置为行星质量的数倍,并根据模拟的时间选择一个合理的引力常数值,这一点非常重要。您必须使用这些常量才能找到最佳结果。我也对答案感兴趣,因此我将尝试帮助您获得一些答案。您可以添加Java标记作为最后一个res
if(mousePressed == true)
{
for(i=0;i<nproj;i++)
{
a[i].move(mouseX, mouseY,k);
}
k += n;
}
void move(float x,float y,float accm)
{
PVector target = new PVector(x, y);
PVector ball = new PVector(this.x, this.y);
acc = PVector.sub(target, ball);
acc.setMag(accm);
vel.add(acc);
this.x = this.x + vel.x;
this.y = this.y + vel.y;
vel.limit(15);
}
if(mousePressed == true)
{
for(i=0;i<nproj;i++)
{
a[i].move(mouseX, mouseY,k);
}
k += n;
if(k > 25)
n = 0;
}