ExtrudeCut в OpenGl - PullRequest
       5

ExtrudeCut в OpenGl

0 голосов
/ 03 мая 2011

Привет
Как я могу выдавливать (как SolidWorks) 3D-модель?
Есть ли простой способ или мне нужно сделать какой-то сложный расчет?

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

То, что вы хотите сделать, является частью дисциплины под названием Constructive Solid Geometry (CSG), и это одна из самых сложных тем 3D-графики и обработки. Существует несколько подходов к решению проблемы:

  • Если вы просто заинтересованы в рендеринге CSG в raytracer, все становится довольно просто: на каждом пересечении луча / поверхности вы увеличиваете / уменьшаете счетчик. Комбинации CSG также могут быть преобразованы в счет поверхности. Сравнивая счетчик пересечения лучей и счетчик поверхности CSG, вы можете применить операции CSG к отслеживаемому лучу

  • Если вы заинтересованы в создании CSG для триангулированных моделей, наиболее распространенный подход - это построить деревья BSP из геометрии и применить операции CSG на BSP. Затем из полученного BSP вы воссоздаете сетку. Вот как это реализовано в моделировщиках на основе сетки (взгляните на исходный код Blender, который делает именно это)

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

  • Обработка фазы тесселяции (это то, что я реализовал (или, может быть, даже изобрел) для своего 3D-движка): при рендеринге кривых или изогнутых участков на 3D-оборудовании обычно необходимо предварительно объединить их в треугольные сетки. На этом этапе тесселяции вы можете проверить, пересекаются ли ребра вновь созданного треугольника с кривыми / изогнутыми поверхностями; используйте несколько итераций в решателе пересечения нуля Ньютона, чтобы найти точку пересечения обеих кривых / поверхностей и сохранить ее как точку выборки на краю для обоих задействованных участков (так что тесселяция другой поверхности будет иметь общие положения своих вершин). с первой поверхности). После первого этапа тесселяции используйте метод релаксации (в основном применяйте лапласиан) к вершинам, ограничивая их на поверхности (помните, что ваши поверхности математически точны, и с переменными поверхности очень легко поиграться, но используйте полученную в результате позиции как метрика). Он работает очень хорошо, если не учитывать пересечения с обычными триангулированными сетками (каждый треугольник сетки должен быть превращен в поверхностный участок, что замедляет метод)

Вы пометили этот OpenGL, чтобы прояснить ситуацию: OpenGL не может вам помочь, поскольку OpenGL просто рисует треугольники, а не обрабатывает сложную геометрию.

1 голос
/ 03 мая 2011

Цитирование OpenGl faq :

Что такое OpenGL?

OpenGL означает Open Graphics Library.Это API для создания трехмерной графики.

В более конкретном плане это API, который используется для «рисования треугольников на вашей сцене».В наш век графических процессоров речь идет о том, чтобы общаться с графическим процессором, чтобы он выполнял работу по рисованию.Это не касается форматов файлов.Он не открывает BMP, PNG и любой формат изображения.Он не открывает трехмерные форматы объектов, такие как obj, max, maya.Это не делает анимацию.Он не обрабатывает клавиатуру, мышь и любые устройства ввода.Он не создает окна и т. Д.

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

GL прошел через несколько версий.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...