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

Aktuelle Zeit: Fr Jul 18, 2025 04:15

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jul 27, 2009 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
Hi^^

Folgendes: Ich hab gestern vor der Arbeit Zeit gefunden, an meinem Spiel weiter zu basteln, da ist mir etwas seltsames passiert.

Ich verwende in meinem Spiel mehrere Arrays des Ur-Objects meines Spiels, TSSObject. In diese Listen schreiben sich meine Objecte im Create rein, wenn sie von der Renderprocedur erfasst werden wollen (meine Objekte rendern sich nicht "selbst"). Da gibs die VisList, die Quads etc malt, und andere Listen, u.a. die BlendList. "List" ist jetzt sicherlich etwas verwirrend, das hat nichts mit Displaylisten zu tun, unpassender Name, ich denk mir heute noch was neues aus!^^ Ist das Object also in der BlendList angekommen, wird es in der Schleife in der Renderprozedur gerendert. Ich hab die VisList erfolgreich implementiert, und es gab keine Probleme. Copy-Paste, umschreiben auf Blending. Nun passiert aber Folgendes: In meinen Viewport passt genau meine Map, die aus der Vogelperspektive betrachtet wird. sie ist 55 x 31 OGL-Einheiten groß. Wenn ich nun mein Object an der Stelle (7,7,0) spawne, wird es aber ca bei Feld (14,14,0) gerendert... :/ hmmm jetzt könnte man denken AHAAA irgendwo nicht richtig gescalet? Ich rufe im gesammten Spiel glScalef nur mit Einsen und Minus-Einsen auf. es ist mir also ein Rätzel wieso das Objekt flasch angezeigt wird. Mir ist aufgefallen, dass die Map in Blending-Einheiten nur etwa halb so groß ist... also ein glScalef(0.5,0.5,0.5) eingebaut, und alles ist viiiel besser. Ich setz beim Rendern meine Modelmatrix auf den Mittelpunkt des zu rendernden Objekts, komsicher weise kann ich die letzte Verschiebung nur aufheben, wenn ich sie an den unteren rechten Punkt setze... öööööh... alles klappt.... was ist hier bitte los??? Ich vermute hier ist das glScalef(0.5,0.5,0.5) dran schuldt, aber Moment, beim normalen Matrix setzen ist das auch kein problem... Ich schäme mich oft für meinen Quelltext, da ich vermutlich viel suboptimal mache, aber ich lass euch heute mal dran teilhaben...^^



