Войти
ПрограммированиеФорумОбщее

Как получить случайное направление?

Страницы: 1 2 37 8 Следующая »
#0
21:50, 5 авг. 2012

Как можно получить случайное направление в виде вектора vec3(x,y,z) в пределах сферы радиусом 1.0f?

что-то типа такого.
vec3 v = normalize ( random_sphere() );


#1
22:05, 5 авг. 2012

WhiteFox
Рандомная широта, рандомная долгота, считаем вектор.

#2
22:08, 5 авг. 2012
float3 MapSamplesToSphere(float r1, float r2) // r1, r2 are randoms in range [0..1]
{   
  float phi = r1*3.141592654f* 2; //[0..2PI]
  float h   = r2*2 - 1; //[-1..1]

  float sin_phi, cos_phi;
  sincosf(phi, &sin_phi, &cos_phi); // sin and cos simultaniously

  float x = sin_phi*sqrt(1-h*h); 
  float y = cos_phi*sqrt(1-h*h); 
  float z = h;  
  
  return float3(x,y,z);
}
#3
22:19, 5 авг. 2012

Рандомы задаем в тету и фи.

D3DXVECTOR4 GetDirection(float Theta, float Phi)
{
    float y = (float)cos(Theta);
    float x = (float)sin(Theta) * cos(Phi);
    float z = (float)sin(Theta) * sin(Phi);
    float w = 1.0f;
    return D3DXVECTOR4(x,y,z,w);
}

#4
22:21, 5 авг. 2012

Да, как уже и сказали нужно выбрать случайный зенитный и азимутальный угол в сферической системе координат и затем преобразовать в декартовы координаты. Полученный вектор гарантированно будет нормированным.

#5
22:24, 5 авг. 2012

FROL спасибо!
подправил проверил генерация нормальная.

+ Показать

#6
22:46, 5 авг. 2012

WhiteFox
если тебе нужно равномерное распределение то вариант с 2мя углами не пройдет т.к. плотность точек у полюсов будет существенно выше

#7
22:47, 5 авг. 2012

WhiteFox
> направление ... в пределах сферы радиусом 1.0f
о_О

#8
22:51, 5 авг. 2012

vec3 v = normalize( vec3( rand(), rand(), rand() ) - RAND_MAX / 2 )
ни айс ?

#9
22:59, 5 авг. 2012

wawan
распределение тоже не равномерное, количество направлений в углы куба будет выпадать чаще чем в грани

#10
23:06, 5 авг. 2012

откуда там неравномерность ? и насколько она большая ? и разве это проблема ?

#11
23:07, 5 авг. 2012

ashujon
>если тебе нужно равномерное распределение то вариант с 2мя углами не пройдет т.к. плотность точек у полюсов будет существенно выше
это понятно что у полюсов выше... спс, но меня пока вполне устраивает вариант FROL'a.

igagis
>о_О
%-)

wawan
>vec3 dir = ( vec3( rand(), rand(), rand() ) - RAND_MAX / 2 ).normalize()
>ни айс ?
это вроде сегмент или полусфера, нее?

#12
23:09, 5 авг. 2012

да вроди не, все там нештяг

слишком просто, не по самурайски ? )

#13
23:18, 5 авг. 2012

>слишком просто, не по самурайски ? )
да простота хуже воровства, и да не по самурайски как-то получается это ))

я твой нештячёг завтра на свежую голову покурю

#14
23:21, 5 авг. 2012

+ в стопицот раз быстрее чем вышеперечилсеные методы с синусами и косинусами
- вероятность получить направление в угол куба выше в "квадратный корень из 2" раз чем направление на середину стороны куба

последнее я считаю несущественным

кактотак

Страницы: 1 2 37 8 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.