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

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

Страницы: 1 2 3 48 Следующая »
#15
11:09, 6 авг. 2012

google как обычно рулит (если английский не проблема)

http://mathworld.wolfram.com/SpherePointPicking.html

так вроде оба метода (выбор по углам (формулы 6-7-8) или в кубе (9-10-11)) только переделанные под равномерное распределение

Правка: хм, там выбор вектора В СФЕРЕ, извиняйте... на поверхности сферы - только самый последний вариант... хотя может и просто нормализация покатит, надо подумать


#16
11:21, 6 авг. 2012

Sergio
> Да, как уже и сказали нужно выбрать случайный зенитный и азимутальный угол в
> сферической системе координат и затем преобразовать в декартовы координаты.
> Полученный вектор гарантированно будет нормированным.
Всю тему не читал, может повторюсь - при таком подходе вероятность попадания в полярные области выше.

#17
11:37, 6 авг. 2012

Можно генерировать случайный вектор в пределах куба, если длина окажется больше 1, генерировать повторно, результат нормализовать.

#18
12:07, 6 авг. 2012

Все уже забыли что эта тема неоднократно муссировалась на форуме что её даже выделили в отдельный FAQ?
http://www.gamedev.ru/faq/?id=148

#19
16:09, 8 авг. 2012

Нашел о дной книге:

float d3d::GetRandomFloat(float lowBound, float highBound)
{
  if( lowBound >= highBound ) // bad input
    return lowBound;

  // get random float in [0, 1] interval
  float f = (rand() % 10000) * 0.0001f; 

  // return float in [lowBound, highBound] interval. 
  return (f * (highBound - lowBound)) + lowBound; 
}

void d3d::GetRandomVector(
    D3DXVECTOR3* out,
    D3DXVECTOR3* min,
    D3DXVECTOR3* max)
{
  out->x = GetRandomFloat(min->x, max->x);
  out->y = GetRandomFloat(min->y, max->y);
  out->z = GetRandomFloat(min->z, max->z);
}
Может поможет )

#20
16:23, 8 авг. 2012

SaratRich
сожги её

#21
17:41, 8 авг. 2012

:)
это тот-же бокс. только параллелепипед.
тобиш это рандомный вектор в середине куба. на не рандомное направление (вектор на поверхности сферы)

а вообще действительно - есть готовый фак. не нравится - я ссылку на математику кидал...

#22
20:00, 8 авг. 2012

А зачем вы с полярными или сферическими координатами связались? Там же неравномерность лезет после первой угловой координаты и в полюса упирается. Гораздо проще взять три случайные числа и нормализовать вектор.
v=[rand(), rand, rand()]
v/=sqrt(v*v)
Только надо генератор взять не кривой и задаться минимальной величиной вектора, чтобы ноль на ноль не делить. Есть ещё вариант с поворотом вектора вместе с перпендикуляром, а потом поворота вокруг этого перпендикуляра, то кому такое надо?

#23
20:16, 8 авг. 2012

Алексей Патрашов
слишком толсто

#24
21:42, 8 авг. 2012

wawan
> сожги её
Уже горит : |) 

#25
0:19, 9 авг. 2012

{rand(), rand(), rand() } нельзя, т.к. при околонулевых значениях будет очень хреново и нормировать, и распределение как мне кажется будет неравномерным. Не говоря уже о том, что может трижды выпасть 0.0.

Чем вам тригонометрия не нравится? Ну медленная, и что? Сколько раз за кадр надо случайное направление получать?

#26
0:44, 9 авг. 2012

ALPINE
> Чем вам тригонометрия не нравится? Ну медленная, и что? Сколько раз за кадр надо случайное направление получать?
Сейчас попробую пояснить. Начнём с очень простой полярной системы координат. Берём случайный угол и откладываем случайное расстояние. Думаем, что всё в порядке и смотрим на результат. Результат получается плачевный. На каждый малый интервал радиуса попадает одинаковое количество точек, но длины окружностей, по которым эти точки потом раскиданы, растут с радиусом! То есть плотность точек падает с ростом радиуса. Со сферой будет то же самое, только хуже. Выходов есть два и оба имеют недостатки.
Первый это сделать как я изобразил, проверить длину вектора (лучше квадрат) и, если не меньше пороговой длины, провести нормализацию, в противном случае повторить. Минус один - короткий вектор может выпадать слишком часто и ГПСЧ может иметь полосатость по направлениям. На плоскости такое видно при отображении цепочек по два. Вероятность выпадения вектора короче 0,1 это 0,1%, меньше 0,01 это 1/1000000, то есть если 0,01 минимальной длины достаточно, то ничего страшного.
Второй это взять векторы [1,0,0] и [0,1,0], а потом повернуть вокруг z, потом также повернуть на случайный угол второй вектор и повернуть первый вектор вокруг второго тоже на случайный угол или покрутить последовательно вектор вокруг трёх осей на случайный угол.. Это должно убрать полярность. Мне этот способ не очень нравится.

#27
1:32, 9 авг. 2012

что не вопрос то величайшая проблема для игры,
какая разница как этот случайный вектор создавать, чем проще и быстрее тем лучше,
ну подумаешь наравномерное ну и пофих этоже не матлаб, кто там в игре с линейкой бегать проверять будет )

#28
2:12, 9 авг. 2012

Алексей Патрашов
Не поленись прочитать FAQ.

#29
3:02, 9 авг. 2012

Chipmunk
> Не поленись прочитать FAQ.
Я его читал раз, потом ещё раз и ещё раз сейчас и английский вариант прочитал. У меня временно возникли подозрения, что в формула с ошибкой, но я сейчас проверил в уме и вроде как всё перераспределяется как должно. Могу даже написать вывод формулы, чего в FAQ не хватает. Тогда я не понимаю, о чём спор идёт, раз всё решено и проверено?

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

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