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

Aktuelle Zeit: Di Mai 21, 2024 13:18

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalen berechnen
BeitragVerfasst: Mi Aug 08, 2007 00:21 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 20
Ich habe eine Liste von Punkten die ich mit GL_TRIANGLE_STRIP rendere. Dafür möchte ich die Normalen berechnen.

Die Normlaen werden aber nicht richtig berechnet.
Ich vermutet das es was mit der Rcihtung des Senkrechten Vektors zu tun hat.
Code:
  1.   for i := 0 to MeshPointList.Count - 1 do
  2.   begin
  3.     MeshPoint := TMeshPoint(MeshPointList.items[i]);
  4.     if (i>0) and (i<MeshPointList.Count-1) then
  5.     begin
  6.       Vektor2.x := TMeshPoint(MeshPointList.items[i+1]).point.x-MeshPoint.point.x;
  7.       Vektor2.y := TMeshPoint(MeshPointList.items[i+1]).point.y-MeshPoint.point.y;
  8.       Vektor2.z := TMeshPoint(MeshPointList.items[i+1]).point.z-MeshPoint.point.z;
  9.  
  10.       Vektor1.x := TMeshPoint(MeshPointList.items[i-1]).point.x-MeshPoint.point.x;
  11.       Vektor1.y := TMeshPoint(MeshPointList.items[i-1]).point.y-MeshPoint.point.y;
  12.       Vektor1.z := TMeshPoint(MeshPointList.items[i-1]).point.z-MeshPoint.point.z;
  13.     end;
  14.     if (i=0) then
  15.     begin
  16.       Vektor2.x := TMeshPoint(MeshPointList.items[MeshPointList.Count-1]).point.x-MeshPoint.point.x;
  17.       Vektor2.y := TMeshPoint(MeshPointList.items[MeshPointList.Count-1]).point.y-MeshPoint.point.y;
  18.       Vektor2.z := TMeshPoint(MeshPointList.items[MeshPointList.Count-1]).point.z-MeshPoint.point.z;
  19.  
  20.       Vektor1.x := TMeshPoint(MeshPointList.items[i+1]).point.x-MeshPoint.point.x;
  21.       Vektor1.y := TMeshPoint(MeshPointList.items[i+1]).point.y-MeshPoint.point.y;
  22.       Vektor1.z := TMeshPoint(MeshPointList.items[i+1]).point.z-MeshPoint.point.z;
  23.     end;
  24.     if (i=MeshPointList.Count-1) then
  25.     begin
  26.       Vektor2.x := TMeshPoint(MeshPointList.items[0]).point.x-MeshPoint.point.x;
  27.       Vektor2.y := TMeshPoint(MeshPointList.items[0]).point.y-MeshPoint.point.y;
  28.       Vektor2.z := TMeshPoint(MeshPointList.items[0]).point.z-MeshPoint.point.z;
  29.  
  30.       Vektor1.x := TMeshPoint(MeshPointList.items[i-1]).point.x-MeshPoint.point.x;
  31.       Vektor1.y := TMeshPoint(MeshPointList.items[i-1]).point.y-MeshPoint.point.y;
  32.       Vektor1.z := TMeshPoint(MeshPointList.items[i-1]).point.z-MeshPoint.point.z;
  33.     end;
  34.     MeshPoint.Normale := Vektor(
  35.                  (Vektor1.y*Vektor2.z-Vektor1.z*Vektor2.y),
  36.                  (Vektor1.z*Vektor2.x-Vektor1.x*Vektor2.z),
  37.                  (Vektor1.x*Vektor2.y-Vektor1.y*Vektor2.x));
  38.  
  39.   end;



Test objekt:
Code:
  1.   Mesh.addMeshPoint(Vektor(20,0,0));
  2.   Mesh.addMeshPoint(Vektor(20,20,0));
  3.   Mesh.addMeshPoint(Vektor(0,0,0));
  4.   Mesh.addMeshPoint(Vektor(0,20,0));
  5.   Mesh.addMeshPoint(Vektor(-20,20,0));
  6.   Mesh.addMeshPoint(Vektor(-20,2*20,0));


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 08, 2007 10:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi, probiers mal hiermit ;)

