Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 02, 2025 07:17

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normale berechnen
BeitragVerfasst: Do Jul 19, 2012 01:37 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
In diesem Tutorial http://wiki.delphigl.com/index.php/Normale fehlt mir leider das Entscheidene

Zitat:
Wenn man nun die Normale eines Dreiecks berechnen will geht man folgenermaßen vor:

Einen Eckpunkt als Bezugspunkt (P0) wählen.
Die beiden Vektoren v1 = P1-P0 und v2 = P2-P0 bestimmen.
Diese beiden Kreuzmultiplizieren v1 X v2. (steht in jedem Tafelwerk unter Kreuzprodukt)
Das Ergebnis hat schonmal die richtige Richtung. (Für OpenGl reicht das.)


Und zwar der wo es nicht nur für OpenGL reichen sollte...

Ich berechne ein Objekt aus Externen Daten und möchte dieses in ein OBJ für die weiterverarbeitung speichern lassen, klappt soweit auch gut, nur bei den Normalen bin ich unsicher, wie oben beschrieben waren die 'vorschau Ergebnisse' in OpenGL mit Licht und CullFace richtig dargestellt, aber wenn ich mein Objekt
mit 150k+ Triangles berechne springen da nur ein paar Normale Vectoren bei raus...
die in etwa alle (0,0,-1) oder eben (0,0,1) sind...

Wie verrechne ich das korrekt mit den Vertices für OpenGL und für andere 3D Programme?

Meine Funktion zum berechnen der Normalen sieht so aus (FreeBASIC, berechnung sollte aber verständlich sein)
Code:
  1.  
  2. Sub CalcNormal(byval InX1 as Single, byval InY1 as Single, byval InZ1 as Single, _
  3.                byval InX2 as Single, byval InY2 as Single, byval InZ2 as Single, _
  4.                byval InX3 as Single, byval InY3 as Single, byval InZ3 as Single, _
  5.                byref OutX as Single, byref OutY as Single, byref OutZ as Single)
  6.    
  7.    Dim as Single Qx, Qy, Qz, Px, Py, Pz, Nx, Ny, Nz, f
  8.    
  9.  
  10.    Qx = InX2-InX1 : Qy = InY2-InY1 : Qz = InZ2-InZ1
  11.    Px = InX3-InX1 : Py = InY3-InY1 : Pz = InZ3-InZ1
  12.  
  13.    Nx = ((Py * Qz) - (Pz * Qy)) : Ny = ((Pz * Qx) - (Px * Qz)) : Nz = ((Px * Qy) - (Py * Qx))
  14.    
  15.    f = 1 / sqr((Nx*Nx)+(Ny*Ny)+(Nz*Nz))
  16.    
  17.    OutX = f*Nx : OutY = f*Ny : OutZ = f*Nz
  18. End Sub
  19.  

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normale berechnen
BeitragVerfasst: Do Jul 19, 2012 10:13 
Offline
DGL Member

Registriert: Sa Mär 31, 2012 23:14
Beiträge: 26
Programmiersprache: PASCAL
ich nehme einfach mal an das sqr() zum Quadrieren gut ist): Es müsste sqrt(x*x+y*y+z*z) heißen, sonst dürfte die errechnete Normale recht selten normal sein. (Falls du mit GL_NORMALIZE arbeitest macht das keinen Unterschied)
So müsste es dann für alle Grafikbibliotheken reichen (Es muss ||n|| = 1.0 sein um das Licht korrekt zu berechnen).

_________________
The force, strong it is in OpenGL.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normale berechnen
BeitragVerfasst: Do Jul 19, 2012 14:56 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
sqr(FreeBASIC) sollte das selbe sein wie sqrt(C/CPP)

Zitat:
Syntax: SQR(Wert)
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt die Quadratwurzel (square root) von 'Wert' aus. SQR hat dieselbe Funktion wie Wert^(1/2).


...müsste daher alles seine richtigkeit haben?!

Dem Problem auf der Spur...
Mein Objekt ist momentan ein Flat-Objekt (alle Z Werte = 0.0f)

Dadurch ergibt bei meiner Funktion die Berechnung von Nx und Ny immer 0:

Code:
  1.  
  2. Nx = ((Py * Qz) - (Pz * Qy))
  3. Ny = ((Pz * Qx) - (Px * Qz))
  4.  


Das müsste der falsche teil sein ?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normale berechnen
BeitragVerfasst: Do Jul 19, 2012 15:50 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
sqr(wert) = square = wert² = wert * wert

sqrt(wert) = square root = wurzel(wert) (square hier deswegen, weil es die 2te wurzel ist)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normale berechnen
BeitragVerfasst: Do Jul 19, 2012 16:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
phlegmatiker hat geschrieben:
sqr(wert) = square = wert² = wert * wert

sqrt(wert) = square root = wurzel(wert) (square hier deswegen, weil es die 2te wurzel ist)

Den ausschnitt aus der Hilfe den er gepostet hat, hast du aber gelesen - ja?

EternalPain hat geschrieben:
Dem Problem auf der Spur...
Mein Objekt ist momentan ein Flat-Objekt (alle Z Werte = 0.0f)

In dem falle ist es doch korrekt das die Normalen immer (0/0/1) bzw (0/0/-1) sind?

Aya


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normale berechnen
BeitragVerfasst: Do Jul 19, 2012 16:34 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
hm.. vermutlich scheint mir etwas über das verstehen einer normale zu entgehen aber ich denke, wenn ich eine normale per fläche/dreieck errechnen möchte sollte sich diese nicht auch in der fläche befinden?

Bild

so in etwa denke ich mir das (blau=dreieck, rot=dreieck-vertices, gelb=gedachte-normale), das Z -1 bzw 1 ist mag ja ok sein, aber X und Y kann nicht null sein wenn ein dreieck meinetwegen im X bereich -100,-101 oder so liegt?!

Derzeit betrachte ich mein errechnetes ergebnis mit C4D, und wenn ich mein Objekt rendere ist meistens die hälfte nicht zu sehen weil es nicht beleuchtet wird...

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normale berechnen
BeitragVerfasst: Do Jul 19, 2012 17:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Die Normale hat nichts mit der Position des Dreiecks zu tun wie du es denkst. Die Normale ist ein Richtungsvektor - und wenn alle deine Dreiecke in die selbe Richtung ausgerichtet sind, ist auch die Normale bei allen gleich.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normale berechnen
BeitragVerfasst: Do Jul 19, 2012 17:46 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Dann hatte ich wohl doch ein Verständnisproblem bei den Normalen, also haben alle meine Dreiecke nur eine einzige Normale? Dann war das ganze ja eigentlich schon (fast) richtig.
Jetzt hab ich das einfach mal so getestet... und ausser das er mir die falsche richtung ausspuckte scheints endlich zu funktionieren wie es soll...

habe OutZ nun mal durch OutZ = -f*nZ ersetzt

hoffe das es dann auch stimmt wenn ich mal dreiecke habe die nicht die selbe tiefe haben?!

die Vectoren übergebe ich nach regeln des Backface-Culling, je nachdem ob es vorder oder rückseite ist Clockwise bzw Counterclockwise

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 17 Queries | GZIP : On ]