Спосіб створення країв і граней примітивної форми, як коробка, конус і все те, що ви цитували, - це генерувати їх одночасно із створенням вершин. Насправді, ви повинні створити вершини логічним способом, який спрощує обчислення ребер та граней відповідно.
Існують алгоритми, які беруть за вхід набір точок у просторі і обчислюють над ним так звану " триангуляцію набору точок ", але проблема триангуляції набору точок є NP-повною , щоб швидше зробити краї та грані як ви йдете, ніж просто обчислити вершини і дозволити алгоритму виконати роботу. Просто повідомити про це рішення існує.
Окрім цього неефективного рішення, я вважаю, що ви можете ставитися до примітивів лише на кожен випадок, як у наступних прикладах.
Сітка - це вершини та грані . Краї містяться в описі граней, якщо ваша сітка не містить рядки, які не складають граней. Вершини - кортежі з 3 координат з плаваючою комою. Краї є просто парами посилань на вершини, але потім вони вам точно не знадобляться. Скажімо, наприклад, що ваші вершини знаходяться в індексованому масиві. Ну а ваші краї можуть тоді бути парами індексів цього масиву. Обличчя - це потрійні посилання на вершини або потрійні індекси у випадку індексованого масиву .
Ви повинні вміти рахувати вершини, краї та грані, що складають кожну з цих примітивних фігур, оскільки вміти їх рахувати означає розуміння властивостей об'єкта, що допомагає вам розробити метод, за допомогою якого ви будете їх будувати, використовуючи петлі та інші інструменти, як ми побачимо.
Конус
Для конуса з n + 2 вершинами, 3n ребрами та 2n гранями:
- Складіть дві окремі вершини.
- Складіть коло навколо однієї з вершин (основної вершини), тобто в площині, перпендикулярній відрізку між першими двома вершинами. Сподіваємось, ви можете зробити коло за допомогою тригонометрії, правда? Ось уже всі вершини конуса. Це також одна третина всіх ребер ( в колі є n ребер і 3n загалом).
- Зробіть n країв від основної вершини до n вершин у колі. Ви можете зробити одну половину граней (тобто n граней), як це зробити.
- Зробіть n країв від верхівкової вершини до n вершин у колі. Ви можете зробити іншу половину граней (тобто п. ), Як це зробити.
1)
2)
3)
4)
Кінцевий результат:
Ви також можете створювати краї та грані під час запуску циклу, який складає коло. Така ж складність, те саме. Складіть одну вершину на колі, збережіть її у своєму масиві вершин, додайте відповідний край (пару індексів) до масиву пар індексів, якщо вам це подобається, і, нарешті, додайте відповідне обличчя до масиву трійки індексів. . Перехід до наступної вершини.
Циліндр і трубка: не виконуючи одну і ту ж роботу двічі, і квадроцикли
Знову ж таки, для трубки вона починається з вершини та кола, яке буде центром або верхнього, або нижнього диска циліндра:
- Складіть вершину.
- Складіть коло навколо вершини. Додайте ребра (якщо ви хочете ребер) між послідовними вершинами кола та між центральною вершиною та кожною вершиною кола. Додайте грані між кожною трійкою вершин, виготовленими з центральної вершини, і двома послідовними вершинами на колі.
- Скопіюйте все це, перекладіть копію в напрямку, перпендикулярному до основи, яку ви тільки що зробили, на довжину потрібного циліндра.
- Зв’яжіть верх і низ.
Щоб зв’язати верхню і нижню частини, ви повинні зробити квадратики між парами вершин, які стикаються один з одним. Тож подумайте заздалегідь, а чому б не зробити собі функцію, яка робить чотири трикутні грані з чотирьох вершин?
Зроблено. Зауважте, що цього разу ми використовуємо той факт, що одна і та ж структура (коло + центр) з’являється двічі в циліндрі, щоб взяти ярлик. Нам не потрібно робити всі вершини, краї та грані вручну, всупереч конусу там, де це було необхідно.
Дотримуючись цього принципу лінощів, також можна просто скласти одну чверть кола і дублювати його, і знову ж таки, зробити повне коло з дуже простими перетвореннями (справедливо для будь-якого кола, так само і для конуса), але це справді надмірно для не така складна форма.
Ви завжди повинні використовувати геометричні властивості об’єктів, які ви робите, щоб спростити їх виготовлення . А саме, їх симетрії та інваріанти .
Для циліндра просто не робіть базової вершини, просто зробіть коло, дублюйте, перекладіть копію, зробіть квадратики, зробили.
Сфера і капсула: додаючи складності, все одно не двічі однакові
Щоб створити капсулу, ми хочемо створити УФ-сферу, розділити її на дві половини, перекласти першу половину, а потім з'єднати дві зі сторонами капсул.
Знову можна скласти лише одну восьму (!!) сфери, потім її дублювати і повернути назад, а потім дублювати і повертати результат, крім уздовж іншої осі тощо, щоб отримати повну сферу в 4 кроки (створити восьму. , дублювати та обернути три рази). Можливо, надмірність, але менше, ніж у випадку кола.
Проста ультрафіолетова сфера:
Насправді ми робимо лише одну її половину (наприклад), дублюємо цю половину, перевертаємо копію догори дном і перекладаємо її по довжині капсули:
Пов’язуємо верхню і нижню половину:
Справжня (дещо) важка робота походить від тригонометрії, яка перетворюється на створення сфери. Сукупність усіх вершин, що належать до УФ-сфери, можна охарактеризувати як набір усіх точок форми:
де R - радіус сфери, і для певного додатного парного числа N маємо постійну
θ = × π / N ,
k і n - цілі числа з k, що змінюються від 0 до 2N-1 і n змінюються від -N / 2 до + N / 2 .
Щоб зробити півсферу або вісімку сфери, ви повинні обмежити набір значень, прийнятих за k і n .
Якби k були дійсні числа, а не просто цілі числа, ви отримали б цілу сферу, а не лише вершини на її поверхні. Отже, що ми тут зробили, - це растерізація рівняння поверхні примітиву .
Страшний торус : це легко після всього, що ми бачили!
Знову ж таки, більше тригонометрії, більше вершин, більше квадів, більше симетрії, більше інваріантів ... більше геометрії! Дізнайтеся рівняння поверхні тору, належним чином "растрируйте його", спростіть проблему, використовуючи (очевидні) симетрії тора і, нарешті, проведіть через набір вершин, які ви тільки що визначили, і зробіть краї та грані, як ви йди!
Подивитися? Цілком прямо.