Войти
ПрограммированиеФорумГрафика

попадание точки внутрь трёхмерного симплекса (2 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#15
12:14, 15 ноя. 2012

glukh
> у меня там ваще векторов нету
не переживай, все так начинали. через пару лет проб и ошибок придёшь к векторной библиотеке, почти такой же совершенной как и suslib.


#16
13:49, 15 ноя. 2012

glukh
Как я понимаю, ты начинаешь волну с тетраэдров, видимых на прошлом кадре. Что делаешь если объект (связное множ-во тетраэдров) на прошлом кадре вообще не был виден?

TarasB
9 умножений: 6 на векторное произведение, 3 на скалярное
Если все же рассмотреть все три mixed-product, то наверное умножения повторяются

#17
15:44, 15 ноя. 2012

Aslan
> ты начинаешь волну с тетраэдров, видимых на прошлом кадре
прошлого кадра не храню, волну начинаю с того тетраэдра (дадут 3.14зды это симплекс) внутри которого нахожусь.

Aslan
> Что делаешь если объект (связное множ-во тетраэдров) на прошлом кадре вообще не
> был виден?
делаю просто, у каждого симплекса четыре грани, каждая грань может быть либо светопропускающей, либо светооражающей. светоотражающие растреризую в первую очередь, потом ~растеризую прозрачные стороны, тоесть добавляю в очередь растеризации смежный тетраэдр у которого не смежная вершина ближе всего и так для всех прозрачных граней, потом беру очередь на растеризацию вытаскиваю от туда очередной тетраэдр и растеризую его, добавляя в очередь уже его смежные тетраэдры на прозрачных гранях, естественно тоже сортируя их в очереди растаризации... примерно так... ну точнее так должно быть, в исходниках не так ещё всё складно... :(...

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

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

А ещё забыл, там ещё внутренний тетраэдр покрашеный у каждого третьего вокселя...

О! у меняж картинка есть:
симплексный воксель | попадание точки внутрь трёхмерного симплекса

#18
16:53, 15 ноя. 2012

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

#19
17:05, 15 ноя. 2012

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

вот для двухмерки есть примерчик:
волновой алгоритм растеризации в двухмерке | попадание точки внутрь трёхмерного симплекса

#20
17:22, 15 ноя. 2012

glukh
> если грань при растеризации полностью попала в уже закрашенное пространство
Теперь понятно. Интересная идея, надо попробовать. Кстати Z там и не учавствует, просто битовая маска, что намного быстрее. Но прозрачные грани тоже надо растеризовать, для проверки - надо ли двигатся дальше. Некоторый овердров будет, и даже довольно большой в случае обилия прозрачных тетраэдров
Иерархическйи Z-буффер для этого и придумали, для быстрой проверки

#21
17:31, 15 ноя. 2012

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

#22
17:36, 15 ноя. 2012

glukh
Я неправильно выразился, дело даже не в кол-ве прозрачных граней, а в их площади, покрываемой на экране. Возьми большой пустой объем - это один тетраэдр, а теперь воткни внутри одну точку - уже большой тетраэдр делится на несколько узлов октодерева, все надо растеризовать
Я не против идеи, просто надо смотреть что получится, и всеже с иерархическим буффером, как мне кажется, оптимальнее

#23
17:44, 15 ноя. 2012

Aslan
> Иерархическйи Z-буффер для этого и придумали, для быстрой проверки
согласен с битовым полем можно чё-нить поинтересьней замутить... тока нужно учесть тот факт что наложение треугольников в котором требуется применение маски происходит исключительно на границах объектов, тоесть когда поверхность одного объекта перекрывает поверхность другого ну или саму себя...

#24
18:39, 15 ноя. 2012

Кстати, я вот что проверял:
1).
заполнял массив А нулями
заполнял массив А единицами
2).
заполнял массив А единицами
заполнял все элементы массива А, не равные единице, нулями

1) оказалось быстрее. Проверка - дорогая операция.

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

Немного не понял, если грань оказалась полностью заслонена от нас, то как из этого следует то, что и тетраэдры, примыкающие к ней, заслонены?

А, очередь с сортировкой... Надо бы взять на заметку, интересная вариация портально-секторного растеризатора.

#25
2:15, 16 ноя. 2012

