Здравствуйте. Недавно появилась необходимость реализовать алгоритм, который бы "вырезал"/"выпиливал" объект по другому объекту. Например, есть 2 таких меша (mesh):

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

Пример №2.
Исходные данные:

Из белого параллелепипеда "вырезается" красный эллипсоид. При этом исходный меш делится на 2 части. Результат:

На входе у алгоритма есть для каждого меша:
1. Vector3[] (Vector3 - класс, у которого есть float x, float y, float z) - массив координат вершин меша (пример: {(0,0,0),(1,0,0),(0,0,1),(1,0,1)})
2. int[] - массив индексов вершин, из которых составляются треугольники меша (пример: {0, 1, 2, 1, 2, 3} - 2 треугольника, образующие квадрат в плоскости XZ)
На выходе должны быть массив вершин Vector3[] и массив треугольников int[].
Как такое можно реализовать? Что можно почитать по этому поводу?