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

Aktuelle Zeit: Fr Jul 18, 2025 16:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalen berechnen
BeitragVerfasst: Do Feb 16, 2006 21:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also Leute ich brauch jetzt mal dringend moralische Unterstützung ;)

In Compuergrafik lernt man doch, dass bei Objektmanipulationen die Normalen nicht einfach mitrotiert werden können, sondern per transponierter invertierte Modelviewmatrix angegeben werden müssen.

Da mich das Ergebnis nicht sonderlich zufriedenstellt wollte ich mal nachfragen, ob ich was falsch gemacht habe.


Code:
  1. void Karussell::SolidCube(GLfloat length)
  2. {
  3.     float matrix[16];
  4.     float vec[4];
  5.     float* erg;
  6.    
  7.     glGetFloatv(GL_MODELVIEW_MATRIX,matrix);
  8.    
  9.     if (!MatrixInvert(matrix))
  10.     {
  11.         cerr << "!!Singuläre Modelviewmatrix gefunden!!";
  12.         return;
  13.     }
  14.     transposedMatrix(matrix);
  15.    
  16.     GLfloat e = length / 2;
  17.    
  18.     glBegin(GL_QUADS);
  19.       //Oben
  20.       vec[0]=0;vec[1]=1;vec[2]=0;vec[3]=1;
  21.       erg = MatVecProduct(matrix,vec);
  22.       glNormal3fv(erg);
  23.       delete[] erg;
  24.       glVertex3f(-e, e,-e);
  25.       glVertex3f(-e, e, e);
  26.       glVertex3f( e, e, e);
  27.       glVertex3f( e, e,-e);
  28.       //Unten
  29.       vec[0]=0;vec[1]=-1;vec[2]=0;vec[3]=1;
  30.       erg = MatVecProduct(matrix,vec);
  31.       glNormal3fv(erg);
  32.       delete[] erg;
  33.       glVertex3f(-e,-e,-e);
  34.       glVertex3f( e,-e,-e);
  35.       glVertex3f( e,-e, e);
  36.       glVertex3f(-e,-e, e);
  37.       //links
  38.       vec[0]=-1;vec[1]=0;vec[2]=0;vec[3]=1;
  39.       erg = MatVecProduct(matrix,vec);
  40.       glNormal3fv(erg);
  41.       delete[] erg;
  42.       glVertex3f(-e, e,-e);
  43.       glVertex3f(-e,-e,-e);
  44.       glVertex3f(-e,-e, e);
  45.       glVertex3f(-e, e, e);
  46.       //rechts
  47.       vec[0]=1;vec[1]=0;vec[2]=0;vec[3]=1;
  48.       erg = MatVecProduct(matrix,vec);
  49.       glNormal3fv(erg);
  50.       delete[] erg;
  51.       glVertex3f( e,-e,-e);
  52.       glVertex3f( e, e,-e);
  53.       glVertex3f( e, e, e);
  54.       glVertex3f( e,-e, e);
  55.       //vorn
  56.       vec[0]=0;vec[1]=0;vec[2]=1;vec[3]=1;
  57.       erg = MatVecProduct(matrix,vec);
  58.       glNormal3fv(erg);
  59.       delete[] erg;
  60.       glVertex3f(-e,-e, e);
  61.       glVertex3f( e,-e, e);
  62.       glVertex3f( e, e, e);
  63.       glVertex3f(-e, e, e);
  64.       //hinten
  65.       vec[0]=0;vec[1]=0;vec[2]=-1;vec[3]=1;
  66.       erg = MatVecProduct(matrix,vec);
  67.       glNormal3fv(erg);
  68.       delete[] erg;
  69.       glVertex3f(-e,-e,-e);
  70.       glVertex3f(-e, e,-e);
  71.       glVertex3f( e, e,-e);
  72.       glVertex3f( e,-e,-e);
  73.     glEnd();
  74. };



Im Bild kann man sehen, dass irgendwas nicht stimmt. Der kleine Würfel sieht aus als würde er von Unten Rechts beschienen, die Quadric sagt aber was anderes. Auch die "Arme" sehen seltsam aus.

Früher hatte ich die Normalen einfach so angegeben wie sie in "Vec" stehen. Da war das Ergebnis besser. Aber in den Anforderungen steht halt, bei einem Objekt die Normalen selber zu berechnen... :?


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

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 16, 2006 21:18 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Eventuell macht es sinn euch auch meine Mathefunktionen zu zeigen: -> Anhang


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

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 16, 2006 22:45 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Zitat:
In Compuergrafik lernt man doch, dass bei Objektmanipulationen die Normalen nicht einfach mitrotiert werden können, sondern per transponierter invertierte Modelviewmatrix angegeben werden müssen.


