Как создать 2D плоскую вырезку из 3D изображения - PullRequest
2 голосов
/ 24 августа 2009

Я хотел бы написать программу на C #, которая генерирует двухмерное изображение из визуализированного трехмерного объекта (объектов), "разрезая" трехмерный объект или через плоскость среза. Желаемым выводом 2D-изображения должны быть данные, которые можно отобразить с помощью CAD. Например:

Трехмерное изображение определяется своими вершинами, эти вершины содержатся в Point3DList (). Затем вызывается метод, принимающий Point3DList в качестве параметра, например: Cut2D (Point3DList). Затем метод генерирует 2D-вершины и сохраняет его внутри Point2DList (), и эти вершины можно прочитать через программу CAD, которая отображает их в 2D-форме.

Поэтому мой вопрос заключается в том, существует ли предыдущая реализация этого в C # (совместим с .NET) или есть какие-либо предложения по сторонним компонентам / алгоритмам для решения этой проблемы.

Заранее спасибо.

Ответы [ 5 ]

5 голосов
/ 24 августа 2009

Вы задаете интересный вопрос, частично не включая полное определение трехмерной фигуры. Вам нужно указать либо вершины и ребра, либо алгоритм для получения ребер из списка вершин. Поскольку алгоритм для получения ребер из списка вершин сводится к заданию вершин и ребер, я рассмотрю только этот случай здесь. Мое описание также работает лучше всего, когда вершины и ребра превращаются в список плоских многоугольников. Чтобы разбить список вершин на полигоны, вы должны найти циклы в неориентированном графе, который создается вершинами и ребрами. Для треугольного многоугольника с вершинами A, B и C вы получите ребра AB, BC и AC.

Самый простой алгоритм, который я могу придумать:

  1. Преобразуйте все точки так, чтобы ваша 2D-плоскость, где ось Z была равна 0. (поверните, поверните и переместите, как требуется, чтобы преобразовать желаемую 2D-плоскость в линию с плоскостью XY, где Z = 0).

  2. Для каждого плоского многоугольника:
    a. Для каждого ребра проверьте, имеют ли вершины противоположный знак на оси Z (или один из них равен 0). Если Z0 * Z1 <= 0, то это так <br> b. Используйте определение линии и решите для точки, где Z = 0. Это даст вам X, Y пересечения.
    c. Теперь у вас есть точка, линия или многоугольник, представляющий пересечение исходного плоского многоугольника из шага 1, пересекающего 2D-плоскость.
    d. Заполните многоугольник, образованный формами (при желании). Если ваш пакет 2D-рендеринга не создаст многоугольник из списка вершин, вам нужно начать рендеринг пикселей с использованием линий сканирования.

Каждый из отдельных алгоритмов должен быть в «Алгоритмах на С» или аналогичных.

Графические программы могут быть весьма полезными, когда они начинают работать.

Развлекайся,

Jacob

0 голосов
/ 01 сентября 2009

Если вы ищете стороннюю реализацию, возможно, вам стоит изучить Coin3d . Способен на такие вещи, как вам требуется, хотя я не уверен в его точном формате базы данных или входных требованиях. Мне не хватает вашего описания, поскольку вы не указываете направление, из которого вы хотите проецировать трехмерное изображение на двухмерную плоскость.

0 голосов
/ 25 августа 2009

если это 3d-текстура, вы не можете просто указать 3d-текс-координаты (в текстуру) для каждой вершины квада? Разве это не будет автоматически интерполировать тексели?

0 голосов
/ 24 августа 2009

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

Я сталкивался с таким алгоритмом несколько лет назад в Gem Graphics, Gems Gem или в аналогичной книге. Я не смог найти что-нибудь в нескольких поисках Bing, но, надеюсь, это даст вам некоторые идеи.

0 голосов
/ 24 августа 2009

Это больше специфично для opengl, чем для c #, но я бы сделал:

Вращайте и преобразуйте с помощью трехмерной матрицы, чтобы нужный вам срез находился на расстоянии 1 метра от камеры.

Затем установите пределы ближнего и дальнего горизонта на 1м и 1.001м соответственно.

-update- Вы вообще используете opengl? Если нет, то вы можете как-нибудь самостоятельно выполнить матричную арифметику.

...