Триизмерна графика програмиране

триизмерна графика програмиране. Част 3.

Триизмерна графика програмиране

Върхове (точки в пространството) - е в основата (рамка) на всички триизмерни обекти. От върховете ще депа и на депа за отпадъци - сложни триизмерни обекти.

Какво е полигон? Обърнете внимание на картинката (3.1.1.).

Триизмерна графика програмиране

Фигура 3.1.1. Видове полигони.

Т.е. на фигурата показва, че депо - геометрична фигура, състояща се от сегменти, свързани последователно в краищата си в затворена форма. Триъгълник, квадрат, правоъгълник, многоъгълник са специални случаи.

Polygon (полигон), в превод от английски - многоъгълник. Ние просто трябва терминът "полигона" - използва главно в геометрията. И терминът "полигона" Прикрепете го към концепциите за триизмерна графика. И всъщност - това е едно и също нещо.

Какво ще се определят нашия триъгълник ще създаде следната структура:

TVertex структура определя точка в пространството, и TTriangle масив - описва нашата гама. За да се построи триъгълник, трите точки са достатъчни. Затова нашата гама се състои от три елемента, които определят координатите на върховете на триъгълника.

Сега нека да определим триъгълник. За да направите това, да създадете променлива от тип TTriangle, и я питам следните координати:

Координати ние се определя, както следва: тъй като (0,0,0) - е в центъра на екрана, първият връх ние Oy лежи на оста и има стойност Y = 100; вторият пик е в долния ляв ъгъл на графиката и има координати: X = -100; Y = - 100; трета точка съответно разположена противоположно на втората, и има координати: X = 100; Y = - 100.

Както може да се види, Z координата, ние не се вземат под внимание (тя се свежда до нула), т.е. нашия триъгълник е успоредна на XY координатна равнина. Вж. Фигура (3.1.2.).

Триизмерна графика програмиране

Фигура 3.1.2. Триъгълник.

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

За щастие, на куба - една много проста фигура. Затова ние сортирате полигоните е много проста.

Първо, малко променяме типове данни:

Добавихме нов тип - TVector. Това е същото като TVertex. Този тип сме добавили само за програмиране удобство. Ние също се променя вида на TQuad. Сега това не е просто набор и структура. Те включват три нови области. Цвят - цветната многоъгълника. Point2D -dvuhmernaya проекция на нашите върхове. Сега отиваме след началото на превода в 2D, просто да ги въведете в тази област. Нормално - нормално депото.

На последната спирка в детайли. Какво е нормално и какво е това? Първо, нормално - е перпендикулярна. Т.е. в този случай, перпендикулярна на нашето сметище. Второ - това е вектор. И трето, дължината на този вектор е винаги равен на единица.

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

Да предположим, че има два вектора на А1 (х1, у1, Z1) и В1 (Х2, Y2, z2). Прекарано ъгъл формула между тях е, както следва:

Т.е. скаларно произведение на векторите трябва да бъде разделена от продукта от дължините на тези вектори. Но тъй като дължината на вектора сме равни на един, а след това в долната част на формулата може лесно да се изхвърли. Уил е толкова проста формула:

Следователно, нормално за всички полигони са изчислени предварително, което би след това по време на оказване на графики, харчат по-малко компютърни ресурси, за да се изчисли ъгъла между нормалните.

При инициализация на куба, всяка страна от него е перпендикулярна една от координатните оси, следователно, могат да бъдат настроени следните координати на нормалните:

С тези нормали ние ще сортирате сметищата. По-точно координира Z - всеки нормален. Т.е. полигони с по-малката стойност ще бъдат изтеглени първи, и полигони с големи стойности на координатите са изготвени последно.

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

Сортиране на сметищата, ние ще с помощта на метода на бързото сортиране. Когато имаме малко полигони, в нашия случай, шест от тях - този метод не дава увеличава значително производителността. Но когато броят им е над хиляда, а нарастването на производителността вече е осезаем. Ето защо, ние ще използваме само този вид.

А сега да разгледаме процедурата за изготвяне куба:

Както можете да видите процедурата по куб рисунка, ние сме станали много по-сложна. Сега ние не трябва само да включите куб върховете, но и цялото му нормално. Т.е. Нормално депото трябва да бъде завъртян в една и съща посока, колкото и самото сметище.

Тогава ние се превежда цялата ни върха на двуизмерен изглед. Т.е. запълнят Points2D масив - всеки полигон. Тогава ние сортирате полигоните в координатната Z. И накрая ги показва на екрана.

метод SetColor излага нашата цвят RGB - компонент. И възлага на частна променлива клас FRGB. Лично променлива (област) - променлива, която ще бъде на разположение само в нашия клас (по пътя на нашия клас).

Но в метода GetColor случва много интересно. При този метод, ние превръщаме цвета RGB обратно в тип TColor. В този предварително умножаване на всеки цветен компонент своята интензивност. И интензивността на цвета, ние ще се определя от променливата Normal.Z, т.е. Z - координира нашата обикновена депото.

Защо така? Това е много проста! Ние сме съгласни, че източникът на светлина, ще се съсредоточим върху екрана на монитора. Т.е. светлинните лъчи ще бъдат изпратени като от човешки очи седяха в предната част на монитора. Ето защо, вектора на светлинния лъч е успоредна на координатната ос Z. Това означава, че леки векторни лъч координати са следните: (0, 0, 1);

Този вектор е уникален. И както научихме да намерите ъгъл между две вектори могат да бъдат изолирани от ъгъла на формула = Х1Х2 + Y1Y2 + Z1Z2.

Заместващ ни вектори в това уравнение и се: Normal.X * 0 + Normal.Y * 0 + Normal.Z * 1. Това показва променлива Normal.Z и ще вземе ъгълът между нормалното и вектора на светлинен лъч. Толкова е просто!

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

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