Articles of 整合

我应该如何管理多个游戏物理状态?

一段时间以来,我一直在研究一个高逼真度的真实物理空间模拟器。 在模拟器中,有几种不同的飞行模式,每个飞行模式都有一个首选的整合参考框架。 我目前使用最多的两个是在旋转的地球框架中的大气飞行,以及在惯性地球框架中的空间飞行。 它们之间的过渡是无缝的,所以在切换帧时,状态就变成了新的状态。 现在,我有一个国家对象存储车辆的位置,方向和衍生物。 虽然这些方程的forms在每个帧中是不同的,但是从这个状态同时有11个微分运动方程被集成。 在大气框架中,为了方便,将速度存储在车辆坐标系中,而在惯性框架中,速度仅仅是原始的惯性。 在这些框架中的一个集成后,我执行一个转换来填充另一个框架中的等价状态。 所以为了清除这一点,我有一个单一的状态对象,每个框架都有单独的存储(简化): struct State { vec3 pos; //position in rotating frame coords vec3 pos_i; //position in inertial frame coords vec3 vel; //velocity relative to rotating frame, in body coords vec3 vel_i; //velocity relative to inertial frame, in inertial coords quat orient; //orientation of vehicle wrt Local frame quat […]

使用加速度计移动精灵(Android)

在我以前的游戏中,我是​​这样移动我的精灵的: float time = 10f; //Number of seconds to pass a pre-defined area (using the screen width in this example) float velocity = 1f/time; //work out velocity based on above time float realX-=velocity*dt; //Move the sprite to the left (where dt is previously defined delta) x = realX*screenWidth //convert to screen coordinates so it can […]

重力模拟在短距离内失效

我有一个二维空间模拟与重力作用于三个身体(如太阳和2个行星)。 RK4仿真看起来相当稳定(Euler不稳定)。 如果其中一颗行星的轨道非常接近太阳(或其他行星),就会出现这个问题,因此很容易向α-centuri射击。 我认为这个问题是由于这种情况下数值积分的不对称性造成的。 如果一个行星在一个时间步中非常接近太阳,它将经历巨大的加速度,并在太阳的远端(下一次更新)结束,远离重力较弱的地方(1 / r ^ 2)将不会抵消以前更新中经历的巨大加速。 实施RK4改善了欧拉的状况,但并没有消除这个问题。 我正在做的这个游戏要求身体飞得非常靠近其他身体,仍然行为正确。 任何可能的解 编辑 回答者之一,@Thelvyn建议使用固定的椭圆轨道,但这不是一个选项,因为行星可以引力地相互作用。 另外,是的,我正在使用一个固定的时间步。

通过游戏物理模拟了解恒定的加速度

有各种可以用于游戏的整合方法。 我正在尝试写一个简单的物理引擎来决定半隐式的Eular和Verlet变体。 我不明白的是,大多数信息说,它们在不断加速的情况下运行良好 。 说一个以上的力量作用于一个身体,并使用力/质量来计算加速度。 速度和位置是由此推导出来的。 这意味着加速度不一定是恒定的吗? 我的理解是不正确的,即在一个步骤中施加一个力,而在另一个步骤中施加一个不同的力是变化的加速度? 难道这只是错误的数量是足够小,可以忽略。 因此,半隐式的,具有固定的时间步长但变化的加速度,例如,将是一个很好的近似值? 我很困惑,我读了很多不同的东西。 我会很感激任何见解。 谢谢!

跨越一体化vs欧拉集成商

我正在寻找各种整合方法来进行n体仿真,而且我对于跨越整合的实际实现略有困惑。 根据wikipedia页面, leapfrog方法是这样定义的: 当我想象如何编码时,我想到了这样的东西: while true: dt = time since last frame for every object: object.position += object.velocity * dt for every object: acceleration = object.calculate_acceleration() object.velocity += acceleration * dt render() 但这是欧拉整合吧? 所以把初始速度移回一半步使一阶方法变成二阶方法? 但是对于我来说,初始速度的微小变化并不重要,无论如何它将被设置为一个随机值。 为什么我不会只使用速度:这是一个游戏,数以万计的粒子飞周围的影响力,大致类似于引力。 我想尽量减less存储在每个partile中的数据量,以提高caching的位置,这就是为什么我不想使用需要存储加速度的方法(并重新计算它会太慢)。

如何整合拖拉距离?

在我的游戏中,我想模拟一种精确的子弹物理学。 我有以下的拖动方程(在C#中): float drag = 0.235f * density * velocity*velocity * Mathf.PI * sizeMM*sizeMM/4000000; 在非代码方面,这与拖动方程相同: drag = 0.5 x [density] x [speed]^2 x [area] x [drag coefficient (0.45)] 密度是物料的密度(空气为1.225kg /立方公尺),速度是米/秒的速度,尺寸MM是球体的直径,单位为毫米。 在阻力方程中为0.235,在球形物体的阻力系数中为0.45,而直径为2000mm的结果为4mil(2为直径减半,1000为转换为米)。 阻力值似乎是合适的,对于一个11.43mm半径子弹以251m / s的速度穿越空气,我得到的阻力值为1.860946(推测以m / s为单位)。 我需要做的就是把它整合到一个距离D上来获得结果速度,因为它影响到目标,我已经知道了距离值。 如果不使用循环,我愿意接受所有潜在的问题。 由于在多人战斗中每秒可以使用20次以上的可能性,因此我需要使得结果数据尽可能快。 我需要结果math总是使用提供的inputvariables。 密度可能会根据材料(即肉,凯夫拉尔,木材)而改变,尺寸MM会根据弹药的types而改变,速度会明显改变。 如果准确,最好使用近似值。 如果你能给出一个在总是精确的0.1%范围内的方程,并且运行两倍的速度,我更喜欢这个。

轨道:结合RK4,辛欧拉和Verlet速度积分器的优点

最近,我已经实施并比较了我的物理引擎的一些基本集成器。 3给了我最好的结果是RK4,辛欧拉和Verlet速度,但我想我需要一些更先进的东西。 我做了很多谷歌和StackExchangesearch,但没有find我在找什么。 我正在寻找那些结合了这些集成商的优势的东西,而没有他们的弱点。 我只关心轨道力学。 拖动和其他类似的力量不会通过积分器,因为我不太了解那些其他力量的完美答案并不重要,但(近)完美的答案对我的轨道力学是非常重要的。 计算上昂贵的algorithm(在合理的范围内)并不像准确性那么重要。 我的想法和主要关注如下: RK4优点:非常准确。 RK4缺点:长期失去能量。 这个模拟器需要能够运行很长时间,所以遇到这种“轨道衰变”是非常不可取的。 辛欧拉和Verlet速度优点:辛/不要失去能量。 辛欧拉和弗莱特速度缺点:更不准确。 高度偏心的轨道使得这一现象非常迅速…即使有一个简单的无质量卫星轨道大量物体的情况,卫星的轨道在较长的时间周围围绕着父物体“旋转”。 这是非常不可取的行为。 就我的目的而言,我不能诉诸于轨道上的轨道。 TLDR:我正在寻找一种algorithm,能够在没有缓慢衰减的情况下为我提供RK4的准确性。 计算费用不是主要关心的问题。 先谢谢您的帮助! 更新1:我在这里find一个类似的问题: https : //stackoverflow.com/questions/3680136/help-with-symplectic-integrator 在接受的答案中可能会有很好的答案,但经过几个小时的学习,我只确定他们很难理解。 我会继续研究被接受的答案的链接文章和源代码,并发表一个答案,如果我得到的结果。 不过,我怀疑,虽然这个algorithm并不比RK4复杂得多,但是链接的解释/源代码的符号体系和风格使得对于没有沉重的math/物理背景的人来说,这是非常困难的。 不幸的是,作为一个评论指出,OP接受了这个答案,但从来没有回来,自己给出了一个更清晰的解释。 我会留下这个问题,继续学习我自己。 希望能够一起为未来的search者提供一个更清晰的答案!