LINUX.ORG.RU

Визуализация 3D скалярных полей - алгоритм


0

1

Задача старая и многожды раз обсосанная, но я идеальных решений не видел.

Есть 3D скалярное поле (скажем 512^3 точек), его нужно отобразить на плоском мониторе (бумажке), статично (кино с анимированием по третьей координате, вращением и пр. не проходит). Значение в точке показывается цветом.

Сейчас мы работаем со срезами - можно накидать срезов по каждой оси, настроить прозрачность, и становится что то понятно. Но хочется большего, хочется одним взглядом объять картину в целом;-)

Отрисовка производится при помощи трассировки - из каждой точки изображения испускается лучик, на объект, куда попал туда попал. Было две мысли:

1) Останавливать лучик когда градиент вдоль лучика превысит некое значение. Чего то видно, но плохо, возможно я плохо настраиваю это самое крит значение градиента.

2) Накапливать цвет вдоль лучика, вес каждой точки опять таки определяется градиентом. Пока не сделал, но как то мне сомнительно...

Вот решил спросить у народу, вдруг кто чего умное подскажет?

★★★★★

я идеальных решений не видел.

Будь добр, перечисли что ты видел, что бы сейчас не скатилось в $SOME_VISUALIZATION_TOOL отлично это делает, что тебе там не понравилось?

В L.O.R. Wiki большой список по для вищуализации если что, в том числе для сабжа. ЯП тоже называй.

adriano32 ★★★
()
Ответ на: комментарий от adriano32

Ну наск. я понимаю MathGL в себя вобрало все, что в этом отношении уже сделано разумного, возможности MathGL я видел. По словам Балакина популярны два подхода - срезы или облака (ну и их комбинации).

ЯП С++ и питон, сам алгоритм буду делать на С++ но это неважно. Я могу идти вдоль луча читая значения, вопрос че с ними делать? И крайне желательно не идти до конца луча протыкая все изображение насквозь, это накладно.

AIv ★★★★★
() автор топика

и чё должно в результате «визуализации» получиться? Типа облаков в небе? Тогда это интеграл надо считать вдоль луча.

anonymous
()

>Есть 3D скалярное поле (скажем 512^3 точек), его нужно отобразить на плоском мониторе (бумажке)
Использовать голографию.
Напечатать на бумажку проекции спереди, сбоку, сверху.

Bad_ptr ★★★★★
()
Ответ на: комментарий от adriano32

У них в галерее 3Д полей нету

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Тупой интеграл дает совершенно непонятную картинку. Надо что то более сложное

AIv ★★★★★
() автор топика

2) тормозит жутко

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

ckotinko ☆☆☆
()
Ответ на: комментарий от AIv

ну так надо освещение ввести. Т.е. сделать «солнце» и от каждого отрезка луча при вычислять его освещённость сквозь толщу поля по направлению к «солнцу». У меня по этому способу получались в своё время мегаклёвые облака. Но требует больших вычислений: вместо N отрезков на луче требуется ещё и N отрезков к «солнцу» для каждого из N, т.е. N^2.

anonymous
()

А нарисовать это дело в openGL? Либо как стопку текстур с высокой прозрачностью, либо как туман?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

трёхмерный туман без освещения, спроецированный на плоскость превращается в двухмерное скалярное поле, ничего не говорящее об объеме.

anonymous
()
Ответ на: комментарий от anonymous

А по любому проекция будет двумерной. Но зато если сделать так, то можно «бродить» по этому туману или стопке текстур - чем вам не объем?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от adriano32

Велосипед все равно понадобиться - у нас данные специфического формата;-)

Все работают с поверхностями... ;-(

AIv ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Не, OpenGL не катит ни разу. Если я в не загоню каждую ячейку как примитив она просто ляжет и уже никогда не встанет... тут тока руками.

AIv ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Кто сказал, что там все остановится на 512^3? И что там на один воксель уходит один флоат? И потм, у меня на ноуте уж какая карта есть такая есть, другой не будет...

AIv ★★★★★
() автор топика

Тихо сам с собою я веду беседу...

Самые интересные результаты пока получились при интегрировании вдоль луча с корнем из градиента http://a-iv.ru/trash/zak2.png

Строится правда долго, 30 сек у меня на ноуте...

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

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

AIv ★★★★★
() автор топика

Останавливать лучик когда градиент вдоль лучика превысит некое значение.

имхо, лучше не останавливать луч, а повышать на некоторое фиксированную величину (подобранную так, чтобы было различимо глазом) значение в альфа-канале, например

Накапливать цвет вдоль лучика, вес каждой точки опять таки определяется градиентом. Пока не сделал, но как то мне сомнительно...

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

shty ★★★★★
()

>1) Останавливать лучик когда градиент вдоль лучика превысит некое значение. Чего то видно, но плохо, возможно я плохо настраиваю это самое крит значение градиента.

Насколько я понимаю вы хотите построить изоповерхность ?

Тогда вам куда-то сюда http://algolist.manual.ru/graphics/3dfaq/articles/74.php

marching cubes algorithm; приведен здесь, так сказать, just to avoid any confusion.

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

sS ★★★★★
()
Ответ на: комментарий от sS

> Насколько я понимаю вы хотите построить изоповерхность ?

За ссылку спасибо, но нет - изоповерхность я строить не хочу;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от shty

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

Конечно хочется поднять яркость структур на переднем плане, но не выходит, с весами уж мудрил-мудрил, ну никак...

http://a-iv.ru/trash/zak.png - срезы

http://a-iv.ru/trash/zak2.png - интеграл с градиентом по лучу

http://a-iv.ru/trash/zak3.png - окончательный вариант

Всем спасибо за обсуждение!

AIv ★★★★★
() автор топика
Ответ на: комментарий от psv1967

Спасибо, но дык они тоже только с поверхностями работают...

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.