【发布时间】:2016-05-26 15:37:55
【问题描述】:
我正在尝试制作一个简单的 2D 物理引擎。引擎将重力定义为 90 度(垂直向下)的 10 个单位。在宇宙中,存在物理实体,每个实体都具有由速度和方向组成的速度。每次实体更新时,我都会将重力向量添加到每个实体的速度向量中。
如果实体静止或平行于重力矢量移动,它会掉下来,否则它会工作一半。我的意思是,假设物体在表面上方 45 度角拍摄,它会上升,弯曲到顶点,然后继续平行于表面。重力似乎会随着它的上升而改变速度,但不会使物体再次落下。
我想知道我解决这个问题的方法是否有问题,或者我的解决方案在代码中的实现是否有问题。
更新功能:
public static void UpdateAll()
{
foreach (var entity in Entities)
{
entity.Velocity.AddVector(Universe.Gravity.Speed, Universe.Gravity.Direction);
}
var iterator = 1;
foreach (var entity in Entities)
{
for (var index = iterator; index < Entities.Count; index++)
{
//Collision Detection
}
entity.Update();
iterator++;
}
}
添加向量函数:
public void AddVector(float speed, int direction)
{
var radiansA = Angles.DegreesToRadians(SetDirection);
var radiansB = Angles.DegreesToRadians(direction);
var vAx = SetSpeed * (float) Math.Cos(radiansA);
var vAy = SetSpeed * (float) Math.Sin(radiansA);
var vBx = speed * (float) Math.Cos(radiansB);
var vBy = speed * (float) Math.Sin(radiansB);
var magX = vAx + vBx;
var magY = vAy + vBy;
var magnitude = (float) Math.Sqrt(Math.Pow(magX, 2) + Math.Pow(magY, 2));
var theta = Angles.RadiansToDegrees((float) Math.Atan2(magY, magX));
SetSpeed = magnitude;
SetDirection = theta;
}
编辑:我删除了一些 cmets 建议的 if 语句,但结果仍然相同。
已解决:在 cmets 中指出了代码错误,我更新了 add 函数以反映所需的更改。
【问题讨论】:
-
如果你使用 vectors 开始,它实际上要容易得多。不知道为什么需要
if的东西 -
将速度作为大小和方向是项目规范的一部分。
if是在对象没有速度的情况下存在的。 -
@Jedi_Maseter_Sam 如果您使用向量,您仍然可以获得向量运行时的大小和方向。您可以使用属性使其透明。
-
我现在无法正确测试,但请检查
Math.Atan2而不是Math.Acos以恢复您的最终角度。此外,一些适当的测试用例也是一个好主意。 -
@Jedi_Maseter_Sam “将速度作为大小和方向是项目规范的一部分” - 你认为向量是什么?
标签: c# physics game-physics