LINUX.ORG.RU

[велосипедостроение] интерфейс для отображения потрошков 3D конструкции в разрезе?

 


0

2

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

Вопрос - как бы поудобней (с тз пользователя) организовать интерфейс для этого дела? Т.е. берем мышку и крутим эту штуку туда-сюда, это понятно. Но что бы заглянуть внутрь надо кусок снаружи вырезать (напр. встречаются изображения кораблей, АЭС и пр в изометрии, у которых кусок вырезан и видно что внутри). Как оптимально организовать такое вырезание, что бы было удобно этот вырезанный кусок менять?

C CAD увы никогда не работал...

★★★★★

Ввести в интерфейс возможность построения секущей плоскости. Далее показывать либо сечение (только точки, принадлежащие плоскости), либо разрез (точки в плоскости и за ней).

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

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

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

Уже лучше, спасибо;-)

Я то наивно думал что тут есть типовые решения.

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

Она те что нетривиальная... она сырая, есть много вариантов и непонятно какой выбрать.

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

Дать возможность провести секущую плоскость, по которой и показывать потроха.

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

Дать возможность провести секущую плоскость

Довольно любобытная тема. Тут идет работа на такой мутный параметр как «удобство восприятия пользователем». Возможно, но не факт, что секущие плоскости будут идеальным вариантом. Мне кажется все очень сильно зависит от задачи, которую будут решать.

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

Вообще стоило бы обсудить различные варианты представления трехмерных данных.

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

Просто, насколько я знаю на уровне того же OpenGL поверхность объекта, состоящая из полигонов имеет передние и задние грани. При этом, на уровне OGL невозможна отрисовка одновременно передних и задних граней. Т.е. нельзя, скажем, увидеть внутреннюю поверхность сферы в разрезе.

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

Собственно, по этой причине в библиотеке OpenGL отсутствует функция для такого рода срезов.

Существует функция glClipPlate(), но она задает сквозную плоскость отсечения и работает только в системе координат наблюдателя.

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

>Резку придётся делать программно.

Я, к сожалению, с CAD-системами не работал, т.ч. с их возможностями не знаком :(

mutronix ★★★★
()

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

еще вариант - отображать всё мелкими сферами (чтобы не загораживали вид), но яркость зависит от расстояния до камеры. это всё разумеется вращается.

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

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

При этом, на уровне OGL невозможна отрисовка одновременно передних и задних граней. Т.е. нельзя, скажем, увидеть внутреннюю поверхность сферы в разрезе.

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

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

Не получится. Передняя/задняя грань полигона определяются относительно точки обзора. Нельзя создать полигон, у которого видимой будет его тыльная сторона :)

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

Ещё раз. Передняя/задняя грань полигона определяются относительно точки обзора, а не в абсолютной системе координат.

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

Да проблем со сделать нету, поскольку я делаю руками без GL - это гораздо проще чем кажется. Проблема в том, что непонятно что именно сделать;-)

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

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

ну так можно же сделать так, чтобы каждый полигон дублировался, и внутрення сторона у дублирующего полигона была направлена в сторону внутренней стороны другого полигона. Имхо, в старой 3DSMax 4 так и делалось.

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

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

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

Ну это включается с помощью glEnable(GL_CULL_BACK_FACE) или что-то типо того, точно не помню.
Еще вродебы помню, что «заднее» это «лицо» или «переднее» определяется по направлению нормали. А направление нормали можно установить glNormal3f(x,y,z).
С прозрачностью может возникнуть проблема из-за порядка отрисовки полигонов. Это описано здесь http://pmg.org.ru/nehe/ogl01.htm (счас это тоже решается как-то с помощью шейдеров)

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

еще кстати чё-то вспоминается, что или в самом opengl или в glu/glut/др.библиотеке есть функция вычитания геометрий.

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

>Ну это включается с помощью glEnable(GL_CULL_BACK_FACE) или что-то типо того, точно не помню.

Я в третий раз повторяю. GL_FRONT и GL_BACK полигона высчитываются динамически по отношению к текущей точке обзора, а не к абсолютной системе координат в которой находится объект.

Еще вродебы помню, что «заднее» это «лицо» или «переднее» определяется по направлению нормали. А направление нормали можно установить glNormal3f(x,y,z).

Нормализация вообще относится к освещению.

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

>или вот еще stencil buffer(правда это вроде какой-то костыль, отмирающий, хотя может и нет :D)

Это тоже из другой оперы. Им раньше тени рисовали :-)

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

>>Ну это включается с помощью glEnable(GL_CULL_BACK_FACE) или что-то типо того, точно не помню.

Я в третий раз повторяю. GL_FRONT и GL_BACK полигона высчитываются динамически по отношению к текущей точке обзора, а не к абсолютной системе координат в которой находится объект.

Тут об этом речи и не шло, когда и по отношению к чему оно вычисляется. раз это включается через glEnable, значит оно и отключается через glDisable.

Еще вродебы помню, что «заднее» это «лицо» или «переднее» определяется по направлению нормали. А направление нормали можно установить glNormal3f(x,y,z).

Нормализация вообще относится к освещению.


А как он по-твоему рассчитывает-то математически что считать бэкфэйсом, а что фронтфэйсом? Помоему, оно смотрит на нормаль, и, если нормаль направлена в сторону(до какого-то предельного углового отклонения) «камеры» то это фронтфэйс, а если в сторону от камеры, то бэкфэйс.

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

А как он по-твоему рассчитывает-то математически что считать бэкфэйсом, а что фронтфэйсом?

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

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

Товарищи, OpenGL и Ко к моим задачам плохо применим. Скажем есть массив 1024х1204х1024 точек. Если на каждую ячейку втыкать полигон, то это никогда не отрисуется. Гораздо проще (и быстрее) работать со своим z-буфером.

Автор MathGL кстати пытался сначала работать с MathGL, потом отказался - пресечение сложных поверхностей она отрабатывает плохо.

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

Опечатка:

Автор MathGL кстати пытался сначала работать с OpenGL, потом отказался - пресечение сложных поверхностей она отрабатывает плохо.

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

можно посмотреть opendx и как ни странно grass

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

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

Кто вам это сказал? Достаточно запретить удаление задних граней. И да, передняя грань — это та грань, для которой вершины заданы против часовой стрелки вокруг нормали.

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

Ну тогда, если подробнее, то в сторону всяких ray casting'ов или marching thethraedrons/cubes надо смотреть. По сути должно быть именно то, что надо: к примеру в медицине снимки томографии прадставляют собой скалярное поле значений цвета(а точнее интенсивности, ибо градации серого), по ним строится трёхмерное изображение внутренностей. Внутренности отфильтровываются по значению точек поля.(ну там кожу снять, кости показать). Можно найти кучу реализаций всяких, с шейдерами, без шейдеров, на GL, без него.

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

Во, вот это тоже мысль, спасибо! Я не про реализацию, а про фильтрацию по диапазону значений - как сам то не додумался...

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