Сначала разбейте каждую грань на треугольники, рисуя новые ребра.
Теперь посмотрите на один треугольник и предположим, что он находится на «верхней» поверхности (некоторые из этих деталей позже окажутся неважными). Посмотрите на объем ниже треугольника, вниз до некоторой горизонтальной плоскости ниже многогранника. Если {h1, h2, h3} - высоты трех точек, а A - площадь основания, то объем твердого тела будет A (h1 + h2 + h3) / 3. Теперь мы должны сложить объемы этих твердых тел для верхних граней и вычесть их для нижних граней, чтобы получить объем многогранника.
Поиграйте с алгеброй, и вы увидите, что высота многогранника над горизонтальной плоскостью не имеет значения. Плоскость может находиться над многогранником или проходить через него, и результат все равно будет правильным.
Итак, нам нужен (1) способ расчета площади основания и (2) способ отличить «верхнюю» грань от «нижней». Первое легко, если у вас есть декартовы координаты точек, второе легко, если точки упорядочены, и вы можете объединить их и убить двух зайцев одним выстрелом. Предположим, что для каждого лица у вас есть список его углов в направлении против часовой стрелки. Тогда проекция этих точек на плоскость x-y будет против часовой стрелки для верхней грани и по часовой стрелке для нижней. Если вы используете этот метод для расчета площади основания, он будет положительным для верхней грани и отрицательным для нижней, так что вы можете сложить их все вместе и получить ответ.
Так как вы получаете упорядоченные списки углов? Начните с одного треугольника, выберите порядок, и для каждого ребра сосед, который разделяет это ребро, должен перечислить эти две точки в обратном порядке. Переходите от соседа к соседу, пока у вас не будет списка для каждого треугольника. Если объем многогранника становится отрицательным, просто умножьте на -1 (это означает, что вы выбрали неправильный порядок для этого первого треугольника, и многогранник был наизнанку).
EDIT:
Я забыл лучшую часть! Если вы проверите алгебру для суммирования этих объемов, вы увидите, что многие термины отменяются, особенно при объединении треугольников обратно в исходные грани. Я не проработал это подробно, но похоже, что конечный результат может быть удивительно простой функцией.