Допустим, вы хотите создать простой эффект дождя / снега / пыли / звездного поля в 3D-сцене.Помещать отдельные капли дождя, снежинки, частицы пыли или звезды в качестве отдельных узлов в иерархию сцены было бы слишком медленно.
Другим решением будет использование какой-либо системы частиц, которая генерирует куб частиц вокруг камеры, используяформула, которая генерирует бесконечные звезды во всех направлениях.Для этого случая я эффективно использую
for N particles
particlePos = cameraPos +
euclideanModulo(pseudoRandomVector(0, 1) - camerPos, 1) *
boxSize - boxSize / 2;
Проблема с этой системой заключается в том, что большинство частиц было бы вне поля зрения.
Здесь камера - зеленая точка в центре.Он вращается вокруг оси Y.Frustum показан.Это большая трата, так как 85% частиц не находятся в усеченном контуре.
Еще одно решение - найти самую большую ограничивающую рамку, которая всегда содержитусеченный вид для boxSize
выше (который является меньшим квадратом), затем вместо положения камеры используйте минимальный угол поля для позиции
boxSize = sizeOfAxiallyAlignedBoxThatContainsTheFrustumAtAnyOrientation()
minCorner = minCornerOfFrustumAtCurrentOrientation()
for N particles
particlePos = minCorner +
euclideanModulo(pseudoRandomVector(0, 1) - minCorner, 1) *
boxSize;
Это работает намного лучше, так как теперь гораздо меньше частиц теряется.Оба изображения выше рисуют 200 частиц, и вы можете видеть, что число в усечении гораздо более плотное в этой версии
Тем не менее, похоже, что 30% частиц все еще находятся вне усеченного конуса.На самом деле, с более широким углом усугубляется намного хуже.
Теперь мы вернулись к большинству частиц за пределами усеченного конуса.
Если неясно, что частицы должны оставаться неподвижными относительно камеры (если они не движутся), то, по крайней мере, с моим текущим алгоритмом, я не думаю, что смогу добиться большего.Перемещение частиц внутрь и из усеченного контура приведет к изменению плотности в зависимости от направления обзора.
По этой причине 200 частиц распределяются через коробку размером с наименьшую коробку, в которой всегда содержится усеченный элемент при любой ориентации.Когда усеченный стержень является продолговатым, то этот прямоугольник становится намного больше, чем любая индивидуальная ориентация усеченного конуса, поскольку иногда усеченный может быть высоким и тонким, а иногда - широким и коротким.поддерживать те же свойства статического положения относительно камеры?