Code:
  1. procedure TSSEngine.DrawBlend;
  2. var i,k: integer;
  3. begin
  4. glEnable(GL_BLEND);
  5. glDepthFunc(GL_ALWAYS);
  6. for k := 0 to High(BlendList) do
  7.   begin
  8.   i:=High(BlendList)-k; {rückwärts durchgehen, kannte heute morgen "downto" statt "to" noch nicht... soviel dazu!}
  9.   if BlendList[i]=nil then {wenn objekt nicht vorhanden, gucken obs das letzte in der liste ist und dann einfach löschen ansonsten das letzte an die stelle setzen und dann array kürzen}
  10.     begin
  11.     if i=High(BlendList) then
  12.       SetLength(BlendList,High(BlendList)) else
  13.       begin
  14.       BlendList[i]:=BlendList[High(BlendList)+1];
  15.       SetLength(BlendList,High(BlendList))
  16.       end; //siehe oben
  17.     end else
  18.     begin //los gehts mit dem rendern
  19.     glMatrixMode(GL_MODELVIEW);
  20.     glPushMatrix;
  21.     glLoadIdentity; //sollte hier nciht schon das sclaing resetet sein???
  22.     glScalef(0.5,0.5,0.5); //stranges glScalef....
  23.     glTranslatef(BlendList[i].Position.XR+(BlendList[i].Size.XR),BlendList[i].Position.YG+(BlendList[i].Size.YG),BlendList[i].Position.ZB); //Size nicht halbiert....
  24.     glRotatef(BlendList[i].BlendRotation.XR,1,0,0);
  25.     glRotatef(BlendList[i].BlendRotation.YG,0,1,0);
  26.     glRotatef(BlendList[i].BlendRotation.ZB,0,0,1);
  27.     glBlendFunc(BlendList[i].blend1,BlendList[i].blend2);
  28.     TextureLoader.BindTexture(BlendList[i].BlendTexture);
  29.     glColor3f(BlendList[i].BlendColor.XR,BlendList[i].BlendColor.YG,BlendList[i].BlendColor.ZB);
  30.       glBegin(GL_QUADS);
  31.       glTexCoord2f(0,0); glVertex3f(BlendList[i].Position.XR+(BlendList[i].BlendSize/2),BlendList[i].Position.YG-(BlendList[i].BlendSize/2),BlendList[i].Position.ZB+0.1);
  32.       glTexCoord2f(1,0); glVertex3f(BlendList[i].Position.XR-(BlendList[i].BlendSize/2),BlendList[i].Position.YG-(BlendList[i].BlendSize/2),BlendList[i].Position.ZB+0.1);
  33.       glTexCoord2f(1,1); glVertex3f(BlendList[i].Position.XR-(BlendList[i].BlendSize/2),BlendList[i].Position.YG+(BlendList[i].BlendSize/2),BlendList[i].Position.ZB+0.1);
  34.       glTexCoord2f(0,1); glVertex3f(BlendList[i].Position.XR+(BlendList[i].BlendSize/2),BlendList[i].Position.YG+(BlendList[i].BlendSize/2),BlendList[i].Position.ZB+0.1);
  35.       glEnd;
  36.     glPopMatrix;
  37.     end;
  38.   end;
  39. glDepthFunc(GL_LESS);
  40. glDisable(GL_BLEND);
  41. end;


Ich rekonstruiere mal, wie es nciht geklappt hat... die geänderten Zeilen:

Code:
  1.  
  2. //glScalef(0.5,0.5,0.5); ausgekommentiert
  3. glTranslatef(BlendList[i].Position.XR+(BlendList[i].Size.XR/2),BlendList[i].Position.YG+(BlendList[i].Size.YG/2),BlendList[i].Position.ZB); {Size halbieren, wie es für mich sin machen würde!}
  4.  


Hilfe!! Alles funktioniert, aber so unschön.. ich will wissen, was abgeht!^^

Kann jemand erahnen wo das Problem liegen könnte???

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 27, 2009 21:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Hey,

es würde unter Umständen helfen, wenn du auch mal die Procedure für das Zeichnen der nicht geblendeten Objekte posten würdest. Sonst sehe ich ja keinen Unterschied. ^^
Und ja, das glLoadidentity setzt die Modell-View-Matrix zurück. Fuschst du etwas in der Projection-Matrix rum? :-P Die wird ja mit verrechnet. Auch könnte es sein, dass alles richtig ist, aber wenn sich das Objekt selbst einträgt, trägt es sich falsch ein? Vielleicht ist "BlendList[i].Position.XR" schont falsch gespeichert?

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 27, 2009 22:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Was da genau abgeht kann ich dir nicht sagen, auch weil meine eigenen OpenGL Kenntnisse da noch nicht reichen ^^, aber trotzdem ein Hinweis: BlendList scheint ein dynamsiches Array zu sein. Du könntest stattdessen ein TList-Objekt verwenden, das hat den Vorteil dass man Elemente einfach mit TList.add einfügen und mit TList.delete entfernen kann. Elemente die nil sind kann man mit TListe.pack automatisch bereinigen lassen. Damit kannst du deinen Code vielleicht etwas eleganter Formulieren. Wie gesagt mit dynamischen Arrays gehts auch, aber mit Listen kann man sich teilweise Code sparen. (Ausserdem sind dynamische Arrays in einigen Delphi-Versionen buggy und laden den Speicher voll aber das nur am Rande).

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 28, 2009 01:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
Ziz hat geschrieben:
[...]Fuschst du etwas in der Projection-Matrix rum?
[...]Vielleicht ist "BlendList[i].Position.XR" schont falsch gespeichert?[...]


