Предполагая, что ваш тримеш закрыт (независимо от того, выпуклый он или нет), есть способ!
Как указывает dmckee, общий подход состоит в построении тетраэдров из каждого поверхностного треугольника, а затем в применении очевидной математики для суммирования массовых и моментных вкладов каждого тет. Уловка возникает, когда поверхность тела имеет вогнутости, которые образуют внутренние карманы, если смотреть с любой точки отсчета.
Итак, для начала выберите некоторую контрольную точку (начало координат в координатах модели будет работать нормально), она даже не должна находиться внутри тела. Для каждого треугольника соедините три точки этого треугольника с контрольной точкой, чтобы сформировать тетраэдр. Вот хитрость: используйте нормаль поверхности треугольника, чтобы выяснить, направлен ли треугольник к или от контрольной точки (что можно найти, посмотрев на знак точечного произведения нормали и вектор, указывающий на центроид треугольника). Если треугольник направлен в сторону от контрольной точки, относитесь к его массе и моменту как обычно, но если он обращен к контрольной точке (предполагая, что между контрольной точкой и твердым телом есть свободное пространство), сведите на нет свои результаты для этой точки .
Эффективно то, что это делает, это пересчитывает куски объема и затем исправляет, как только эти области оказываются не частью твердого тела. Если в теле много жирных фланцев и гротескных складок (получилось это изображение?), Конкретный кусок объема может быть пересчитан из-за здоровенного фактора, но он будет вычтен только достаточно раз, чтобы отменить его, если ваша сетка закрыто. Работая таким образом, вы даже можете обрабатывать внутренние пузырьки пространства в ваших объектах (при условии, что нормали установлены правильно). Кроме того, каждый треугольник может обрабатываться независимо, поэтому вы можете распараллеливать по желанию. Наслаждайтесь!
Запоздалая мысль: Вас может удивить, что произойдет, когда этот точечный продукт даст вам значение на уровне или около нуля. Это происходит только в том случае, если треугольная грань параллельна (ее нормаль перпендикулярна) в направлении к контрольной точке, что в любом случае происходит только для вырожденных тет с небольшой или нулевой площадью. То есть решение добавить или вычесть вклад тета сомнительно только тогда, когда тет не собирался ничего вносить.