2014-05-12 42 views
0

我有一个2d组的粒子,我想设置它的角速度,让粒子绕组的中心旋转。设置角速度为2d粒子群

我发现这种方法得到组的角速度,我试过反转逻辑来实际设置角组速度。

在我的尝试中,我通过以同样的方式获得组质量,组中心和组线速度,使大部分逻辑完好无损。但是,似乎我的大多数试验和错误都不能达到预期的结果。

如果您有任何关于如何解决从获取角速度到设置它的逻辑反转的知识,我很乐意听到您要说的话。

getParticleGroupAngularVelocity() 
{ 
particleCount = 30; 
particleMass = 1.5; 
particleGroupMass = 0; 
particleGroupInertia = 0; 
particleGroupAngularVelocity = 0; 

particleGroupCenter = vector(0, 0); 
particleGroupLinearVelocity = vector(0, 0); 

for (i = 0; i < particleCount; i++) 
{ 
    particleGroupMass += particleMass; 
    particleGroupCenter += particleMass * particles[i].position; 
    particleGroupLinearVelocity += particleMass * particles[i].velocity; 
} 

if (particleGroupMass > 0) 
{ 
    particleGroupCenter *= 1/particleGroupMass; 
    particleGroupLinearVelocity *= 1/particleGroupMass; 
} 

for (i = 0; i < particleCount; i++) 
{ 
    pos = particles[i].position - particleGroupCenter; 
    vel = particles[i].velocity - particleGroupLinearVelocity; 
    particleGroupInertia += particleMass * (pos.x * pos.x + pos.y * pos.y); 
    particleGroupAngularVelocity += particleMass * (pos.x * vel.y - pos.y * vel.x); 
} 

if (particleGroupInertia > 0) 
{ 
    particleGroupAngularVelocity *= 1/particleGroupInertia; 
} 

return particleGroupAngularVelocity; 
} 
+0

你有一组粒子,你想改变一些或所有粒子的速度,以便给这个组所需的“组角速度“(我使用松散的术语,与此代码相同),同时保持”组线速度“相同,是吗?你有其他条件吗?我问,因为有很多方法可以做到这一点。 – Beta

+0

我希望能够在保持组线速度的同时改变所有粒子的速度。因此,如果这组粒子在x轴和/或y轴上以恒定速度运动,我希望能够使这组粒子围绕它们的中心旋转,而不会影响它们的其他运动。 – Claudia

+0

至于其他条件,我真的不能想到其他条件。但是,我可能也缺乏对这个问题的一些见解。 – Claudia

回答

1

好的,应该这样做。

for (i = 0; i < particleCount; i++) 
{ 
    pos = particles[i].position - particleGroupCenter; 
    vel.x = - particleGroupAngularVelocity * pos.y; 
    vel.y = particleGroupAngularVelocity * pos.x; 
    particles[i].velocity = vel + particleGroupLinearVelocity; 
} 

这将保持组的线速度。单个粒子将被赋予速度,就好像它们全部嵌入同一片玻璃中一样,围绕组中心旋转。 (保持他们在这些轨道上是别人的问题。)

+0

太棒了,那有效!非常感谢你的测试版。只有一个问题可以消除任何疑问。在原始代码中,根据惯量调整速度。在您提供的解决方案中,惯性不用于影响粒子速度。那会是什么原因?再次感谢,Beta! – Claudia

+0

@Claudia:这个解决方案将保留线性动量,但不是角动量。 (物理意义上的“保存”,“不变”)。原始代码*测量角动量,然后除以惯性矩以得到'particleGroupAngularVelocity';此代码将粒子相对于彼此冻结,然后“旋转”整个组。 – Beta

+0

我明白了。感谢您的全面回答和解释。 – Claudia