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

Aktuelle Zeit: Fr Jul 18, 2025 12:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: wieder mal normale...
BeitragVerfasst: Mo Mär 28, 2005 16:23 
Offline
DGL Member

Registriert: So Nov 16, 2003 14:37
Beiträge: 37
Tut mir leid wenn ich das Thema wieder mal anschneide, aber ich hab echt Probleme beim berechnen weicher Normale! Ich hab das Forum bereits durchforstet und hab das was ich gefunden habe auch versucht umzusetzen. Flächennormale funzen ohne Probleme, aber wenn ich versuche mein Programm weiche Normale berechnen zu lassen braucht es erstens elends lang um zu starten und zweitens sieht das Modell zuerst so aus als würde es nicht beleuchtet werden, aber dann beginnt es plötzlich zu flackern.

Hier mein Code:

Code:
  1.  
  2. procedure T3DXMesh.CalcVertexNormals;
  3. var
  4. i, j,
  5. matches   :integer;
  6. vnormal,
  7. tmpnormal :TSimple3DVector;
  8. length    :single;
  9. begin
  10. CalcFaceNormals;
  11. SetLength(VertexNormals, FVertexCount);
  12.  
  13. matches:=0;
  14. vnormal.x:=0;
  15. vnormal.y:=0;
  16. vnormal.z:=0;
  17.  
  18. for i:=0 to High(Vertices) do  //iterate through all vertices
  19.   begin
  20.   for j:=0 to High(Vertices) do   //and compare them...
  21.     begin
  22.     if (Vertices[j].x = Vertices[i].x) and
  23.        (Vertices[j].y = Vertices[i].z) and
  24.        (Vertices[j].z = Vertices[i].z) then
  25.       begin
  26.       if Vertices[j].normal <> nil then tmpnormal:=Vertices[j].normal^
  27.       else tmpnormal:=Vertices[Vertices[j].nindex].normal^;
  28.  
  29.       vnormal.x:=vnormal.x + tmpnormal.x;
  30.       vnormal.y:=vnormal.y + tmpnormal.y;
  31.       vnormal.z:=vnormal.z + tmpnormal.z;
  32.       inc(matches);
  33.       end;
  34.     end;
  35.   vnormal.x:=vnormal.x / matches;
  36.   vnormal.y:=vnormal.y / matches;
  37.   vnormal.z:=vnormal.z / matches;
  38.  
  39.   length:=sqrt((sqr(vnormal.x)+sqr(vnormal.y)+sqr(vnormal.z)));
  40.   vnormal.x:=vnormal.x / length;
  41.   vnormal.y:=vnormal.y / length;
  42.   vnormal.z:=vnormal.z / length;
  43.  
  44.   VertexNormals[i]:=vnormal;
  45.   Vertices[i].normal:=@VertexNormals[i];
  46.  
  47.   matches:=0;
  48.   vnormal.x:=0;
  49.   vnormal.y:=0;
  50.   vnormal.z:=0;
  51.   end;
  52. end;
  53.  


Im Anhang ist der komplette Source meines Progs zu finden. Der Codeausschnitt von oben ist in der Datei gl3dx.pas ;) zu finden.


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 28, 2005 16:53 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Glaub nicht, dasses daran liegt, aber wenn die Vertices[].x/y/z single werte sind, solltest du die nicht mit "=" vergleichen, aufgrund von Rundungsfehlern etc, weil ja auch wenn nur die 5. Stelle hinterm Komma unterschiedlich sind, sind die beiden ja dann trotzdem unterschiedlich, also solltest du dir einen Bereich wählen, die die Werte voneinander abweichen können.

//edit
Die Matches Variable solltest du immer am Beginn der ersten Zählschleife nullsetzen, also

[...]
for i:=0 to High(Vertices) do //iterate through all vertices
begin
Matches := 0;
[...]

//edit2
Das gleiche mit vnormal..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 28, 2005 17:11 
Offline
DGL Member

Registriert: So Nov 16, 2003 14:37
Beiträge: 37
Hmm, ich hab deine Tips mal eingebaut, bekomme das flackern aber trotzdem nicht weg... Ich versteh nicht woran das liegt. Langsam verzweifel ich echt daran. :cry:

Edit: Was mir auch so seltsam erscheint, ist die lange Zeit, die das Prog braucht um die Normalen zu berechnen...
Edit2: Hab mal die Lichtposition verändert, jetzt ist das flackern mal weg, das Prog ist aber weiterhin verdammt langsam...

Edit3: Hab mir mal den Vertexcount angesehen: 36501 :shock: , das muss sich doch optimieren lassen, aber das ist glaub ich eine andere Geschichte ;) . Ich hab mal den ersten Post auf den aktuellen Stand gebracht, wer irgendwas findet - büdde Posten!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 28, 2005 23:32 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Zitat:
if (Vertices[j].x = Vertices[i].x) and
(Vertices[j].y = Vertices[i].z) and
(Vertices[j].z = Vertices[i].z) then

Ich halte das für einen Fehler... Und man sollte normalen eventuell nur miteinander kombinieren, wenn der zwischen ihnen liegende winkel nicht zu groß ist - sonst werden nämlich auch kanten aalglatt und wenn du mal ein doppelseitiges face hast, ist das evtl auch nicht so toll... (punktprodukt verwenden?)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 00:33 
Offline
DGL Member

Registriert: So Nov 16, 2003 14:37
Beiträge: 37
Öha... doofer Fehler!! Danke, ich glaub den hääte ich selbst nicht bemerkt. Hab schon öfter was vom Punktprodukt gehört, gibts dazu irgendwelche empfehlenswerte Artikel??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 09:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Aber natüüürlich, sogar aus unserem Hause ;) :
http://www.delphigl.com/script/do_show.php?name=linearealgebra&action=2

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 11:33 
Offline
DGL Member

Registriert: So Nov 16, 2003 14:37
Beiträge: 37
Danke, war sehr aufschlussreich. In der Praxis heisst das dann das ich zuerst den Winkel zwischen den Normalen ausrechnen muss und wenn dieser kleiner als 90° ist, wird die Flächennormale zum Berechnen des Durchschnitts verwendet, ansonsten bleibt die Flächennormale bestehen - stimmt das so?? Und wie ist das mit den doppelseitigen Faces??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 11:39 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bei doppelseitigen Faces ist die Normale ja bis auf das Vorzeichen gleich. Du könntest also einfach das Vorzeichen wegwerfen und das damit mal versuchen.

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


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.008s | 16 Queries | GZIP : On ]