Генерация оптимального набора процедурных трехмерных частиц для усеченного вида - PullRequest
0 голосов
/ 27 февраля 2019

Допустим, вы хотите создать простой эффект дождя / снега / пыли / звездного поля в 3D-сцене.Помещать отдельные капли дождя, снежинки, частицы пыли или звезды в качестве отдельных узлов в иерархию сцены было бы слишком медленно.

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

for N particles
  particlePos = cameraPos + 
                euclideanModulo(pseudoRandomVector(0, 1) - camerPos, 1) * 
                boxSize - boxSize / 2;

Проблема с этой системой заключается в том, что большинство частиц было бы вне поля зрения.

Здесь камера - зеленая точка в центре.Он вращается вокруг оси Y.Frustum показан.Это большая трата, так как 85% частиц не находятся в усеченном контуре.

enter image description here

Еще одно решение - найти самую большую ограничивающую рамку, которая всегда содержитусеченный вид для boxSize выше (который является меньшим квадратом), затем вместо положения камеры используйте минимальный угол поля для позиции

boxSize = sizeOfAxiallyAlignedBoxThatContainsTheFrustumAtAnyOrientation()
minCorner = minCornerOfFrustumAtCurrentOrientation()

for N particles
  particlePos = minCorner + 
                euclideanModulo(pseudoRandomVector(0, 1) - minCorner, 1) * 
                boxSize;

enter image description here

Это работает намного лучше, так как теперь гораздо меньше частиц теряется.Оба изображения выше рисуют 200 частиц, и вы можете видеть, что число в усечении гораздо более плотное в этой версии

Тем не менее, похоже, что 30% частиц все еще находятся вне усеченного конуса.На самом деле, с более широким углом усугубляется намного хуже.

enter image description here

Теперь мы вернулись к большинству частиц за пределами усеченного конуса.

Если неясно, что частицы должны оставаться неподвижными относительно камеры (если они не движутся), то, по крайней мере, с моим текущим алгоритмом, я не думаю, что смогу добиться большего.Перемещение частиц внутрь и из усеченного контура приведет к изменению плотности в зависимости от направления обзора.

По этой причине 200 частиц распределяются через коробку размером с наименьшую коробку, в которой всегда содержится усеченный элемент при любой ориентации.Когда усеченный стержень является продолговатым, то этот прямоугольник становится намного больше, чем любая индивидуальная ориентация усеченного конуса, поскольку иногда усеченный может быть высоким и тонким, а иногда - широким и коротким.поддерживать те же свойства статического положения относительно камеры?

...