我试图在天空中制作星星,但星星分布不均匀。
这是我试过的:
rx = rand(0.0f, PI*2.0f);
ry = rand(0.0f, PI);
x = sin(ry)*sin(rx)*range;
y = sin(ry)*cos(rx)*range;
z = cos(ry)*range;
结果是:
img http://img716.imageshack.us/img716/3320/sphererandom.jpg
和
rx = rand(-1.0f, 1.0f);
ry = rand(-1.0f, 1.0f);
rz = rand(-1.0f, 1.0f);
x = rx*range;
y = ry*range;
z = rz*range;
结果是:
img2 http://img710.imageshack.us/img710/5152/squarerandom.jpg
(虽然没有制作球体,但是opengl不会有所区别。)
正如你所看到的,总有一些“角落”的平均点数更多。如何在球体上创建随机点,均匀分布点?
答案 0 :(得分:4)
你可以做到
z = rand(-1, 1)
rxy = sqrt(1 - z*z)
phi = rand(0, 2*PI)
x = rxy * cos(phi)
y = rxy * sin(phi)
这里rand(u,v)从interal [u,v]
中绘制一个统一的随机数答案 1 :(得分:1)
如果可以生成随机高斯变量,则不需要三角函数,你可以做(伪代码)
x <- gauss()
y <- gauss()
z <- gauss()
norm <- sqrt(x^2 + y^2 + z^2)
result = (x / norm, y / norm, z / norm)
或者在单位立方体内绘制点,直到其中一个位于单位球内,然后标准化:
double x, y, z;
do
{
x = rand(-1, 1);
y = rand(-1, 1);
z = rand(-1, 1);
} while (x * x + y * y + z * z > 1);
double norm = sqrt(x * x + y * y + z * z);
x / norm; y /= norm; z /= norm;
答案 2 :(得分:0)
看起来你可以看到笛卡尔坐标正在产生浓度。
Here解释了一种正确(和错误)的方式来获得正确的分配。