XNA Проверить, находится ли 3D-точка внутри модели (fbx)

Мы с друзьями разрабатываем 3D-принтер. С железом закончили, включая программирование микроконтроллера. Теперь мы хотим проанализировать существующие 3D-модели. Это включает в себя способ проверить, находятся ли определенные координаты (3d) внутри или снаружи 3D-модели (модели FBX), которую мы хотим напечатать. На данный момент мы рассматриваем Unity3D и XNA. Я понял, что можно сделать с ограничивающими рамками, но это не лучший способ решить проблему в XNA. Итак, мой вопрос, есть ли какой-нибудь умный способ получить эту информацию.

Большое спасибо за поддержку ;-)


person Jargarta    schedule 23.01.2013    source источник
comment
Вы уверены, что XNA поможет? Я имею в виду, что должно быть какое-то специализированное программное обеспечение для 3D-печати.   -  person user1306322    schedule 23.01.2013


Ответы (3)


Алгоритм

Вы ищете способ определить, лежит ли точка внутри вогнутой оболочки. Этого можно добиться, расширив алгоритм Point in Polygon до трех измерений.

Идея состоит в том, что вы проводите луч через точку и вычисляете пересечения с корпусом (полигонами) вашего объема. Если количество пересечений луча и треугольника по обе стороны от точки нечетно, она лежит внутри объема.

Если производительность является проблемой, упрощенные ограничивающие объемы все же могут быть полезны. Если вычисление пересечений лучей и многоугольников требует больших затрат, вы должны сначала проверить, лежит ли точка внутри аппроксимированной оболочки для сетки, которая имеет более низкую стоимость производительности (например, ограничивающие рамки, выпуклые оболочки). Таким образом, вы можете сбросить баллы раньше.

Вот еще одно подробное объяснение алгоритма Point in Polygon и реализация на C:

Выбор правильной среды программирования

Я не уверен, почему именно вы хотите использовать XNA или даже Unity для этой задачи. Конечно, оба предлагают возможность загрузки 3D-моделей, но определенно есть более простые и эффективные альтернативы.

Для вышеупомянутого алгоритма вам нужен доступ к позициям вершин и определениям треугольников модели, не более того. Если FBX не является обязательным требованием, я бы посоветовал изучить формат файла Wavefront OBJ. Это текстовый формат, простой для понимания/разбора и поддерживаемый практически всеми профессиональными приложениями для 3D-моделирования.

Если FBX требуется, вы все равно можете попытаться проанализировать их самостоятельно или просто использовать существующий 3D-конвертер.

person Lucius    schedule 23.01.2013
comment
Привет Люциус, спасибо за ваш отзыв. Это очень полезно, я попробую в ближайшие дни. XNA или Unity не требовались, это был (как вы поняли) простой способ обработки 3D-моделей и использования .NET. Также FBX НЕ ДОЛЖЕН ИМЕТЬ формат файла. Так что мы с друзьями тоже проверим формат файла OBJ для ваших задач. Еще раз спасибо ;-) - person Jargarta; 23.01.2013

Я бы использовал воксели для такой задачи. Ваш 3D-принтер имеет некоторое разрешение по всем осям, поэтому вы можете предположить аналогичное разрешение для вашего воксельного пространства. Перевод значений полей вокселей в движения принтера будет относительно простым, поэтому самое сложное — преобразовать вашу сетку в воксели. Я уверен, что вы можете найти какую-нибудь библиотеку для этого.

Вы можете начать здесь: Знаете какие-либо библиотеки C++ для воксельной графики?

person kolenda    schedule 11.02.2013

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

Чтобы подтвердить это, я сделал это до использования Panda3D (и я не удивлюсь, если можно будет использовать практически любой 3D-движок).

Обнаружение столкновений — вот что было полезно. Как указал Люциус, вам нужно обнаруживать поверхности. Итак, используйте то, что Panda называет «RayCollider» (в основном линия), и посмотрите, сколько раз он пересекает поверхности вашей 3D-модели. В Panda уже есть вспомогательные функции для этого, и есть много примеров полного кода, включенных с использованием RayColliders для обнаружения поверхностей при загрузке SDK.

Затем нужно просто пройтись по всему пространству x, y, z и использовать вспомогательные функции панды для перемещения источника вашего луча. Если он сталкивается с нечетным количеством поверхностей — вы внутри. В противном случае вы снаружи.

По сравнению с примерами полного кода Panda3D, эта задача на самом деле довольно тривиальна. Кривая обучения в основном будет потрачена на ознакомление с движком, а не с математикой.

person ecoe    schedule 19.03.2013