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

Организация непрерывных LOD ландшафтов с использованием Адаптивных КвадроДерьев

Box test имеет следующий вид, очень похожий на VertexTest:

Box test:

bc[x,y,z] == coordinates of box center

ex[x,y,z] == extent of box from the center (i.e. 1/2 the box dimensions)

L1 = max(abs(bcx - viewx) - exx, abs(bcy - viewy) - exy, abs(bcz - viewz) - exz)

enabled = maxerror * Threshold < L1

Особенности

:

Детали

В предыдущем разделе была описана суть алгоритма, но оставлена в стороне маса деталей, некоторые из которых являются ключевыми. Во-первых, где, собственно хранится информация о высоте? В предыдущих алгоритмах существовала регулярная сетка высот, на которой неявно [1] & [3] или явно [3] определялся меш. Главной инновацией в моем методе является то, что данные хранятся собственно в адаптивном quadtree. В результате получаем 2 главные выгоды. Во-первых, данные располагаются адаптивно в соответствии с той их частью, что нужна приложению; таким образом меньшее количество данных относится к сглаженной части ландшафта, в которой не предполагается нахождение камеры. Во-вторых, дерево может динамически расти или уменьшатся в зависимости от нахождения точки зрения наблюдателя; процедурная детализация может быть добавлена на лету в регионе, в котором находится камера и впоследствии удалена, как только камера покинет данный регион.

Для того, чтобы хранить информацию о высотах каждый элемент quadtree должен хранить информацию о высоте своей центральной вершины и по крайней мере двух вершин, лежащих на ребрах. Все другие высоты хранятся в соседних узлах дерева. К примеру, высота угловых вершин приходит из родительского квадрата и его соседей. Оставшиеся высоты реберных верших хранятся в соседних квадратах. В текущей реализации я храню высоту центральной вершины и все 4 высоты реберных вершин. Это упрощает работу за счет того, что необходимые для обработки квадрата данные доступны как данные квадрата или параметры функции. Недостатком является то, что каждая реберная точка хранится к дереве дважды.

Так же в текущей реализации одно и то же quadtree используется для хранения высоты и для построения меша. Вообще-то хорошо бы его разделить на 2 - одно для хранения карты высот, второе для построения меша. Потенциальные прелести такого подхода изложены ниже.

Большинство трюков реализации основано на общих для двух соседних квадратов реберных вершин. К примеру, такой вопрос - какой квадрат должен выполнять vertex-enable test для реберной вершины? Мой ответ - каждый квадрат проверяет только свои южную и восточную реберные вершины и полагается на проверки северного и западного соседа для проверки двух других вершин.

Другой интерестный вопрос - надо ли нам сбрасывать все флаги перед Update() или же продолжать с состоянием, оставшимся от предыдущего цикла отрисовки? Мой ответ - продолжаем работу от предыдущего состояния, как в [2], но не как в [1] и [4]. Это ведет к большей детализированности - мы проверяли условия на включение, но когда мы можем выключить вершину или квадрат? Как мы помним из алгоритма Update() включение вершины заставляет включится зависящие от нее вершины, и так далее по дереву. Мы не можем просто так выключить вершину в середине одной из таких цепей зависимостей, если вершина зависит от какой-либо другой включенной вершины. Иначе у нас получатся разрывы в меше, либо важные включенные вершины не будут отрисованы.

На рис. 8 видно что реберная вершина имеет 4 соседних квадрата, которые используют ее как угловую вершину. Если любой из этих подквадратов включен, то должна быть включена данная вершина. Поскольку квадрат включен когда центральная его вершина включена, то одним из подходов будет проверить все соседние подквадраты перед отключением. Тем не менее, в моей реализации это будет слишком тяжело, так как для нахождения соседних квадратов придется обегать ве дерево. Вместо этого я считаю число ссылок для каждой реберной вершины. Оно равно числу подквадратов, от 0 до 4, которые включены. Это означает что каждый раз когда мы включаем/выключаем квадрат, мы должны обновить число ссылок в двух вершинах. К счастью, число ссылок меняется от 0 до 4, т.е. все это можно запаковать в 3 бита.

Перейти на страницу: 1 2 3 4 5 6 7

Немного больше о технологиях >>>

Эволюционный миф и современная наука
– "Дарвин был неправ... Теория эволюции, возможно, самая страшная ошибка, совершенная в науке". Эту мысль не так давно высказал член нью-йоркской Академии наук И.Л.Коэн 1. В своем мнении Коэн далеко не одинок: Джон Вольфган Смит – профессор орегонского Университета ...

Судьба термоядерного синтеза
Идея создания термоядерного реактора зародилась в 1950-х годах. Тогда от нее было решено отказаться, поскольку ученые были не в состоянии решить множество технических проблем. Прошло несколько десятилетий прежде, чем ученым удалось «заставить» реактор произвести хоть сколько-ни ...

Галерея

Tехнологии прошлого

Раскрытие содержания и конкретизация понятий должны опираться на ту или иную конкретную модель взаимной связи понятий. Модель, объективно отражая определенную сторону связи, имеет границы применимости, за пределами которых ее использование ведет к ложным выводам, но в границах своей применимости она должна обладать не только образностью.

Tехнологии будущего

В связи с развитием теплотехники ученые в прошлом веке пришли к простому, но удивительному закону, потрясшему человечество. Это закон (иногда его называют принцип) возрастания энтропии (хаоса) во Вселенной. technologyside@gmail.com
+7 648 434-5512