булеві операції на сітках


15

задано набір вершин і трикутників для кожної сітки. Хтось знає про алгоритм чи місце, щоб почати шукати (я спробував Google, але спершу не знайшов хорошого місця, щоб почати), щоб виконати булові операції на зазначених сітках та отримати набір вершин і трикутників для отриманої сітки? Особливий інтерес представляють віднімання та об’єднання.

Приклади зображень: http://www.rhino3d.com/4/help/Commands/Booleans.htm

Відповіді:


10

Я вважаю це конструктивно-суцільною геометрією (CSG). Сподіваємось, ви можете знайти тут допомогу.

http://www.alsprogrammingresource.com/csg.html

http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html

http://www.nigels.com/research/

Також пошукайте в google для конструктивної суцільної геометрії для початку.

HTH


+1 - Я збирався розміщувати ті самі посилання, JustBoo - поки я не помітив, що ти мене до цього побив! :)
jacmoe

Спасибі! Термінологія Конструктивна-Суцільна-Геометрія - саме те, що мені було потрібно!
lathomas64

@jacmoe - Іронія зараз дивовижна і повна :-) Ви заслуговуєте на заслуги для деяких із них. Дякую.
JustBoo

деякі з них? : PI вважаю, я записав їх усіх там, де там. : D Все-таки вони лише основні речі CSG. Звідси він стає досить волохатим - навіть великі пакети комерційного моделювання не впоралися.
jacmoe

3

Я думаю, що ми можемо це розгадати, якщо просто подумаємо про це.

Ви, очевидно, хотіли б створити грані (трикутники), де дві геометрії перетинаються. Тоді вам залишаються три сітки: перетин, який ви просто виділили, геометрія 1 та геометрія 2.

Потім просто видаліть те, що вам не потрібно!

  • BooleanDifference: видаліть ізольовану частину та геометрію 2.
  • BooleanIntersection: видаліть геометрію 1 і 2, залишивши ізольовану частину
  • BooleanUnion: об’єднайте геометрії 1 і 2 і видаліть ізольовану частину (обов'язково зшийте геометрії 1 і 2 в цільну геометрію)
  • BooleanSplit: відокремте геометрію 1, геометрію 2 та копіюйте ізольовану частину (приєднайте одну до геометрії 1, а другу - до геометрії 2)

Я думаю, що це охоплює, так? Важкою частиною, очевидно, буде створення граней перехрестя. Для цього перейдіть через кожне обличчя одного і перевірте, чи є це обличчя частиною іншого; якщо він повністю знаходиться всередині, скопіюйте обличчя як частину сітки перехрестя. Якщо він частково всередині, то потрібно розділити трикутник по лінії перетину; Я думаю, що DirectX і OpenGL обидва мали б допоміжні функції для цього, або це просто якась 3D-математика площини (вектори). Я дізнався про подібні речі в обчисленні 3 (чи це було 2?), Але якщо у вас немає поняття, можливо, запитайте на сайті math.stackexchange.com . І тоді, звичайно, якщо обличчя зовні, нічого не робіть. Після того, як ви перейдете по всіх гранях обох сіток, вам залишиться сітка перетину.


2

Якщо ви маєте справу з полігональними моделями, вам, можливо, доведеться мати справу з неоднорідною геометрією, це означає, що питання про те, що знаходиться "всередині", а що "зовні", не визначено. Провести булеву операцію складно, якщо ви не знаєте, чи є у вас 0 або 1.

Вам також доведеться мати справу з окантовками, такими як копланарні багатокутники, багатокутники, які перетинаються ребрами, вершини, які лежать на ребрах та / або гранях, та речі такого характеру. Жодне з яких неможливо, вам просто потрібен дуже надійний спосіб представлення ваших сітчастих даних та чітке визначення того, що ви очікуєте у таких випадках.


1

Варто зазначити, що більшість ваших операцій може бути представлена ​​запереченням і об'єднанням, де заперечення якоїсь геометрії є саме такою геометрією з її нормалами. Отже, якщо ви можете отримати право на об'єднання, то інші операції повинні просто слідувати:

  • перетин (A, B): =! союз (! A,! B)
  • віднімання (A і B): =! об'єднання (! A, B)

У Sander є кілька непоганих публікацій у блозі, де обговорюються впровадження CSG: http://sandervanrossen.blogspot.com/search/label/CSG


1
Я хотів би згадати свої власні речі з CSG, але, мабуть, це вже хтось зробив: O)
Сандер ван Россен

1

Це досить складний предмет, принаймні, якщо ви хочете робити це надійно (плаваюча точка викликає серйозні труднощі).

Я хотів би вказати на літературу з обчислювальної геометрії / комп’ютерної графіки з цього приводу, особливо на цих останніх роботах:

http://homes.cs.washington.edu/~gilbo/repofiles/booleans2009.pdf

http://openflipper.org/uploads/media/campen_2010_eg_02.pdf

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.