Wahrscheinlich redest du von was ganz anderem, aber geht es darum, dass die Objekte mit Matrizen verschoben und gedreht werden, und dass du jetzt irgendwie die Normalen auch Drehen musst? Also ich hab das hier nicht studiert, aber ich bin mir ziemlich sicher, dass man für die Normalen keine invers-transponierte Matrix braucht. Der Trick an der Sache ist, dass man die 4. Komponente (w) auf 0 lässt, so dass die Normalen nicht von der Translation beeinflusst werden. Und wenn man Skaliert, muss man sie nachher wieder normalisieren (was man bei OGL ja auch ein und ausschalten kann).

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 16, 2006 23:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Zitat:
Wahrscheinlich redest du von was ganz anderem, aber geht es darum, dass die Objekte mit Matrizen verschoben und gedreht werden, und dass du jetzt irgendwie die Normalen auch Drehen musst? Also ich hab das hier nicht studiert, aber ich bin mir ziemlich sicher, dass man für die Normalen keine invers-transponierte Matrix braucht. Der Trick an der Sache ist, dass man die 4. Komponente (w) auf 0 lässt, so dass die Normalen nicht von der Translation beeinflusst werden. Und wenn man Skaliert, muss man sie nachher wieder normalisieren (was man bei OGL ja auch ein und ausschalten kann).

Das macht gerade die inverse transponierte Matrix. Bei normalen Rotationsmatrizen ist das einfach die obere 3x3 Matrix, aber wenn eine Skalierung dabei ist, dann wird die Normale auch skaliert und ist falsch. Durch die Invertierung soll diese Skalierung ausgeglichen werden, aber durch nachträgliche Normalisierung geht es natürlich auch. Das Normalisieren ist natürlich prinzipiell dann eine aufwändigere Sache als nur mit der Matrix zu multiplizieren, aber das solle heutzutage kein Problem sein.
Bei GLSL gibt es auch direkt die gl_NormalMatrix, mit der man einfach alle Normalen multipliziert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 00:01 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Aber was mach ich denn nun falsch? Irgendwie sehen die Normalen ja nun nich so doll aus... :?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 00:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Vermutlich werden die normalen doppelt tranformiert. Einmal von dir und dann nochmal von OpenGL über die Modelview Matrix.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 10:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
LarsMiddendorf hat geschrieben:
Vermutlich werden die normalen doppelt tranformiert. Einmal von dir und dann nochmal von OpenGL über die Modelview Matrix.


Im Red Book steht dazu nur "You must also be careful that the modelview matrix transformation matrix does not scale the surface normal".
Kann man evlt, wenn man weis das skaliert wird, vor dem Setzen der Normalen (mit Push- und Pop Matrix) den Skalierungsfaktor in der Matrix immer auf 1 setzen.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 10:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
evtl. hilt dir da auch GL_RESCALE_NORMAL

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 13:41 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Aber wieso muss ich dann die aktion mit der Inversen Transponierten Modelviewmatrix durchziehen? Da könnte ich die doch auch einfach normalisieren, nachdem ich die transformiert habe.

Irgendwie versteh ich gerade Bahnhof. :?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 18:22 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
So wie ich das sehe kommt es darauf an, ob du skalierst oder nicht.
Wenn du nicht skalierst is es am einfachsten, dann kannst du die ganz normale Matrix nehmen. Musst nur darauf achten, dass die 4. Komponente der Normale 0 ist.
Wenn du Skalierst, dann wird etwas komplizierter. Dann kannst du entweder die normale Matrix verwenden (wieder darauf achten, dass w = 0 ist) und nachher normalisieren, oder du machst es mit der invers-transponierten Matrix. Das wäre dann schneller und stilechter ^^.

Würde im Skalierungfall vorschlagen, dass dus erstmal über normalisieren machst, weil man da nicht viel (falsch) machen kann/muss, und wenns dann klappt, kannst du immer noch die 2. Methode einbauen, nur dann weißt du, dass der Rest richtig funzt.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 18, 2006 19:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmm..Ich habs mittlerweile abgegeben. Es war ne aufgabe die lautet "Die Normalen laut vorlesung für ein beliebiges Polygon selbst setzen". Laut vorlesung bedeutet mit der inversen, Transponierten. Aber das es komisch aussieht is immer noch. Naja...

_________________
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  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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