Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 将“角速度”设置为二维粒子组_Math_Rotation_2d_Particles_Particle System - Fatal编程技术网

Math 将“角速度”设置为二维粒子组

Math 将“角速度”设置为二维粒子组,math,rotation,2d,particles,particle-system,Math,Rotation,2d,Particles,Particle System,我有一组二维粒子,我想设置它的角速度,让粒子围绕它们的群中心旋转 我找到了这个方法来得到群的角速度,并且我尝试了反转逻辑来实际设置群的角速度 在我的尝试中,通过以相同的方式获得群质量、群中心和群线速度,我保留了大部分逻辑。但似乎我的大部分尝试和错误都没有达到预期的结果 如果你知道我应该如何处理这个逻辑反转,从获得角速度到设置角速度,我很乐意听你说 getParticleGroupAngularVelocity() { particleCount = 30; particleMass = 1.5;

我有一组二维粒子,我想设置它的角速度,让粒子围绕它们的群中心旋转

我找到了这个方法来得到群的角速度,并且我尝试了反转逻辑来实际设置群的角速度

在我的尝试中,通过以相同的方式获得群质量、群中心和群线速度,我保留了大部分逻辑。但似乎我的大部分尝试和错误都没有达到预期的结果

如果你知道我应该如何处理这个逻辑反转,从获得角速度到设置角速度,我很乐意听你说

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;
}
getParticleGroupAngularVelocity()
{
粒子计数=30;
粒子质量=1.5;
particleGroupMass=0;
particlegroup惯性=0;
粒子群角速度=0;
particleGroupCenter=向量(0,0);
particleGroupLinearVelocity=向量(0,0);
对于(i=0;i0)
{
粒子组中心*=1/粒子组质量;
particleGroupLinearVelocity*=1/particleGroupMass;
}
对于(i=0;i0)
{
粒子组角速度*=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;
}
for(i=0;i

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

你有一组粒子,你想改变部分或全部粒子的速度,以便给这组粒子一个所需的“群角速度”(我使用这个术语,与此代码的意义相同),同时保持“群线速度”不变,对吗?你还有其他情况吗?我问这个问题是因为有很多方法可以做到这一点。我希望能够改变所有粒子的速度,同时保持群的线速度。因此,如果这组粒子在x轴和/或y轴上以恒定速度运动,我希望能够使这组粒子围绕其中心旋转,而不影响它们的其他运动。至于其他条件,我真的想不出其他条件。但是,我可能对这个问题也缺乏一些见解。太好了,这很管用!非常感谢你。只有一个问题可以消除任何疑问。在原始代码中,有一个基于惯性的速度调整。在您提供的解决方案中,惯性不用于影响粒子速度。原因是什么?再次感谢你,贝塔@克劳迪娅:这个解会保持线动量,但不会保持角动量。(“守恒”在物理意义上是“不改变”。)原始代码测量角动量,然后除以惯性矩得到
粒子组角速度
;这个代码冻结了粒子之间的相对位置,然后使整个粒子群“旋转”,我明白了。谢谢你详尽的回答和解释。