我正在尝试构建简单的粒子系统,我是初学c ++编码器。我可能有随机数生成器的问题,但我不确定我的代码中是否没有出现逻辑错误。我试图做出简单的爆炸效果。所有粒子都在同一点开始,然后从那一点开始向各个方向走去。所有粒子的位置都与像素(我的意思是int数)对齐,而速度是浮点数。下面我提供一些相关的代码:
std::mt19937 generator(std::time(0));//creating random number gen with seed
std::uniform_real_distribution<float> distributionx(0,6);
std::uniform_real_distribution<float> distributionkat(0,360);//distr for random number degrese
float radiany=(distributionkat(generator)*3.1415)/180;//calculating radians to provide to sin/cos function
sf::Vector2f unitvector;
tworzona.pozycja.x=this->pozycjaemitera.x;//assigning starting position, same for all particles
tworzona.pozycja.y=this->pozycjaemitera.y;
//below i calculate starting speed, as far as i know trigonometry this sure ensure that particles will fly in all directions
tworzona.speed.x=distributionx(generator)*cos(radiany);
tworzona.speed.y=distributionx(generator)*sin(radiany);
//below code should calculate unit vector in chosen direction and then i multiply it by random speed
unitvector.x=tworzona.speed.x/sqrt(pow(tworzona.speed.x,2)+pow(tworzona.speed.y,2));
unitvector.y=tworzona.speed.y/sqrt(pow(tworzona.speed.x,2)+pow(tworzona.speed.y,2));
unitvector.x=unitvector.x*distributionx(generator);
unitvector.y=unitvector.y*distributionx(generator);
tworzona.speed.x=unitvector.x;
tworzona.speed.y=unitvector.y;
问题是有可见的线条与x和y轴对齐,就像在发射器位置与中心交叉一样。大多数颗粒都在这些线附近,当颗粒数量增加时问题变得更加明显,大约9000个颗粒线几乎是实心的,爆炸形状也不是真正的圆形,它更像是方形站立在角落。也许我选择了错误的随机数gen,也许其他错误,我真的很感激任何帮助。
答案 0 :(得分:2)
您的速度计算不正确。
//below i calculate starting speed, as far as i know trigonometry this sure ensure that particles will fly in all directions
tworzona.speed.x=distributionx(generator)*cos(radiany);
tworzona.speed.y=distributionx(generator)*sin(radiany);
关于术语的说明:'速度'是标量值,没有方向。您应该使用术语“速度”来表示具有方向和速度的矢量。
上述代码的问题是x和y值是独立生成的。如果您要将方向radiany
与实际分配给speed
的方向进行比较,您会看到它们不匹配。
constexpr float pi = 3.1415926535f;
std::uniform_real_distribution<float> speed_distribution(0, 6);
std::uniform_real_distribution<float> direction_distribution(0, 2*pi);
float radians = direction_distribution(generator);
float speed = speed_distribution(generator);
unitvector.x = cos(radians);
unitvector.y = sin(radians);
tworzona.velocity.x = speed * cos(radians);
tworzona.velocity.y = speed * sin(radians);
或者,您可以通过创建矢量分布直接生成随机速度,而不使用正弦和余弦。临时实施看起来像:
const double max_speed = 6.0;
const double max_squared = max_speed * max_speed;
std::uniform_real_distribution<double> d(0.0, max_speed);
double x, y;
do {
x = d(generator);
y = d(generator);
} while (x*x+y*y > max_squared);
// x and y are the random velocity, uniformly distributed in all directions,
// speed uniformly distributed between 0 and max_speed.
如果您希望获得想象力,可以将其包装在自定义发行版中,然后您的原始代码可能如下所示:
my_vector_distribution<float, 2> velocity_distribution(6);
tworzona.velocity = velocity_distribution(generator);
答案 1 :(得分:0)
所有粒子的位置都与像素(我的意思是int数)对齐,而速度是浮点数
这是你的问题。无论速度如何,更新后的位置始终会快速恢复到原始值(当速度<1.0时)或增加整数时。
将您的位置保持为浮点值,问题将消失。
我发现很难遵循您的速度更新过程,但这可能是由于您的变量名称。 “通常”的方式是分配初始随机水平和垂直速度(1),其中水平速度线性衰减('空气摩擦'),垂直速度平方增加('重力')。
(1)我猜你的分配初始角度和速度的方法还可以。但是,您可以将其拆分为水平和垂直分量,并忘记所有基于矢量的计算。