Code:
  1. glMatrixMode(GL_PROJECTION);
  2. glLoadIdentity;
  3. gluPerspective(45.0,ScreenWidth/ScreenHeight,0.1,100);
  4. glScalef(1,-1,1);
  5. glTranslatef(-55/2,-31/2,0);
  6. glRotatef(4,1,0,0);
  7. glTranslatef(0,-3.01,-43);


rufe ich einmal auf wenn die map geladen wird. wie gesagt, nur einsen und minus-einsen und ich sehe bei einsen wirklich keine chance es zu verkacken^^

das array ist ein array of TSSObject, und wird dann mit "BlendList[1]:=BeispilObjekt;" wobei BeispielObjekt natürlich schon "Create" erfahren hat, weil es sich ja genau dann einschreibt.

alle zeichenprozeduren aufzählen??.. kleinen moment.

Code:
  1. procedure TSSEngine.DrawModels;
  2. var i,k: Integer;
  3. begin
  4. for k := 0 to High(ModelList) do
  5.   begin
  6.   i:=High(ModelList)-k;
  7.   if ModelList[i]=nil then
  8.     begin
  9.     if i=High(ModelList) then
  10.       SetLength(ModelList,High(ModelList)) else
  11.       begin
  12.       ModelList[i]:=ModelList[High(ModelList)+1];
  13.       SetLength(ModelList,High(ModelList))
  14.       end;
  15.     end else
  16.     begin
  17.     TextureLoader.BindTexture(ModelList[i].Texture);
  18.     ModelLoader.DrawModel(ModelList[i].Model,ModelList[i].Position,
  19.                           ModelList[i].Size.ZB,ModelList[i].Rotation);
  20.     end;
  21.   end;
  22. end;


anmerkung: ich zeiczhne in meiner szene keine models atm. kann ich, aber models spawnen korrekt.^^ ich benutze restless

Code:
  1. procedure TSSEngine.DrawVis;
  2. var i,k: Integer;
  3. begin
  4. for k := 0 to High(VisList) do
  5.   begin
  6.   i:=High(VisList)-k;
  7.   if VisList[i]=nil then
  8.     begin
  9.     if i=High(VisList) then
  10.       SetLength(VisList,High(VisList)) else
  11.       begin
  12.       VisList[i]:=VisList[High(VisList)+1];
  13.       SetLength(VisList,High(VisList))
  14.       end;
  15.     end else
  16.     begin
  17.     glMatrixMode(GL_MODELVIEW);
  18.     glPushMatrix;
  19.     glLoadIdentity;
  20.     glTranslatef(VisList[i].Position.XR+(VisList[i].Size.XR/2),VisList[i].Position.YG+(VisList[i].Size.YG/2),VisList[i].Position.ZB+(VisList[i].Size.ZB/2));
  21.     glRotatef(VisList[i].Rotation,0,0,1);
  22.     PaintCube(-VisList[i].Size.XR/2,
  23.               -VisList[i].Size.YG/2,
  24.               -VisList[i].Size.ZB/2,
  25.               VisList[i].Size.XR,
  26.               VisList[i].Size.YG,
  27.               VisList[i].Size.ZB,
  28.               VisList[i].TextureScale,
  29.               ssp(1,1,1),
  30.               VisList[i].Texture,
  31.               VisList[i].Texture2);
  32.     glPopMatrix;
  33.     end;
  34.   end;
  35. end;


