Изчисляването на нормалната към повърхността, Direct3D, статии, програмиране - програмиране C,

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

Нека първо разгледаме теорията на намирането на нормалата към равнината на заданието (I често задавате този въпрос), и след това да се помисли как да го приложат в Direct3D8 (или по-скоро, както направих аз).

Така че това, което е нормално? Нормалното е посока в пространството и има параметри (X, Y, Z), както и всеки вектор. Характерна особеност на нормалното може да се нарече, че дължината му е винаги равна на 1. Това означава:

Как е нормално? За да започнете да вземат трите точки (А, В и С). За тези точки трябва да се изчисли вектор Р (от точка А до точка б) и Q (от А до С):

След получаване на тези два вектора, ние изчисляваме нормалата като напречното продукт на вектори Р и Q с нормализиране на резултатите. Това може да бъде представен в псевдо-код като:

За нормализиране на резултатите трябва да бъдат разделени всеки параметър вектор от неговата дължина, който се изчислява като:

Това е теорията. Сега, както аз го направих.

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

- p_ObjInd - индекси масив
- p_ObjVert - връх масив
- dwNumIndecies - броят на индексите
- V1, V2, V3 - федерация три върха (от теорията на а, б и в)
- A, B, C - връх (съхранява техните координати в вектор)
- р и р - вектор от точка А до В и от А до С, съответно
- п - Изчислено нормална

Както можете да видите, че е проста. За напречното продукт на вектори Р и Q се използва за нормализиране на резултатите D3DXVec3Cross () функция и D3DXVec3Normalize ().

Друг аспект. Ако оставите всичко както е, светлините ще се превърнат няколко "счупен." За да се избегне това - трябва да се направи изглаждащ нормали на съседни полигони. Представете си - вие сте в действителност се очаква известно нормално за една точка (за възли с еднакви координати), но принадлежащи към различни полигони. Аз го правя доста лесно.

Невъзможно е да се изчисли нормално за горната част, защото тя е само една точка в пространството. Въпреки това, можете да направите приблизително изчисляване. При изчисляване на нормалното разбиране на идеи за самолети и лицата, нормалните за върховете могат да бъдат изчислени лесно. Vertex нормали ще бъде средната стойност на нормалните на лицата около себе си. По този начин, дефиниране на съседни лица, ние можем лесно да се определи нормално за този връх. Тук е алгоритъм проба изчисление: създаване на променлива п, което представлява вектор и го инициализира в (0,0,0). Сега трябва да се създаде една линия над всички върхове за всеки връх определя лицето, в която е включена. Ако тази линия също е включена, и на върха, за които ние правим изчисляването нормалата на лицето се добавя към п. По този начин ние получаваме повече от нормалното количество. Остава само да се нормализира п.

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

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

Сега, може би, всичко. Пример остава същата и се направи снимка на друг.

Изчисляването на нормалната към повърхността, Direct3D, статии, програмиране - програмиране C,