Генерація процесуальної геометрії


10

Нещодавно я розглядав SceneKit для OS X і помітив, що існує кілька заводських методів створення геометричних фігур, таких як:

Коробка, капсула, конус, циліндр, літак, піраміда, сфера, торус і трубка.

Мені цікаво додати таких примітивних форм моєму рендері, але я намагаюся знайти будь-яке розумне джерело, з якого я можу зібрати розуміння процесуального покоління. Існує кілька ресурсів, які детально розглядають теорію, але не вистачає відповідного вихідного коду для її резервного копіювання.

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

Я розумію теорію, але не маю знань, щоб почати підрозділяти обличчя геометрії для досягнення бажаного ефекту.

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

Чи може хтось надати якісь деталі щодо процедурної геометрії? Що мені дійсно потрібно, це якийсь вихідний код, щоб отримати деяку інформацію. Я шукав підручники на високому та низькому рівні, але поки що придумав лише кілька розумних сайтів чи блогів. Будуть вдячні будь-які хороші книги, навчальні посібники, блоги чи наукові праці.

Редагувати на основі коментарів

Я мав би уточнити, що я знаю, як створювати вершини для основних фігур, більшість із них, можливо, можна досягти простими петлями. Я не розумію, як створити обличчя з створеного масиву вершин. Як створити трикутну смужку або трикутники з, здавалося б, не упорядкованого масиву вершин?

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

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

Останнім аспектом буде нанесення текстур. Знову ж таки, це не те, що я реалізував, але прочитав і знаю вимоги.

Головною проблемою тут є те, що я знаю, чого хочу досягти, але намагаюся розшифрувати, як реалізувати вищезгадані примітиви. Я сподівався, що мені вдасться знайти деякий вигляд знань за допомогою вихідного коду, але я дійсно до цього часу не натрапив на щось підходяще.


Ви говорите, що ваша проблема полягає в розподілі геометрії, але тоді ви говорите, що складати вершини має бути просто, а потім ви кажете, що ваша проблема полягає в тому, як створити обличчя, а потім ви скажете, що ваша проблема полягає в графіці текстури. Що з тобою таке? Чи можете ви генерувати позиції вершин? Чи можете ви генерувати краї та обличчя? Також координати текстур залежать від вашої текстури та того, що ви хочете досягти з нею, тому питання про координати текстури не є гарним. Нарешті, покоління примітивів - це просто геометрія, і люди рідко називають це "процедурною геометрією", хоча це і є.
jrsala

Я розумію, як створити геометрію для простих фігур, таких як куб чи площина, її створення граней, яких я не розумію. Як створити обличчя з купки вершин? Складання точок для складніших фігур є частиною проблеми, хоча я маю базове розуміння. Склеювати їх усі разом у трикутну смужку чи трикутники - це те, що я намагаюся обернути голову.
Капітан Редмуф

Добре, дякую за деталі. Ви можете відредагувати своє запитання, щоб уточнити. Час відповіді!
jrsala

Відповіді:


11

Спосіб створення країв і граней примітивної форми, як коробка, конус і все те, що ви цитували, - це генерувати їх одночасно із створенням вершин. Насправді, ви повинні створити вершини логічним способом, який спрощує обчислення ребер та граней відповідно.

Існують алгоритми, які беруть за вхід набір точок у просторі і обчислюють над ним так звану " триангуляцію набору точок ", але проблема триангуляції набору точок є NP-повною , щоб швидше зробити краї та грані як ви йдете, ніж просто обчислити вершини і дозволити алгоритму виконати роботу. Просто повідомити про це рішення існує.

Окрім цього неефективного рішення, я вважаю, що ви можете ставитися до примітивів лише на кожен випадок, як у наступних прикладах.

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

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

Конус

Для конуса з n + 2 вершинами, 3n ребрами та 2n гранями:

  1. Складіть дві окремі вершини.
  2. Складіть коло навколо однієї з вершин (основної вершини), тобто в площині, перпендикулярній відрізку між першими двома вершинами. Сподіваємось, ви можете зробити коло за допомогою тригонометрії, правда? Ось уже всі вершини конуса. Це також одна третина всіх ребер ( в колі є n ребер і 3n загалом).
  3. Зробіть n країв від основної вершини до n вершин у колі. Ви можете зробити одну половину граней (тобто n граней), як це зробити.
  4. Зробіть n країв від верхівкової вершини до n вершин у колі. Ви можете зробити іншу половину граней (тобто п. ), Як це зробити.

1) Дві вершини 2) і коло
3) і обличчя
4) і обличчя
Кінцевий результат:результат