Давид Шекельбаум
> 1) оказалось быстрее. Проверка - дорогая операция.
посчитай в ассемблере - ноль хранится в аккумуляторе, счётчик для цикла ECX, операция сравнения, операция близкого перехода, увеличение счётчика элементов массива INC, получение адреса элемента операцией сдвига регистра, запись по адресу значения из аккумулятора; запись единицы - аналогично. во втором случае у тебя ещё идёт проверка, причём проверяешь не регистр а значение из памяти которое сперва нужно загрузить в регистр, здесь добавится операция чтения из памяти по адресу MOV и ещё одно сравнение. само по себе сравнение регистров операция быстрая, а вот получение значения из памяти - медленная, примерно такая-же как запись, тоесть в первом случае идёт два раза обращение к памяти, а во втором - три, и работает он в полтора раза дольше... не удивительно, а в чём прикол?

Давид Шекельбаум
> если грань оказалась полностью заслонена от нас, то как из этого следует то,
> что и тетраэдры, примыкающие к ней, заслонены?
прально, вовсе не следует что примыкающий тетраэдр закрытой грани тоже весь закрыт, но как-то пофиг, так как те тетраэдры которые мы не будем растеризовать из за перекрытой грани, всё равно будут рстеризованы с другой стороны волны, естественно если их грани видимы...

Давид Шекельбаум
> портально-секторного растеризатора
чтобы говорить об одном и том же, дай прочитать про эти ругательные слова то что ты о них читал?
Google: По запросу портально-секторного растеризатора ничего не найдено.

#26
11:47, 16 ноя. 2012

glukh
Поищи просто portal render, думы-кваки-хафлайвы на нем сделаны
Боресков А.В. Графика трехмерной компьютерной игры на основе OPENGL
Сектора - это из дума 2

#27
17:00, 16 ноя. 2012

glukh

#define SWAP(x, y) do { x ^= y; y ^= x; x ^= y; } while (0)
void circle(int x, int y, int r)
{
    int z, e, t;
    t = z = 0;
    e = r;
    for (;;) {
        point(x + t, y + r);
        point(x + t, y - r);
        point(x - t, y + r);
        point(x - t, y - r);
        point(x + r, y + t);
        point(x + r, y - t);
        point(x - r, y + t);
        point(x - r, y - t);
        if (t >= r)
            return;
        t++;
        e += (z<<1) + 1;
        z++;
        if (e >= (r<<1)) {
            e -= (r<<1);
            r--;
        }
    }
}
...
  int функция;
  int нормаль; // 0 - по часовой стрелке, 1 - против
...
:-)
Интересный код, да и подход; уважение за упорство.
#28
19:54, 16 ноя. 2012

glukh
> прально, вовсе не следует что примыкающий тетраэдр закрытой грани тоже весь
> закрыт, но как-то пофиг, так как те тетраэдры которые мы не будем растеризовать
> из за перекрытой грани, всё равно будут рстеризованы с другой стороны волны,
> естественно если их грани видимы...

Надо бы ещё осмыслить...

glukh
> чтобы говорить об одном и том же, дай прочитать про эти ругательные слова то
> что ты о них читал?

Суть в том, что сначала мы рисуем комнату, причём все полигоны отсекаем обычными 5ю плоскостями отсечения (верх, низ, лево, право, перед). При попытке нарисовать прозрачную стену (то есть за которой есть другая комната) мы рекурсивно переходим к этой самой другой комнате, и рисуем её, отсекая её уже не по 5 плоскостям, а добавив к ним ещё и границы портала, через который она видна. В ней делаем то же самое...
Преимущества (по сравнению с вашим алгоритмом): рисуются те и только те фрагменты стен, которые находятся в прямой видимости. Не требуется никаких проверок. Не требуется сортировать комнаты.
Недостатки: операции с плоскостями отсечения, одна и та же комната (разные куски) может быть нарисована несколько раз, геморрой, если ГГ стоит на стыке двух комнат, или, не дай б-г, на углу.

#29
5:21, 17 ноя. 2012

благодаря, де-факто уже ставшей стандартным дополнением к STL, библиотеки suslib, теперь корректно ищется симплекс с которого начинается волна... :)...
suslib в действии

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумГрафика

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