То, что вы хотите сделать, является частью дисциплины под названием Constructive Solid Geometry (CSG), и это одна из самых сложных тем 3D-графики и обработки. Существует несколько подходов к решению проблемы:
Если вы просто заинтересованы в рендеринге CSG в raytracer, все становится довольно просто: на каждом пересечении луча / поверхности вы увеличиваете / уменьшаете счетчик. Комбинации CSG также могут быть преобразованы в счет поверхности. Сравнивая счетчик пересечения лучей и счетчик поверхности CSG, вы можете применить операции CSG к отслеживаемому лучу
Если вы заинтересованы в создании CSG для триангулированных моделей, наиболее распространенный подход - это построить деревья BSP из геометрии и применить операции CSG на BSP. Затем из полученного BSP вы воссоздаете сетку. Вот как это реализовано в моделировщиках на основе сетки (взгляните на исходный код Blender, который делает именно это)
CSG на аналитических поверхностях чрезвычайно сложен. Не существует закрытых решений для пересечения кривых или криволинейных поверхностей. Наилучший подход состоит в том, чтобы численно найти количество точек отбора проб на пересечении и подогнать кривую вдоль пересечения. Это может стать численно нестабильным.
Обработка фазы тесселяции (это то, что я реализовал (или, может быть, даже изобрел) для своего 3D-движка): при рендеринге кривых или изогнутых участков на 3D-оборудовании обычно необходимо предварительно объединить их в треугольные сетки. На этом этапе тесселяции вы можете проверить, пересекаются ли ребра вновь созданного треугольника с кривыми / изогнутыми поверхностями; используйте несколько итераций в решателе пересечения нуля Ньютона, чтобы найти точку пересечения обеих кривых / поверхностей и сохранить ее как точку выборки на краю для обоих задействованных участков (так что тесселяция другой поверхности будет иметь общие положения своих вершин). с первой поверхности). После первого этапа тесселяции используйте метод релаксации (в основном применяйте лапласиан) к вершинам, ограничивая их на поверхности (помните, что ваши поверхности математически точны, и с переменными поверхности очень легко поиграться, но используйте полученную в результате позиции как метрика). Он работает очень хорошо, если не учитывать пересечения с обычными триангулированными сетками (каждый треугольник сетки должен быть превращен в поверхностный участок, что замедляет метод)
Вы пометили этот OpenGL, чтобы прояснить ситуацию: OpenGL не может вам помочь, поскольку OpenGL просто рисует треугольники, а не обрабатывает сложную геометрию.