Ви також можете створювати краї та грані під час запуску циклу, який складає коло. Така ж складність, те саме. Складіть одну вершину на колі, збережіть її у своєму масиві вершин, додайте відповідний край (пару індексів) до масиву пар індексів, якщо вам це подобається, і, нарешті, додайте відповідне обличчя до масиву трійки індексів. . Перехід до наступної вершини.

Циліндр і трубка: не виконуючи одну і ту ж роботу двічі, і квадроцикли

Знову ж таки, для трубки вона починається з вершини та кола, яке буде центром або верхнього, або нижнього диска циліндра:

  1. Складіть вершину.
  2. Складіть коло навколо вершини. Додайте ребра (якщо ви хочете ребер) між послідовними вершинами кола та між центральною вершиною та кожною вершиною кола. Додайте грані між кожною трійкою вершин, виготовленими з центральної вершини, і двома послідовними вершинами на колі.
  3. Скопіюйте все це, перекладіть копію в напрямку, перпендикулярному до основи, яку ви тільки що зробили, на довжину потрібного циліндра.
  4. Зв’яжіть верх і низ.

Щоб зв’язати верхню і нижню частини, ви повинні зробити квадратики між парами вершин, які стикаються один з одним. Тож подумайте заздалегідь, а чому б не зробити собі функцію, яка робить чотири трикутні грані з чотирьох вершин?

Зроблено. Зауважте, що цього разу ми використовуємо той факт, що одна і та ж структура (коло + центр) з’являється двічі в циліндрі, щоб взяти ярлик. Нам не потрібно робити всі вершини, краї та грані вручну, всупереч конусу там, де це було необхідно.

Дотримуючись цього принципу лінощів, також можна просто скласти одну чверть кола і дублювати його, і знову ж таки, зробити повне коло з дуже простими перетвореннями (справедливо для будь-якого кола, так само і для конуса), але це справді надмірно для не така складна форма.

Ви завжди повинні використовувати геометричні властивості об’єктів, які ви робите, щоб спростити їх виготовлення . А саме, їх симетрії та інваріанти .

Для циліндра просто не робіть базової вершини, просто зробіть коло, дублюйте, перекладіть копію, зробіть квадратики, зробили.

Сфера і капсула: додаючи складності, все одно не двічі однакові

Щоб створити капсулу, ми хочемо створити УФ-сферу, розділити її на дві половини, перекласти першу половину, а потім з'єднати дві зі сторонами капсул.

Знову можна скласти лише одну восьму (!!) сфери, потім її дублювати і повернути назад, а потім дублювати і повертати результат, крім уздовж іншої осі тощо, щоб отримати повну сферу в 4 кроки (створити восьму. , дублювати та обернути три рази). Можливо, надмірність, але менше, ніж у випадку кола.

Проста ультрафіолетова сфера:
сфери

Насправді ми робимо лише одну її половину (наприклад), дублюємо цю половину, перевертаємо копію догори дном і перекладаємо її по довжині капсули:
половинки

Пов’язуємо верхню і нижню половину:
капсула

Справжня (дещо) важка робота походить від тригонометрії, яка перетворюється на створення сфери. Сукупність усіх вершин, що належать до УФ-сфери, можна охарактеризувати як набір усіх точок форми:

бали

де R - радіус сфери, і для певного додатного парного числа N маємо постійну

θ = × π / N ,

k і n - цілі числа з k, що змінюються від 0 до 2N-1 і n змінюються від -N / 2 до + N / 2 .

Щоб зробити півсферу або вісімку сфери, ви повинні обмежити набір значень, прийнятих за k і n .

Якби k були дійсні числа, а не просто цілі числа, ви отримали б цілу сферу, а не лише вершини на її поверхні. Отже, що ми тут зробили, - це растерізація рівняння поверхні примітиву .

Страшний торус : це легко після всього, що ми бачили!

Знову ж таки, більше тригонометрії, більше вершин, більше квадів, більше симетрії, більше інваріантів ... більше геометрії! Дізнайтеся рівняння поверхні тору, належним чином "растрируйте його", спростіть проблему, використовуючи (очевидні) симетрії тора і, нарешті, проведіть через набір вершин, які ви тільки що визначили, і зробіть краї та грані, як ви йди!

Подивитися? Цілком прямо.


Ого. Дякую вам за таку детальну відповідь та за стільки прикладів. Я не розглядав ідею просто генерувати половину кулі та відображати симетричні елементи. Велике спасибі за те, що знайшли час, щоб написати це таким чином, що я можу легко зрозуміти і, сподіваюся, легко реалізувати на практиці.
Капітан Редмуф

Ласкаво просимо! Вибачте, що коду не було.
jrsala

Контур методів був більше того, що мені справді було потрібно. Я можу почати розробляти план дій щонайменше:] Я не думаю, що у вас є інформація про коробки / кубики з скошеними краями? docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/…
CaptainRedmuff

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