Присвояване на повърхности на зони въз основа на 3D регионите, които обхващат

Като се има предвид набор от повърхности в триизмерно пространство, аз се опитвам да присвоя всяка повърхност на зона, отнасяща се до най-малката 3D област, която наборът обхваща, или без зона, ако това не е приложимо. Също така искам да определя дали една повърхност е интерфейс между две зони. Така, например, ако имаме 11 повърхности, представляващи два куба, подредени един върху друг, повърхностите в горния куб ще бъдат в една и съща зона, а повърхностите в долния ще бъдат в различна зона (като интерфейсната повърхност е и в двете зони).

Като пример, искам да взема набор от повърхности като тази и да го превърна в това. Всеки цвят тук представлява зона, като сивото не е свързана зона (както в капака в долната част).

Направих известно търсене наоколо, опитвайки се да намеря дали някой вече е измислил алгоритъм за това, но не намерих нищо (повечето изглежда идентифицират региони, вместо да свързват повърхности с региона, който обхващат). Като такъв се опитвам да измисля свой собствен алгоритъм и се чудя дали има други алтернативи или дали моят метод ще работи.

Предполагам, че всички повърхности са свързани.

Идеята ми е следната:

  1. Изберете произволна повърхност, всяка от страните на която докосва точно една друга повърхност, и добавете това към зона 1.
  2. Добавете всяка свързана повърхност към зона 1, при условие че всяка от нейните страни докосва точно една друга повърхност.
  3. За онези свързани повърхности, които докосват повече от една повърхност от поне една от страните си, добавете ги към списъка „може би“.
  4. За всяка нова повърхност в зона 1 повторете стъпки 2-3.
  5. След като дадена повърхност бъде добавена към списъка „може би“ два пъти, добавете я към зона 1 и я премахнете от списъка „може би“. Маркирайте тази повърхност като зонален интерфейс.
  6. Добавете интерфейса на зона към зона 2.
  7. Изберете една произволна повърхност от списъка „може би“ и я задайте на зона 2 и изчистете списъка „може би“.
  8. Повторете стъпки 2-7 (разбира се, като актуализирате номера на зоната), докато няма неназначени повърхности.

Това изглежда работи за прости сценарии (напр. две кубчета, подредени един върху друг), но не съм сигурен дали има някакви трудни условия, за които трябва да внимавам, или ако се разпада, след като има повече от две зони които споделят една страна.

Всяко подобрение на моя груб алгоритъм/алтернативни идеи за изпълнение ще бъде оценено. Благодаря!

РЕДАКТИРАНЕ: Ето някои повече подробности в отговор на някои коментари. Зоната според моето определение е просто група от повърхности, които напълно ограничават 3D област без празнини. Така че, ако имах два куба, A и B, които не се докосват, щях да имам две зони: едната се състои от всички повърхности на куб A, а другата от всички повърхности на куб B. Ако имах куб, който липсва от една страна, няма да има зона, свързана с тези повърхности.

Крайната ми цел е да направя автоматизиран процес за групиране на повърхности в инструмент за моделиране, който създавам. Спецификите са класифицирани, но по същество се занимавам с модели, при които определени свойства са общи само между повърхности в една и съща „зона“, както е описано по-горе. Искам да направя автоматизиран процес, който създава тези зони, така че потребителят да може да приложи тези свойства към всички повърхности в зоната наведнъж, вместо да го прави ръчно.

По същество проблемът се свежда до намирането на най-малките 3D региони, които са напълно затворени от произволен набор от повърхности, и проследяване кои повърхности към кои региони принадлежат. Надявам се това да направи въпроса ми по-ясен.


