Calcularea normală la suprafață, Direct3D, articole, programare - programare C,

In ultimul tutorial, în cazul în care am arătat structurarea și clasificarea proiectului, am da exemplul unui peisaj tridimensional. peisaj de construcție a algoritmului în sine, voi descrie în lecții ulterioare (dedicate de lucru cu peisajul), dar acum suntem interesați în modul de a produce normal de calcul pentru poligoanele care alcătuiesc suprafața peisajului. Cei care conduc exemple, au fost văzute ca iluminarea se face. Pe tot parcursul programului, cu generarea peisajului, instalarea normală nu este făcută, singura mențiune a normalelor conținute în GenerateNormals de apel () funcția. Am creat special pentru calcularea terenului normale (și este conținută în clasa până la obiecte tridimensionale, cred, și apoi va fi într-o locație ușor diferită).

Să considerăm mai întâi teoria de a găsi normala la planul pe punctul setat (întreb de multe ori această întrebare), și apoi ia în considerare modul în care să-l pună în aplicare în Direct3D8 (sau, mai degrabă, așa cum am făcut).

Deci, ce este normal? În mod normal este direcția în spațiu și are parametrii (x, y, z), precum și orice vector. O caracteristică a normalului poate fi numit ca lungimea sa este întotdeauna egală cu 1. Aceasta este:

Cum este normal? Pentru a începe să ia trei puncte (a, b și c). Pentru aceste puncte au nevoie pentru a calcula vectorul p (din punctul a la b) și q (de la a la c):

După primirea acestor doi vectori, vom calcula normal ca produsul transversală a vectorilor p și q cu normalizarea rezultatului. Acest lucru poate fi reprezentat în pseudo-cod ca:

Pentru a normaliza rezultatele trebuie să fie împărțită în fiecare vector parametru de lungimea sa, care se calculează ca:

Asta e teoria. Acum, așa cum am făcut-o.

Avem o serie de puncte care reprezintă vârfurile și o serie de indici, care arată modul în care este necesar pentru a eluda aceste noduri (de exemplu, construcția efectivă a depozitelor de deșeuri). Trebuie să treacă prin toți indicii de o serie de indici pentru a obține valorile coordonatelor de trei puncte care formează un singur poligon, apoi se calculează și se obține vectorii normali (și apoi atribuiți-l la partea de sus dorită). Iată cum arată.

- p_ObjInd - Indici matrice
- p_ObjVert - matrice vertex
- dwNumIndecies - numărul de indici
- v1, v2, v3 - Federația trei noduri (din teoria a, b și c)
- a, b, c - vertexul (stoca coordonatele lor într-un vector)
- p și q - vector de la punctul a la b și de la, respectiv c
- n - Calculat normală

După cum puteți vedea este simplu. Pentru încrucișată produsul vectorilor p și q utilizat pentru a normaliza rezultatele funcțiilor D3DXVec3Cross () și D3DXVec3Normalize ().

Un alt aspect. Dacă lăsați totul așa cum este, luminile se vor transforma mai multe „rupt“. Pentru a evita acest lucru - aveți nevoie pentru a face o normalele de netezire de poligoane învecinate. Imaginați - vă sunt, de fapt, de așteptat, unele normale pentru un singur punct (pentru nodurile cu aceleași coordonate), dar care aparțin diferitelor poligoane. Eu o fac destul de ușor.

Este imposibil să se calculeze în mod normal pentru partea de sus, pentru că este doar un punct în spațiu. Cu toate acestea, puteți face un calcul aproximativ. La calcularea înțelegerii normale a ideilor pentru avioane și chipuri, normalele pentru nodurile pot fi calculate cu ușurință. normalele Vertex va fi media normalele fețelor din jurul lui. Astfel, definind fețele adiacente, putem determina cu ușurință normal pentru acest vârf. Aici este un algoritm de calcul al probei: a crea un n variabile, ceea ce reprezintă un vector și inițializa-l în (0,0,0). Acum trebuie să instituie un ciclu de toate nodurile pentru fiecare nod definesc linia în care este inclusă. În cazul în care această linie este inclus, de asemenea, și vârful, pentru care facem calculul, normale a feței se adaugă la n. Astfel, vom obține valoarea normală. Rămâne doar pentru a normaliza n.

În funcție de parametrul de intrare in_smooth netezirea se face sau nu. Aici Sper că totul este clar.

Un pic mai mult - am obiecte pot consta din mai multe părți. Acest lucru este prevăzut, iar atunci când este necesar să se prevadă normalizarea - care arata ca întreaga normalizare funcție în clasa mea.

Acum, poate, totul. Exemplu rămâne aceeași, și am făcut o captură de ecran a unui alt.

Calcularea normală la suprafață, Direct3D, articole, programare - programare C,