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

Aktuelle Zeit: Mi Jul 09, 2025 20:11

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fächennormale aus Tutorial
BeitragVerfasst: Fr Apr 23, 2004 14:07 
Offline
DGL Member

Registriert: Fr Dez 12, 2003 17:30
Beiträge: 6
Wohnort: Hanau
Hi @ all!

Bin noch recht neu was OpenGL angeht, aber wirklich fasziniert!

Ich nutze den OpenGL12-Header und die Textures.pas von www.koshigaya.de und initialisiere auch delphi mit hilfe des codes aus dem tutorial!
Nun habe ich mich mal an die Tuts hier auf der Seite gewagt und hänge nun beim Heightmap-Tutorial fest!
Mein Problem war, dass er bei mir nirgends den Typ TVertex (habe auch die Geometry.pas von der SDK hier auf der Seite)
Deshalb habe ich als Datentyp TVertex genommen, weil ich mir gedacht habe, dass das ähnlich sein könnte. Nun geht der Code an einer Stelle, wo ich die Flächennormale berechnet so:
Code:
  1.  
  2. Normale := VectorCrossProduct(
  3.                  VectorSubtract(Vertieces[V1], Vertieces[V2]),
  4.                  VectorSubtract(Vertieces[V2], Vertieces[V3]));
  5.  


Vector Subtract funktioniert auch - gibt aber als Typ THomogeneousFltVector zurück und VectorCrossProduct erwartet TAffineFltVector - das gibt natürlich einen Fehler! ^^

Nun ist meine Frage, wie kann ich THomogeneousFltVector in einen TAffineFltVector umwandeln, oder zumindest wie sieht der Datentyp TVertex aus ?

Danke für eure Hilfe!!!

_________________
Greetz Daniel
--------------------------------
"Be careful - you never get a
second chance for your first
impression!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 23, 2004 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dann mach das Vektorkreuzprodukt eben selber, das sieht nämlich so aus :
Code:
  1. x := (V1.y*V2.z) - (V1.z*V2.y);
  2. y := (V1.z*V2.x) - (V1.x*V2.z);
  3. z := (V1.x*V2.y) - (V1.y*V2.x);
  4.  

Bei genauer Betrachtung sollte der Begriff "Kreuzprodukt" direkt klar werden.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 23, 2004 16:18 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
hmm... im tutorial steht doch genau drin, welche geometry.pas verwendet werden soll und wo sie zu bekommen ist. und die typen, die TVertex dort darstellt ist ein array[0..2] of glfloat und müsste demnach ein TAffineFltVector sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 23, 2004 19:12 
Offline
DGL Member

Registriert: Fr Dez 12, 2003 17:30
Beiträge: 6
Wohnort: Hanau
Ich habe es versucht, eure beiden Vorschläge zusammenzubringen und auch einzeln auszoprobieren. Auch nach einiger Anpassung gab es immer wieder Typenfehler!

Jetzt habe ich mir gedacht, dass ich ja eigentlich um eine Heightmap zu erstellen nur jeweils die Höhe in Form des Weiß-Anteils auslesen muss, die Ordne ich dann den jeweiligen Koordinaten zu. Dann erzeuge ich an jedem Punkt vier Vertieces (der Punkt selbst, einer rechts davon, einer darunter und rechts-darunter [ in X-Z - Perspektive]) und erzeuge jeweils zwei Dreiecke wie im Tutorial.

Ich habe das nun alles so von "Hand" gemacht und auch die Triangles scheinen mir stimmen zu können (also die Anzahl) nur sehe ich überhaupt nichts! Ich habe nun auch so eingestellt, dass die Höhe immer -2 ist, aber trotzdem nichts!

Das fiese (für mich als Anfänger) ist, dass er mir keine Fehler nennt, an denen ich mich orientieren kann.

Habe das gesamt projekt mal im Anhang!


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Greetz Daniel
--------------------------------
"Be careful - you never get a
second chance for your first
impression!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 24, 2004 09:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
So sehr ich es auch versucht habe zu verstehen, was du eigentlich getan hast. Dieser Code hier macht überhaupt keinen Sinn, da du die Werte in Vertices[I] immer wieder durch die Schleifen in denen du j und k veränderst, überschreibst.

