JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Normalenvektoren per Hand berechnen.
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 06.09.2004, 15:50    Titel: Normalenvektoren per Hand berechnen. Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 06.09.2004, 16:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 06.09.2004, 16:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 06.09.2004, 16:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beni5
Super JLI'ler


Alter: 36
Anmeldedatum: 12.11.2003
Beiträge: 310
Wohnort: Switzerland
Medaillen: Keine

BeitragVerfasst am: 06.09.2004, 16:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 07.09.2004, 01:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 07.09.2004, 22:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 08.09.2004, 15:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 08.09.2004, 16:46    Titel: Antworten mit Zitat

Das machst du natürlich bevor du den VB betankst!?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 08.09.2004, 20:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.09.2004, 22:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 08.09.2004, 22:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.09.2004, 22:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 08.09.2004, 23:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 09.09.2004, 20:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum