Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 06.09.2004, 15:50 Titel: Normalenvektoren per Hand berechnen. |
|
|
Angenommen wir haben 9 Vertizes einer Heightmap in folgender Anordnung:
1--2--3
|**|**|
4--5--6
|**|**|
7--8--9
Ich möchte jetzt den Normalenvektor für den Vertex 5 berechnen. Dabei möchte ich den Normalenvektor aus der Ebene entnehmen, die ich aus den Eckpunkten 1,3,7,9 berechne (quasi eine Normale eine Rechtecks, die sich aus dem Durchschnittsvektor aus dem 2 Dreicken 1,3,7 und 3,7,9 ergibt)
Folgendes Problem: Vektoren einer Ebene errechnet man ja, in dem man Vektor A-Vektor B oder Vektor B-Vektor A rechnet. Aber wie rum muss ich das ganze denn machen, damit am Ende der Normalenvektor auch in die richtige Richtung zeigt (er kann ja entweder "nach oben" oder "nach unten" zeigen)???? _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 06.09.2004, 16:02 Titel: |
|
|
Nach oben zeigt der Normalvector zum Beispiel nur wenn man in uhrzeigerrichtung die Vectoren angegeben hat, ansonsten nach unten. Deshalb gibt es in einigen Algorithmen die Einschränkung das in Uhrzeigerrichtung erstellt werden soll. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 06.09.2004, 16:21 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Nach oben zeigt der Normalvector zum Beispiel nur wenn man in uhrzeigerrichtung die Vectoren angegeben hat, ansonsten nach unten. Deshalb gibt es in einigen Algorithmen die Einschränkung das in Uhrzeigerrichtung erstellt werden soll. |
Allerdings! Bei meinem MD3-Loader hatte ich Nächte lang probleme mit den Normals, bis ich darauf gekommen bin, dass die MD3's ja die Vertices im Uhrzeigersinn angeordnet haben(was ich natürlich nicht beachtet habe), was allerdings gedauert hab, weil ich zu testzwecken backfaceculling deaktiviert hatte. |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 06.09.2004, 16:48 Titel: |
|
|
Was macht man eigentlich mit den Vertizes am Rand am besten? Man hat ja nicht mehr in alle Richtungen einen benachbarten Vertex. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 06.09.2004, 16:54 Titel: |
|
|
gilt das auch für normale faces die man mit dx selbst erstellt, das man die vertices im uhrzeigersinn erstellen muss dass sie nach oben zeigen? Ich habe nämlich auch ein Problem, und zwar hab ich beim flexible vertex format auch die normalen drinn und auch richtig angegeben jedoch, ändert sich nichts egal was ich angebe. |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 07.09.2004, 01:06 Titel: |
|
|
Die Vektorenregeln gelten immer und überall. Man muss sie nur kennen...
Und jetzt noch ein anderes Problem: Ich möchte Fahrzeuge auf dem Terrain fahren lassen. Wie bestimmt man anhand des Normalenvektors vom Terrain an der Position des Fahrzeugs, wie die Rotationsachse auszusehen hat? Das Fahrzeug soll beim fahren von Bergen realistisch geneigt werden. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 07.09.2004, 22:17 Titel: |
|
|
LeeDiGer hat Folgendes geschrieben: | Was macht man eigentlich mit den Vertizes am Rand am besten? Man hat ja nicht mehr in alle Richtungen einen benachbarten Vertex. |
Muss man ja auch nicht!? Wenn du die Vertices hast, dann gehst du alle Triangles durch, bildest den Normalvektor und addierst die Werte zu den der Vertices. Am Ende gehst du nochmal alle Vertices durch und normalisierst die Normals, dann hast du schöne Normals. Das funktioniert ob man einen, garkeinen oder x benachbarte Vertices hat. |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 08.09.2004, 15:57 Titel: |
|
|
Wie liest man denn die Normalenvektoren wieder aus dem Vertexbuffer? Reinschreiben ist klar, aber wie man ausliest, weiß ich nicht. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 08.09.2004, 16:46 Titel: |
|
|
Das machst du natürlich bevor du den VB betankst!? |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 08.09.2004, 20:54 Titel: |
|
|
Es geht darum, den Normalenvektor auszulesen um Fahrzeuge vernünftig aufm dem Terrain zu richten. Ist man jetzt dazu gezwungen, die Normalenvektor in einem eigenen Array zwischenzuspeichern oder kann man die Normalenvektoren doch irgendwie noch aus dem VB lesen? _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.09.2004, 22:30 Titel: |
|
|
Code: | inline D3DXVECTOR3 GetPlaneNormal(D3DXVECTOR3 k,D3DXVECTOR3 j,D3DXVECTOR3 l)
{
D3DXVECTOR3 ret;
double ax = k.x-j.x;
double ay = k.y-j.y;
double az = k.z-j.z;
double bx = l.x-j.x;
double by = l.y-j.y;
double bz = l.z-j.z;
ret.x = ay*bz - az*by;
ret.y = az*bx - ax*bz;
ret.z = ax*by - ay*bx;
//normalize
return NormalizeVector(ret);
} |
Code: |
struct VERTEX { D3DXVECTOR3 p, n; FLOAT tu; FLOAT tv; }; //Nurn Beispiel
WORD* pIndices;
VERTEX* pVertices;
pIB->Lock( 0,0,(void**)&pIndices, 0 );
pVB->Lock( 0,0,(void**)&pVertices, 0 );
D3DXVECTOR3 n0 = pVertices[pIndices[3*i+0]].normal;
D3DXVECTOR3 n1 = pVertices[pIndices[3*i+1]].normal;
D3DXVECTOR3 n2 = pVertices[pIndices[3*i+2]].normal;
D3DXVECTOR3 planeNormal=GetPlaneNormal(n1, n2, n3); //hier die PlaneNormale berechnen
|
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 08.09.2004, 22:38 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: |
D3DXVECTOR3 n0 = pVertices[pIndices[3*i+0]].normal;
D3DXVECTOR3 n1 = pVertices[pIndices[3*i+1]].normal;
D3DXVECTOR3 n2 = pVertices[pIndices[3*i+2]].normal;
|
Hab gedacht, das würd nicht so einfach gehen, weil da son Writeonly modus drin ist. Aber wenn das alles ist... _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.09.2004, 22:40 Titel: |
|
|
LeeDiGer hat Folgendes geschrieben: | Hab gedacht, das würd nicht so einfach gehen, weil da son Writeonly modus drin ist. Aber wenn das alles ist... |
Oh das wusste ich nicht, einfach mal probieren was passiert. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 08.09.2004, 23:26 Titel: |
|
|
Naja, mehr oder weniger. Aber scheint zumindest keine Fehlermeldung zu geben. Ich muss nochmal, gucken was es mit dem Writeonlymodus auf sich hatte.
Edit:
Hat nur geklappt, weil ich die Vertizes in einem Temporären Array
erstmal berechnet hab und dann erst später an den VB übergeben hab. Tja. Also muss ich irgendwie den Leseschutz entfernen. Aber es soll ja anschließen die Geschwindigkeit ein wenig drunter leiden. ALternativ könnt ich natürlich die Normalenvektoren doch in einem Array zwischenspeichern. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 09.09.2004, 20:47 Titel: |
|
|
Zur läuft den VB locken, halte ich keine gute Idee. Lege lieber eine Kopie der Geometrie(oder zumindest ein Array mit den normals, die irgendwie zuordnen kannst) im Arbeitsspeicher an. Das ist erstens einfacher zu verwalten(finde ich) und es sollte performanter sein. |
|
Nach oben |
|
 |
|