Articles of 集成

根据移动的物理像素计算速度/时间

在我的游戏中,我整合如下:(请假设所有variables被声明) sprite.xTimeInSeconds = 5.0; //Time in seconds it should take this object to cross screen sprite.xVelocity = 1f/xTimeInSeconds; 然后我像这样移动它: sprite.gridX+=sprite.xVelocity*dt; sprite.x=sprite.gridX*screenWidth; 然后我只是在这些坐标上呈现精灵: sprite.draw(); //Uses sprite's internal 'x' which was set above 所以,游戏中的所有东西都能正常工作 – 也就是说。 所有的移动都可以正确地缩放,不管是什么设备,但是现在我正在尝试为自己的菜单编写自己的滑动触摸控制系统。 菜单确实起作用 – 用户可以将手指放在屏幕上,上下移动,当他们松开手指时,菜单保持滚动(*见下文)。 如果他们再次按下手指,滚动将立即停止,正如人们所期望的那样。 我唯一遇到的问题是如何在用户释放手指时“减速”滚动。 目前,它保持相同的速度滚动,直到达到限制或用户点击屏幕停止。 在我的触摸滚动方法中,我只是确定用户手指移动了多less,然后移动相同数量的对象。 我需要知道(而且不能弄清楚),我怎么能 – 只知道移动像素的数量,找出上面的“时间”variables? (一旦我有了这个,我可以在所有设备上按比例减速)。

高速积分误差

我已经实现了一个简单的两个行星的模拟(简单的2D磁盘),其中唯一的力量是重力,也有碰撞检测/响应(碰撞是完全弹性的)。 我可以发射一颗行星进入另一颗行星的轨道。 碰撞检测代码虽然不能很好地工作。 我注意到,当一颗行星在自由落体中撞击另一颗行星时,它会向后加速并远远高于其原始位置。 有些人认为,简单的欧拉整合正在造成错误。 考虑这种情况。 一个物体的质量是1kg,另一个物体的质量等于地球。 说这个物体高出地面10米。 假设我们的dt(delta t)是1秒。 该对象在第一次迭代结束时达到9米的高度,在第二次迭代结束时达到7米,在第三次迭代结束时达到4达到最高,在第四次迭代结束达到0。 在这一点上它击中地面并以每秒10米的速度反弹。 问题是在dt = 1时,在第一次迭代时它会弹回到10的高度。它需要几个步骤才能使对象改变路线。 所以我的问题是,我可以使用哪种集成方法来解决这个问题。 当速度很高时,我应该把dt分成小块吗? 或者我应该使用另一种方法? 你建议什么方法? 编辑:你可以在这里看到源代码在github: https : //github.com/elektito/diskworld/

EULER集成

我对使用集成移动精灵有点困惑。 这是我一直实现的: 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 […]

将缩放轴角速度整合到四元数中的正确方法

在我的互联网旅行中,我遇到了将缩放轴角速度整合到四元数中的两种不同方法。 第一种方式将角速度转换为像这样的四元数轴角 Quaternion q = new Quaternion(vector.normalised(), vector.getLength()); 构造函数如下所示: float sinHalfAngle = (float) Math.sin(angle / 2); float cosHalfAngle = (float) Math.cos(angle / 2); this.x = axis.x * sinHalfAngle; this.y = axis.y * sinHalfAngle; this.z = axis.z * sinHalfAngle; this.w = cosHalfAngle; 然后将现有的四元数乘以新的四元数 this.rotateSelf(q); 第二种方法也将速度转换成四元数,但使用不同的方法: Quaternion change = Quaternion.mul( new Quaternion(x * 0.5f, y * 0.5f, […]

如何将加速计读数转换为物体移动?

我正在使用DeviceMotionEvent web API ,它使我可以将设备的加速度分解为x,y和z维以及时间间隔。 以下是基于这些data加速移动屏幕上的对象的data (为了清楚起见,只是x维): velocity.x = data.acceleration.x * data.interval; var newLeft = $('.object').position().left + (velocity.x); $('.object').css({ 'left': newLeft }); 这样的作品,移动之后,可以回到起点,而不是放慢速度。 我究竟做错了什么? 我该如何解决这个问题? 以下是API返回的一些数据示例: { acceleration: { x: -0.048474962000711816, y: 0.025074772074713834, z: -0.0035549827887938587 }, accelerationIncludingGravity: { x: -0.07826046448306878, y: 0.34760814211749236, z: -9.804854269410603 }, rotationRate: { alpha: -0.15093386712448556, beta: 0.051146754356783085, gamma: -0.019824252207518427 }, interval: 0.05000000074505806 […]

在3D中实现比例导航

下午好, a = N *λ'* V 是命中目标所需命令加速度的公式, 其中N是比例常数,λ'是视线变化,V是closures速度。 数据我本来就有 : 导弹和​​目标的[x,y,z]位置; [vx,vy,vz]导弹和目标的速度vector; [x,y,z]vector,从导弹指向目标和反面; 这是由我设定,但仍然:导弹的最高速度。 数据我可以得到一些计算 : 导弹和​​目标之间的垂直角度(和相反); 导弹和​​目标之间的水平角度(和其他方式)。 这是游戏的参考系统: λ'或视线相对于时间的导数,这是一个我确实不理解的概念,理论上它的单位应该是Hz或(s ^ -1),因为m / s ^ 2 =λ '* m / s – >λ'= 1 / s V应该很容易计算:V = v(导弹) – v(目标)OR Vx =(v(导弹)-v(目标))* cos(x0y) Vy =(v(导弹)-v(目标))* sin(y0z) Vz =(v(导弹) – v(目标))* cos(y0z) N这是一个标量数字,通常是3。 计算出的加速度将传递给RK4积分器,该积分器将拦截器移向其目标。 为了控制导弹,我将在每次更新(每1/60秒)时改变其速度vector,并相应地改变其方向。 […]

为什么RK4比欧拉集成更好?

在这些幻灯片的最后,作者比较了所有不同的集成商。 无论如何,除了改进的欧拉积分和龙格库塔4积分 ,都通过了所有的testing。 我想我应该提一下,我正在研究一个不是物理密集的2D游戏。 我只是好奇在哪里改进欧拉集成不足而不得不使用RK4。 我的游戏主要由简单的重力(跳跃和下降),沿着X轴和Y轴的移动以及边框碰撞组成。 是否值得实施RK4或改进欧拉是否足够? 我看到很多关于欧拉一体化用户受到批评的讨论,但从我所看到的,改进的欧拉在简单的二维问题上是相当的。 我想它也会更快。