person sschilli    schedule 29.07.2015    source източник
comment
Това звучи ужасно много като ограничаващи кутии и окторета, често използвани в 3D игри за различни цели.   -  person MooseBoys    schedule 30.07.2015
comment
@MooseBoys За съжаление не искам това. Опитвам се да групирам повърхности въз основа на най-малките 3D обеми, които те обхващат като цяло, докато връзката, която споделихте, изглежда е за намиране на най-малкия обем, който съдържа всяка повърхност. Това всъщност не се отнася за това, което се опитвам да направя.   -  person sschilli    schedule 30.07.2015
comment
Съгласен съм с MooseBoys, според вашето описание или Octree, kd-tree, bounding-box tree, или BSP е точно това, което изграждате. Ако не е така, ще трябва да преформулирате въпроса си. Определете зона. Определете какво имате предвид под обхваща: т.е. единичен триъгълник обхваща какво във вашата схема? Освен това посочете крайната си цел, т.е. ако имате това, което искате, ще извършвате ли специални заявки, изчислявате обем и т.н.?   -  person Nicko Po    schedule 04.08.2015
comment
@NickoPo Добавих още някои подробности към първоначалния си пост. Надяваме се, че това помага да изясня какво търся.   -  person sschilli    schedule 04.08.2015
comment
Предполагате ли, че всеки набор от повърхности точно обхваща обем? С това имам предвид, че повърхностите не се простират отвъд полиедрите, които обхващат (без висящи повърхности). Как представяте повърхностите? Мисля, че може би ще успеете да адаптирате QHull за да направя това, но ще ми трябва повече информация, преди да се опитам да дам пълен отговор.   -  person DrBwts    schedule 10.08.2015
comment
@DrBwts Не, не приемам, че всеки набор от повърхности точно обхваща обем. Всъщност е вероятно в моделите, които тествам, да има висящи повърхности (такива, които не се свързват с друга повърхност от всички страни). Повърхностите са представени като подреден списък от върхове (така че основно многоъгълник в 3D пространство).   -  person sschilli    schedule 10.08.2015
comment
Само за да съм ясен, върховете в тези списъци също ли са върховете на затворения обем (минималните полиедри, затворени от тези повърхности)? Плоски ли са повърхностите? Колко върха определят една повърхност или повърхностите са произволни многоъгълници? Един прост примерен код би бил много полезен на този етап.   -  person DrBwts    schedule 10.08.2015
comment
@DrBwts Добавих в параграф (втория), който има изображения, за да обясня какво искам. Мисля, че те ще бъдат полезни. Що се отнася до вашите въпроси: 1. Ограденият обем се определя от повърхностите, така че върховете са идентични. 2. Да, всички повърхности са плоски. 3. Всички повърхности са произволни многоъгълници.   -  person sschilli    schedule 10.08.2015
comment
За да не ставам придирчив, но първото изречение в свързаното wiki завършва с равнината и политопите в 3D. Коя част ви трябва ;)   -  person Nicko Po    schedule 10.08.2015
comment
@NickoPo Могат ли DCEL обектите да се справят с неколекторни мрежи?   -  person DrBwts    schedule 10.08.2015


Отговори (1)


Това, от което се интересувате, тогава би било откриването на топология на затворена повърхност (обем) от набор от входни полигони; с други думи – политопи. Това е обичайно за почти всеки пакет за 3d моделиране. Предполагам, че Blender има код, който прави това. Има различни начини за това, но обикновено се използва някаква версия на графика с половин ръб. Вижте wiki връзката тук: Двойно свързана графика с половин ръб. Идеята е да обходите вашите входни полиети и да изградите тези графики. След като сте готови, можете лесно да направите заявка за всяка графика, за да видите дали има дупки (липсващи ръбове и т.н.).

въведете описание на изображението тук

Прикачих снимка, обясняваща как да използвате структура с половин ръб, за да получите това, което искате: Кажете, че ви е дадена супа от пет правоъгълника (те съставляват куб без горна част. Обработете първия си правоъгълник, кажете ABCD, това създава вашия първата графика, да кажем G1. Сега обработвате втория многоъгълник, да речем FEHG, нито един от тези върхове не сте виждали, така че създавате втора графика, G2. Сега да кажете, че сте виждали тези върхове преди, така че вместо да създавате нова графика, обединявате (свързвате) съществуващи графики, които споделят тези възли, докато не обработите всички полигони.

Сега, за да направите запитване към графиката, за да получите вашата информация. След като се разходите по графиката, ще видите, че има точно четири върха (възли), на които липсват ръбове. Тези верти съответстват на липсващия горен край на кутията (ръбовете са червени на илюстрацията). Следователно знаете, че тази графика не е затворено многообразие. Ако имате друга кутия, която не споделя възли с тази, ще имате друга графика. Така че всяка графика, след като приключите с обработката на полигоните, е "зона" за вас.

Имайте предвид, че ако имате две пресичащи се форми, можете да ги проследите също с помощта на тези графики, но е много по-сложно. По принцип, когато обработвате нов многоъгълник, вие не само трябва да видите дали някой от неговите върхове принадлежи към вече обработени графики, но също така да видите дали този многоъгълник пресича някой от предишно обработените полигони, ако е така, разделете този многоъгълник и добавете всичко това към пресечената графика.

person Nicko Po    schedule 04.08.2015
comment
Връзката, която споделихте, изглежда се отнася за 2D обекти, но предполагам, че няма да е много трудно да се приложи това към 3D твърдо тяло. И все пак не виждам как можете да използвате тази информация, за да определите зони, както се опитвам да направя. Не само искам да видя дали има дупки, искам всяка повърхност да бъде нанесена на най-малката област, която обхваща. Някакви идеи как да стане това? - person sschilli; 10.08.2015
comment
Мисля, че Нико По успя. - person DrBwts; 11.08.2015
comment
Присъдих наградата, защото вярвам, че сте на път за нещо и то беше на път да изтече. Все още обаче съм малко объркан. Когато създавате графика, по какъв начин свързвате точките? Ако имате ABCD, рисувате ли стрелки от B-›A, C-›B, D-›C, A-›D? Опитах се да проследя това сам и не получих същите ръбове, които ви липсваха, и не бях съвсем сигурен как гарантирате, че четирите горни ръба са свързани само с един друг връх на върха (с липсващата страна на призма). Ще съм благодарен, ако можете да ми помогнете с това. - person sschilli; 11.08.2015