1

好的,我在 Android 中有一个粒子系统。

现在我使用了大约 500 个粒子,它们在屏幕上随机移动。我设置它以便触摸(实际上现在是运动)。所有的粒子都会接近你的手指。问题是它们以静态角度接近(没有考虑到它们与接触点的角度)。

任何人都有算法来确定如何均匀接近一个点?我试图以randians..然后转换等..变得非常混乱。这种简单的方法表明我以正确的速度移动……但它是一种简单的 45 角方法。(请记住,在 android 上没有负 x,y 坐标.. 左上角是 0,0.. 右下角是 (max,max)。函数采用 ontouch (x,y) 坐标。bx 是粒子坐标。

public void moveParticles(float x, float y) {
    for (Particle b : Particles)
        {
         if (x <= b.x)
             b.x = b.x -1;
         else b.x = b.x +1;

          if (y <= b.y)
            b.y = b.y -1;
          else b.y = b.y +1;
         }          
}
4

2 回答 2

2

假设触摸位于屏幕中心的简单代码:

public void moveParticles(float x, float y) {
    for (Particle b : Particles) {
      b.x += ((b.x-x)/(x/2))*speedmodifier;
      b.y += ((b.y-y)/(y/2))*speedmodifier;
    }
}

触摸轴每侧具有标准化速度的代码:

public void moveParticles(float x, float y) {
    for (Particle b : Particles) {
      height_difference = screenheight-x;
      width_difference = screenwidth-y;
      height_ratio = (b.x < x) ? screen_height-height_difference : height_diffrence;
      width_ratio = (b.y < y) ? screenwidth-width_difference : width_difference;

      b.x += ((b.x-x)/height_ratio)*speedmodifier;
      b.y += ((b.y-y)/width_ratio)*speedmodifier;
    }
}

制作这段代码的步骤: 需要得到屏幕上下x轴和y轴的比例,这样无论触摸在哪里,粒子的速度都会从0到1归一化:

height_difference = screenheight-x;
width_difference = screenwidth-y;
height_ratio = (b.x < x) ? screen_height-height_difference : height_diffrence;
width_ratio = (b.y < y) ? screenwidth-width_difference : width_difference;

一旦我们有了归一化信息,我们就可以使用它来归一化粒子速度:

b.x += ((b.x-x)/height_ratio)*speedmodifier;
b.y += ((b.y-y)/width_ratio)*speedmodifier;
于 2011-09-29T02:13:24.860 回答
1

以粒子的位移为向量,以收敛点为原点:

x = particle.x - finger.x
y = particle.y - finger.y

获取单位向量:

norm = sqrt(pow(x, 2.0) + pow(y, 2.0))
x = x / norm
y = y / norm

按单位向量* -1 * 速度因子置换粒子:

particle.x -= x * speed
particle.y -= y * speed

那样有用吗?我只是写了这个,没有尝试或什么都没有。

于 2011-09-29T02:21:40.900 回答