我正在写一个2D游戏,其中我想要有类似板条箱的物品。像真正的板条箱一样,这些物体会四处移动。我对如何实现这一点有一个假设的想法:
基本上我会用它们的力和速度单位向量存储盒子的“角”坐标,并且在每次更新中我基本上都会执行以下步骤:
1.相应地施加力(重力,碰撞等)
2.根据力修改速度矢量
3.移动框的每个角落,如下所示:
我为每个角落重复3次,所以我得到了立方体的真实运动。
我的问题是:这种方法是朝着正确的方向前进吗?这个理论是否正确?如果没有,基于2D环境中的矢量移动框的正确方法是什么?
只是为了澄清:我只是拖动图片中的“A”角,但我想用自己的向量重复拖动每个角落。通过“拖动”我的意思是我刚才说的算法。
答案 0 :(得分:1)
保持每个角落的坐标和速度毫无意义,因为您将存储大量冗余信息。盒子是刚性物体,这意味着必须在任何时刻都满足约束,即任何两个给定角落之间的距离是固定的。这也转化为连接所有四个角的速度的约束,因此它们不是独立的值。对于刚体,任何点的运动都是两个独立运动的总和 - 质心(CM)的线性运动和围绕固定轴的旋转 - 通常(但不总是)选择经过固定轴的运动。厘米。因此,您只需要存储板条箱CM的位置和速度(与板条箱的几何中心重合)以及旋转角度和CM周围的旋转速度。
关于运动,重力场是恒定的矢量场,因此不能在像矩形板条箱这样的对称物体中引起旋转。相反,它只产生CM的加速垂直运动。这也是由于所有外力所发生的情况 - 必须采用它们的矢量和并将其应用于CM。只有方向不通过CM的外力才会产生扭矩,从而导致旋转。这种力是当板条箱相互碰撞或撞击地面/墙壁时产生的任何外部推动/拉动或反作用力。由外力引起的扭矩计算很容易,但计算反作用力可能非常涉及过程,因为必须采用受约束的动力学。一旦计算出扭矩,就必须将其除以产生的惯性矩,以获得角加速度。通常使用另一个轴更方便而不是通过CM的那个轴 - 在这种情况下可以使用Steiner's theorem来计算绕另一个轴的惯性矩。
总结:
请参阅here了解刚体运动的一些示例问题以及物理实际如何制定出来。
考虑到你的算法,如果通过“速度矢量”你实际上意味着“CM的速度”,那么1将是正确的 - 所有角落都在相同的方向上移动(CM的线性运动)。但是2并不总是正确的 - 适当的旋转角度将取决于施加扭矩的时间(例如,模拟时间步长),并且必须考虑到当板条箱旋转时杠杆臂长度在两者之间变化。 / p>