Code:
  1. procedure TSSEngine.PaintCube(px,py,pz,sx,sy,sz,tscale: Double; pColor: SSPoint;
  2.                                                              TexS,TexU: String);
  3. var e1,e2,e3,e4,e5,e6,e7,e8: SSPoint; cs11,cs12,cs13,cs21,cs22,cs23: Double;
  4. begin
  5. e1:=ssp(px,py,pz);
  6. e2:=ssp(px+sx,py,pz);
  7. e3:=ssp(px,py+sy,pz);
  8. e4:=ssp(px+sx,py+sy,pz);
  9. e5:=ssp(px,py,pz+sz);
  10. e6:=ssp(px+sx,py,pz+sz);
  11. e7:=ssp(px,py+sy,pz+sz);
  12. e8:=ssp(px+sx,py+sy,pz+sz);
  13. if DoColorCubes then //relikt aus einer zeit ohne texturen
  14.   begin
  15.   cs11:=pColor.XR-0.2;
  16.   cs12:=pColor.YG-0.2;
  17.   cs13:=pColor.ZB-0.2;
  18.   end else
  19.   begin
  20.   cs11:=pColor.XR;
  21.   cs12:=pColor.YG;
  22.   cs13:=pColor.ZB;
  23.   end;
  24. cs21:=pColor.XR;
  25. cs22:=pColor.YG;
  26. cs23:=pColor.ZB;
  27. TextureLoader.BindTexture(TexU);
  28.     glBegin(GL_QUADS);
  29.     //Oben
  30.     glColor3f(cs11,cs12,cs13);
  31.     glTexCoord2f(0        ,0        );         glVertex3f(e6.XR,e6.YG,e6.ZB);
  32.     glTexCoord2f(sX/tScale,0        );         glVertex3f(e5.XR,e5.YG,e5.ZB);
  33.     glColor3f(cs21,cs22,cs23);
  34.     glTexCoord2f(sX/tScale,sY/tScale);         glVertex3f(e7.XR,e7.YG,e7.ZB);
  35.     glTexCoord2f(0        ,sY/tScale);         glVertex3f(e8.XR,e8.YG,e8.ZB);
  36.     glEnd;
  37. TextureLoader.BindTexture(TexS);
  38.     glBegin(GL_QUADS);
  39.     //Links
  40.     glColor3f(cs11,cs12,cs13);
  41.     glTexCoord2f(0        ,        0);         glVertex3f(e1.XR,e1.YG,e1.ZB);
  42.     glTexCoord2f(sY/tScale,        0);         glVertex3f(e3.XR,e3.YG,e3.ZB);
  43.     glColor3f(cs21,cs22,cs23);
  44.     glTexCoord2f(sY/tScale,sZ/tScale);         glVertex3f(e7.XR,e7.YG,e7.ZB);
  45.     glTexCoord2f(0        ,sZ/tScale);         glVertex3f(e5.XR,e5.YG,e5.ZB);
  46.     //Vorne
  47.     glColor3f(cs11,cs12,cs13);
  48.     glTexCoord2f(0        ,0        );         glVertex3f(e3.XR,e3.YG,e3.ZB);
  49.     glTexCoord2f(sX/tScale,0        );         glVertex3f(e4.XR,e4.YG,e4.ZB);
  50.     glColor3f(cs21,cs22,cs23);
  51.     glTexCoord2f(sX/tScale,sZ/tScale);         glVertex3f(e8.XR,e8.YG,e8.ZB);
  52.     glTexCoord2f(0        ,sZ/tScale);         glVertex3f(e7.XR,e7.YG,e7.ZB);
  53.     //Rechts
  54.     glColor3f(cs11,cs12,cs13);
  55.     glTexCoord2f(0        ,0        );         glVertex3f(e4.XR,e4.YG,e4.ZB);
  56.     glTexCoord2f(sY/tScale,0        );         glVertex3f(e2.XR,e2.YG,e2.ZB);
  57.     glColor3f(cs21,cs22,cs23);
  58.     glTexCoord2f(sY/tScale,sZ/tScale);         glVertex3f(e6.XR,e6.YG,e6.ZB);
  59.     glTexCoord2f(0        ,sZ/tScale);         glVertex3f(e8.XR,e8.YG,e8.ZB);
  60.     //Hinten
  61.     glColor3f(cs11,cs12,cs13);
  62.     glTexCoord2f(0        ,0        );         glVertex3f(e2.XR,e2.YG,e2.ZB);
  63.     glTexCoord2f(sX/tScale,0        );         glVertex3f(e1.XR,e1.YG,e1.ZB);
  64.     glColor3f(cs21,cs22,cs23);
  65.     glTexCoord2f(sX/tScale,sZ/tScale);         glVertex3f(e5.XR,e5.YG,e5.ZB);
  66.     glTexCoord2f(0        ,sZ/tScale);         glVertex3f(e6.XR,e6.YG,e6.ZB);
  67.     glEnd;