Code:
  1. for i := 0 to MeshPointList.Count - 1 do
  2. begin
  3.   case i of
  4.     0                       : Begin m :=  0; n := 3; End;
  5.     MeshPointList.Count - 1 : Begin m := -3; n := 0; End;
  6.     else                    : Begin m :=  0; n := 0; End;
  7.   end;
  8.  
  9.   MeshPoint := TMeshPoint(MeshPointList.items[i]);
  10.   Vektor1.x := TMeshPoint(MeshPointList.items[i+1+m]).point.x-MeshPoint.point.x;
  11.   Vektor1.y := TMeshPoint(MeshPointList.items[i+1+m]).point.y-MeshPoint.point.y;
  12.   Vektor1.z := TMeshPoint(MeshPointList.items[i+1+m]).point.z-MeshPoint.point.z;
  13.  
  14.   Vektor2.x := TMeshPoint(MeshPointList.items[i-1+n]).point.x-MeshPoint.point.x;
  15.   Vektor2.y := TMeshPoint(MeshPointList.items[i-1+n]).point.y-MeshPoint.point.y;
  16.   Vektor2.z := TMeshPoint(MeshPointList.items[i-1+n]).point.z-MeshPoint.point.z;
  17.  
  18.   MeshPoint.Normale := Vektor((Vektor1.y*Vektor2.z-Vektor1.z*Vektor2.y),
  19.                               (Vektor1.z*Vektor2.x-Vektor1.x*Vektor2.z),
  20.                               (Vektor1.x*Vektor2.y-Vektor1.y*Vektor2.x));
  21. end;


Ist deine Lösung nur ein bisschen vereinfacht (hoffentlich ohne Denkfehler :? ).
Schau dir mal das Bild von GL_TRIANGLE_STRIP im Wiki an.

Dein Fehler:
Du holst dir bei i=0 den letzten Vertex in der Liste -> musst aber nur den nächsten (i+1) und übernächsten (i+2) nehmen.
Bei i=Ende nimmst du dir den ersten in der Liste -> musst aber den vorherigen (i-1) und den vorvorherigen (i-2) nehmen.

Das Kreuzprodukt habe ich mitr nicht näher angeschaut... hoffe das stimmt so ;)

Auf das nicht alles Unsinn war, was ich geschriben haben,
Gruß, Matreno

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 08, 2007 11:42 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das mit den i, i+1 etc steht auch schön erklärt im Artikel glBegin.
Der Artikel ist nicht umsonst einer der exzellenten. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 08, 2007 18:04 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 20
Man muss wohl zwischen gerade und ungerade unterscheiden. Ob das so richtig ist weiß ich allerdings immer noch nicht.
Code:
  1.  
  2.   for i := 0 to MeshPointList.Count - 1 do
  3.   begin
  4.     MeshPoint := TMeshPoint(MeshPointList.items[i]);
  5.     if (i>0) and (i<MeshPointList.Count-2) then
  6.     begin
  7.       if i mod 2 = 0 then
  8.       begin
  9.         index1 := i-1;
  10.         index2 := i+1;
  11.       end
  12.       else
  13.       begin
  14.         index1 := i+2;
  15.         index2 := i+1;
  16.       end;
  17.     end;
  18.     if i=0 then
  19.     begin
  20.         index1 := i+1;
  21.         index2 := i+2;
  22.     end;
  23.     if (i=MeshPointList.Count-2) then
  24.     begin
  25.       if i mod 2 = 0 then
  26.       begin
  27.         index1 := i-1;
  28.         index2 := i+1;
  29.       end
  30.       else
  31.       begin
  32.         index1 := i-1;
  33.         index2 := i-2;
  34.       end;
  35.     end;
  36.     if (i=MeshPointList.Count-1) then
  37.     begin
  38.       if i mod 2 = 0 then
  39.       begin
  40.         index1 := i-2;
  41.         index2 := i-1;
  42.       end
  43.       else
  44.       begin
  45.         index1 := i-1;
  46.         index2 := i-2;
  47.       end;
  48.     end;
  49.  
  50.     Vektor1.x := TMeshPoint(MeshPointList.items[index1]).point.x-MeshPoint.point.x;
  51.     Vektor1.y := TMeshPoint(MeshPointList.items[index1]).point.y-MeshPoint.point.y;
  52.     Vektor1.z := TMeshPoint(MeshPointList.items[index1]).point.z-MeshPoint.point.z;
  53.  
  54.     Vektor2.x := TMeshPoint(MeshPointList.items[index2]).point.x-MeshPoint.point.x;
  55.     Vektor2.y := TMeshPoint(MeshPointList.items[index2]).point.y-MeshPoint.point.y;
  56.     Vektor2.z := TMeshPoint(MeshPointList.items[index2]).point.z-MeshPoint.point.z;
  57.  
  58.     MeshPoint.Normale := Vektor(
  59.                  (Vektor1.y*Vektor2.z-Vektor1.z*Vektor2.y),
  60.                  (Vektor1.z*Vektor2.x-Vektor1.x*Vektor2.z),
  61.                  (Vektor1.x*Vektor2.y-Vektor1.y*Vektor2.x));
  62.  
  63.   end;
  64. end;
  65.  


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.009s | 14 Queries | GZIP : On ]