Code:
  1.  
  2.     for I := 0 to 3 do
  3.       begin
  4.         for J := 0 to 1 do
  5.           begin
  6.             for K := 0 to 1 do
  7.             begin
  8.               Vertieces[I].x := (X + J)/MapResolution*MapSize;
  9.               Vertieces[I].z := (Z + K)/MapResolution*MapSize;
  10.               Vertieces[I].y := -2;(*+(MapDaten[X + J,Z + K]*0.002);*)
  11.             end;
  12.           end;
  13.         end;
  14.         PaintTriangle(0,1,3);
  15.         PaintTriangle(1,2,3)


Verwende doch den Code so, wie es Delphic im Tutorial zeigt!

Code:
  1.  
  2.      for I := 0 to 3 do
  3.         begin
  4.           Vertieces[I].x := (X + VertPos[I][0])/MapResolution*MapSize;
  5.           Vertieces[I].z := (Z + VertPos[I][1])/MapResolution*MapSize;
  6.           Vertieces[I].y := MapDaten[X + VertPos[I][0],Z + VertPos[I][1]]
  7.         end;
  8.        PaintTriangle(0,1,3);
  9.        PaintTriangle(1,2,3)



Anschließend musst du deine Karte nur noch so verschieben, dass sich die „Kamera“ im Mittelpunkt der Karte befindet.

glTranslatef(-(MapSize div 2), -200, -(MapSize div 2));

Letzten Endes wäre es noch zu empfehlen, die Far-Clipping-Plane etwas weiter weg zu schieben, damit du auch die ganze Karte sehen kannst.

gluPerspective(45,Width/Height,1,10000);

Nun sollte der Code funktionieren.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 24, 2004 10:03 
Offline
DGL Member

Registriert: Fr Dez 12, 2003 17:30
Beiträge: 6
Wohnort: Hanau
Danke für deine Hilfe!

jetzt sehe ich immerhin, dass etwas gezeichnet wurde! Allerdings sehe ich ohne licht alles weiß und mit licht nur den linken rand!

Ich denke, dass es an den Normalen liegt, wo anfangs mein problem lag, denn im Tutorial steht ja, dass die für eine halbwegs realistische Darstellung des lichts gebraucht werden. Ich habe bei mir jedoch keine Normalen drin, da ich einerseits nichts damit anfangen kann(weiß nicht was normalen sind und was sie wirklich bringen) und anderseits auch keine ahnung hätte wo ich sie einbauen sollte.

Meine Fragen sind also:

- Was sind eigentlich Normalen und was bewirken sie?
- Kann o.g. Problem daher kommen, dass ich keine Normalen berechnet habe?
- Wenn ja, wo muss ich sie einfügen und wie berechne ich sie?
- Wenn nein, woran kann es sonst noch liegen?


Sorry, dass ich so viele (vermutlich teilweise für euch simple) Fragen stelle, aber ich bin wiegesagt erst anfänger.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Greetz Daniel
--------------------------------
"Be careful - you never get a
second chance for your first
impression!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 24, 2004 12:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Normalen sind im allgemeinen Geraden oder Vektoren, die senkrecht zu irgendetwas (z.B. zu Geraden oder Flächen) stehen.
In unserem Fall sind Richtungsvektoren gemeint, die senkrecht zu einer Fläche stehen.

Die OpenGL benötigt die Normalen für die korrekte Darstellung des Lichtes. Normalenvektoren kannst du mit Hilfe von glNormal3* an die OpenGL übergeben.
Am besten du schaust dir mal das Tutorial auf dieser Seite zum Thema Beleuchtung an.

Die Normalen auf die Flächen berechnest du am besten über das Vektorkreuzprodukt.
Die genaue Berechnung haben Son of Satan und Delphic bereits gepostet.

Um bei der Beleuchtung ein noch besseres Ergebnis zu erzielen, kannst du die Normalen auch für jeden Vertex einzeln berechnen und übergeben.
Den Normalenvektor auf einen Vertex ermittelst du am besten indem du die Normalenvektoren der Flächen, die durch den Vertex gebildet werden, mittelst.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 26, 2004 14:30 
Offline
DGL Member

Registriert: Fr Dez 12, 2003 17:30
Beiträge: 6
Wohnort: Hanau
Wirklich vielen Dank für eure Hilfe soweit!

