Равномерно распределенная случайная точка внутри пирамиды

У меня есть 3D-сцена, и я хочу "засорять" ее X объектами, произвольно размещенными в пределах усеченной пирамиды.

Я пробовал использовать 3 случайных числа: X + Y (область просмотра 0..1), а затем расстояние Z от камеры, а затем проецирование с помощью камеры. расстояние. Однако это не дает равномерного распределения, и слишком много объектов находится близко к камере, а слишком мало - дальше.

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

Как я могу сгенерировать случайную точку внутри пирамиды с равномерным распределением?


person Amir Abiri    schedule 16.06.2012    source источник


Ответы (2)


Распределите точки в пространстве NDC и спроецируйте их обратно с помощью обратного усеченного преобразования и w-разделения на пространство обзора.

person datenwolf    schedule 16.06.2012
comment
Мне жаль, что вы потеряли меня ... Я понимаю часть пространства клипа и заднюю проекцию, однако, если я не ошибаюсь, это может привести к неоднородному результату? Я не понимаю, что вы имеете в виду под w-разделить на пространство просмотра? - person Amir Abiri; 16.06.2012
comment
@AmirAbiri: Посмотрите на типичный конвейер трансформации. Сначала вы умножаете координаты пространства обзора на матрицу проекции P: r_clip = P * r, а затем, чтобы ввести эффект перспективы, применяется разделение w для достижения NDC r_NDC.{x,y,z,w} = r_clip.{x,y,z,w} / r_clip.w. Вы должны идти в прямо противоположном направлении. Я рекомендую взглянуть на исходный код gluUnProject (вы можете найти его в источниках Mesa3D). - person datenwolf; 16.06.2012
comment
Итак, если я правильно понимаю, мы, по сути, выбираем случайные точки в {0..1, 0..1, 0..1}, где X и Y представляют нормализованные координаты экрана, а компонент Z - это нормализованное расстояние между ближний клип и дальний клип, а затем спроецировать его обратно в мировые координаты? - person Amir Abiri; 17.06.2012
comment
Поправьте меня, если я ошибаюсь, но это не приведет к равномерному распределению внутри полученной усеченной пирамиды? Вероятность появления объекта при z = 0 должна быть меньше, чем при z = h. - person Amir Abiri; 17.06.2012
comment
@AmirAbiri: Действительно, плотность точек становится выше для объектов, находящихся дальше от вашей ближайшей плоскости отсечения. Это именно то, что вам нужно, потому что вы жаловались на слишком много предметов рядом с посетителями. - person datenwolf; 17.06.2012
comment
Я не имею в виду, что я не вижу, как решение, которое вы описываете, приведет к равномерному распределению. Правильное решение должно давать большую вероятность того, что точка в z = h будет выбрана, чем точка в z = 0. Описываемое вами решение идентично тому, что я уже делаю. - person Amir Abiri; 17.06.2012

Я нашел решение на gamedev.net в старом сообщении на форуме:

http://www.gamedev.net/topic / 254550-geometryrandomnessuniform-fill / page_ p _2539021_ hl _ + random% 20 + frustum # entry2539021

person Amir Abiri    schedule 17.06.2012