zur TList: Ich hab schon früher dynamische arrays verwendet und sehe kaum einen vorteil bei einer liste. mit dem einschreiben und austragen hab ich keine probleme, und so hab ich auf jedenfall nichts unnötiges an prozeduren dabei. natürlich weiß ich nciht was schneller ist, aber so ist es sehr einfach eig.^^ danke trozdem für den tipp.

edit - grad nochmal getestet: der fehler trifft auch auf, wenn ich nichts außer blendeffekten rendere. :(

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 28, 2009 06:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
hast du schoneinmal überlegt nicht beim scalef sondern beim translatef zu suchen? Es könnte ja sein, dass du die bewegung/verschiebung deiner Objekte doppelt in die Matrix rechnest und dadurch die doppelten Werte entstehen. Das glscalef kann das natürlich wieder rückgängig machen, aber sollte es an einem doppelten translatef aufruf liegen sollte eher dieser doppelte aufruf verschwinden.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 28, 2009 09:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ja das finde ich auch. Es geht hier nicht um das Skalieren, sondern um das grundlegende Verständnis für den Prozess. Daher konzentrieren wir uns mal auf den relevanten Code, nämlich der, der am verdächtigsten ist: das Verschieben und Rotieren:

Code:
  1. glMatrixMode(GL_PROJECTION);
  2. glLoadIdentity;
  3. gluPerspective(45.0,ScreenWidth/ScreenHeight,0.1,100);
  4. glScalef(1,-1,1);
  5. glTranslatef(-55/2,-31/2,0);
  6. glRotatef(4,1,0,0);
  7. glTranslatef(0,-3.01,-43);

Code:
  1. glMatrixMode(GL_MODELVIEW);
  2. glPushMatrix;
  3. glLoadIdentity; //sollte hier nciht schon das sclaing resetet sein???
  4. glScalef(0.5,0.5,0.5); //stranges glScalef....
  5. glTranslatef(BlendList[i].Position.XR+(BlendList[i].Size.XR),BlendList[i].Position.YG+
  6.                (BlendList[i].Size.YG),BlendList[i].Position.ZB); //Size nicht halbiert....
  7. glRotatef(BlendList[i].BlendRotation.XR,1,0,0);
  8. glRotatef(BlendList[i].BlendRotation.YG,0,1,0);
  9. glRotatef(BlendList[i].BlendRotation.ZB,0,0,1);

Mit Verlaub, Du rotierst und verschiebst hier ziemlich viel. Du hast einen Hinweis gegeben, dass dein OpengL Kenntnisse noch nicht gefestigt sind. Ist Dir bewusst, dass alle diese Translationen und Rotationen in genau der umgekehrten Reihenfolge erfolgen, wie Du sie hineingeschrieben hast? Zum Beispiel der Code für die ModelView Matrix beginnt mit der Rotation um die Z-Achse, arbeitet sich über die Y und X-Achse weiter vor und verschiebt erst zuletzt? Und nachher kommen erst die Verschiebungen und zusätzlichen Rotationen, die Du für die Projektionsmatrix vorgesehen hast.

Das Scalef kannst Du getrost weglassen. Das macht es nur falscher, nicht richtiger.

Ich an Deiner Stelle würde das ganze erst mit einem ganz einfachen Testprogramm und einem Quad probieren, am besten ein texturiertes Quad, da weiß man dann gleich auch, ob links/rechts/oben/unten stimmt. Ich mache das immer so. Bei einem umfangreicheren Programm verliert man schnell den Blick fürs Wesentliche. Und ich würde zunächst mal alle Modelview-Transformationen beieinander lassen, denn es kann ganz leicht passieren, dass man die im Fehlerfall einfach vergisst und beim Herummurksen macht man dann mehr Fehler rein als vorher drin waren (ich spreche aus eigener Erfahrung :wink: ).

Dann die erste Transformation hinzufügen. Wenn man mit dieser zufrieden ist (was heißt zufrieden - man muss 100% sicher sein), die zweite Transformation VOR die erste Transformation setzen, und so weiter, bis man alles durch hat.

Viele Grüße
Traude

EDIT: habe grade noch etwas gesehen:
Zitat:
//sollte hier nicht schon das scaling resetet sein???

Ich weiß jetzt nicht, auf welches Scaling sich diese Frage bezieht, denn Du hast zwei, eine bei der Projektions- und auch eine bei der Modelview-Matrix. Aber eigentlich ist es egal. Ein glLoadIdentitiy direkt nach dem Setzen eines Modus bezieht sich immer auf die Matrix des jeweiligen Modus und wird vor allen anderen Transformationen ausgeführt. Die Antwort auf diese Frage lautet einfach: "Nein".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 28, 2009 18:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
Traude hat geschrieben:
EDIT: habe grade noch etwas gesehen:
Zitat:
//sollte hier nicht schon das scaling resetet sein???

Ich weiß jetzt nicht, auf welches Scaling sich diese Frage bezieht, denn Du hast zwei, eine bei der Projektions- und auch eine bei der Modelview-Matrix. Aber eigentlich ist es egal. Ein glLoadIdentitiy direkt nach dem Setzen eines Modus bezieht sich immer auf die Matrix des jeweiligen Modus und wird vor allen anderen Transformationen ausgeführt. Die Antwort auf diese Frage lautet einfach: "Nein".


In meiner kleinen Welt hat glLoadIdenty den Effekt, dass die zuvor ausgewählte Matrix resetet wird. oO Ich les nachher mal was dazu, habe grade kaum Zeit.

Die doppelte Matrixtransformation ist eine gute Idee, die hatte ich noch nicht. Wobei ich nicht weiß wo das geschehen soll oO Immerhin rufe ich vor jeder Transformation DIREKT glLoadidentity auf. Aber wie gesagt, mein Bild vom Effekt dieses Aufrufs scheint falsch zu sein. Naja, danke für die Hilfe :)

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 28, 2009 21:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
ganz falsch ist es nicht. GlLoadIdentity setzt die aktuelle Matrix auf die EinheitsMatrix, die quasi ein unverändertes Koordinatensystem darstellt. Die Transformationsaufrufe sorgen dann für weitere Modifikation des Koordinatensystems. Evtl. solltest du nicht immer GlLoadIdentity benutzen, sondern zunächst deine Grundausrichtung der Szene gestalten und anschließend alle Objekttransformationen in glPushMatrix und glPopMatrix einkreisen. Diese Methode ist nicht unbedingt die günstigste, aber dafür eine sehr wirkungsvolle.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 29, 2009 10:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
In meiner kleinen Welt hat glLoadIdenty den Effekt, dass die zuvor ausgewählte Matrix resetet wird.

Manchmal ist es schwer, etwas so rüberzubringen, dass es so ankommt, wie es gemeint ist. Vor allem hier, weil ich jetzt nicht genau weiß, was Du mit "zuvor ausgewählte Matrix" meinst.

Wenn Du damit die Modelviewmatrix des vorigen Frame (= des vorigen Zeichenvorgangs) meinst, dann hast Du recht, dass glLoadIdentity das glScalef "wegputzt". Es putzt aber auch alle anderen Transformationen des letzten Zeichenvorgangs weg. Wenn man glLoadIdentity benutzt, beginnt man immer ganz von vorn (das ist der übliche Weg). glLoadIdentity ist Dein Freund.

Wenn Du damit die Projektionsmatrix des gleichen Frame meinst, dann ist das nicht so. In einem Frame sind beide glScalef aktiv, sowohl das glScalef(1,-1,1), das bei der Projektionsmatrix steht, als auch das glScalef(0.5,0.5,0.5), das bei der ModelviewMatrix steht. Das meinte ich vorher.


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


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.011s | 14 Queries | GZIP : On ]