Bis jetzt kann ich auch soweit einiges sehen und würde es teilweise auch als Landschaft erkennen. Nur ist noch das Problem, dass je nach sichtposition manche Dreiecke nicht sichtbar sind
Bild
und aus anderer Position doch.
Bild
Dazu reicht auch nur die Rotation zu verändern. Liegt das vielleicht auch noch an den Normalen?

Wie kann ich denn jetzt genau die Normalen für einen Vektor berechnen? Bei mir liegen ja an jedem Vektor zwei Dreiecke - soll ich jetzt immer im voraus die Dreiecks-Normalen der Dreiecke für diesen Vektor berechnen und dann den Mittelwert nehmen? Das wäre dann nämlich ziemlich viel!

_________________
Greetz Daniel
--------------------------------
"Be careful - you never get a
second chance for your first
impression!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 26, 2004 14:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
@Sichtbarkeit der Flächen :
Ob Flächen sichtbar bzw. unsichtbar sind sollte eigentlich unabhängig von deiner Rotation oder Bewegung sein. Wenn dies nicht der Fall ist, dann machst du wohl einen Fehler bei der Angabe der Position deiner Lichtquelle, und rotierst bzw. verschiebst diese (ungewollt) mit deiner Betrachterposition. Stell also sicher das dies nicht der Fall ist, dann sollte auch dieses Problem nicht auftreten.

@Vertexnormalen :
Wenn du korrekt und damit weiche Normalen willst, bleibt dir nichts anderes als die von dir angedeutete Möglichkeit. Zuerst berechnest du für alle Dreicke die Normalen (anhand ihrer Eckpunkte). Dann musst du prüfen welche Dreiecke sich einen Eckpunkt teilen, und dann ggf. die Normalen addieren, bevor du dann diese Normale am Ende wieder normalisierst um die Vertexnormale zu bekommen. Konkret an nem Beispiel sieht das dann z.B. so aus :
- Vertex Y gehört zu Dreieck A, B, C und D
- Vertexnormale von Vertex Y = NormalisiereVektor(A.Normale+B.Normale+C.Normale+D.Normale)
Um diese Schritte wirst du leider nich herumkommen. Wenn du dein Terrain so renderst, das jedes Dreiecke seine eigenen drei Eckpunkt hast wird das etwas komplizierter und dauert auch länger. Aber bei einem Mesh wie einem zusammenhängendem Terrain würde ich dir empfehlen auf ein Indexarray umzusteigen. Du speicherst also eine Liste aller Punkte eines Terrains ab (das sind dann also (Terrain)Höhe*Breite Eckpunkte) und weist dann deinen Dreiecken nicht direkt Eckpunkte zu, sondern nur Indizes auf die Eckpunkte. So weisst du dann das Dreieck A,B,C und D jeweils ein Vertex mit dem Index Z besitzen und musst nicht erst umständlich prüfen ob ein Vertex von Dreieck A gleich einem Vertex von Dreieck B, usw.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 26, 2004 14:54 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nicht pro Vektor sondern pro Vertex hat magelan geschrieben.

An jedem Vertex liegen doch 4(?) Dreiecke an. Um die normale für den Vertex zu berechnen, musst du dann nur den Mittelwert aus den Normalen der anliegenden Dreiecke bilden.

Ich hoffe ich hab jetzt nix verkehrtes erzählt, aber das ist was mit dazu einfällt.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 26, 2004 15:35 
Offline
DGL Member

Registriert: Fr Dez 12, 2003 17:30
Beiträge: 6
Wohnort: Hanau
@ SoS: ich habe dem licht eigentlich überhauptnichts zugewiesen! Ich habe einfach das "licht" mit glEnable(GL_LIGHTING) "angeschaltet" und dann mit glEnable(GL_LIGHT0) eine Lichtquelle erzeugt.

Da ich an einer Krankheit namens "Jugendlicher Tatendrang" leide habe ich das Tutorial zu licht auch nur durchgelesen und nicht durchgearbeitet, da es mir zu theoretisch schien. Werde mich jetzt aber wohl mal genauer damit beschäftigen (müssen).

@ Sos & Flash: Danke für eure Hilfen! Hatte mich auch noch verlesen! *g*
Werde, sobald ich mal wieder die richtige Lust und Laune habe mal daran setzen das umzusetzen!

_________________
Greetz Daniel
--------------------------------
"Be careful - you never get a
second chance for your first
impression!"


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.017s | 17 Queries | GZIP : On ]