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

Aktuelle Zeit: Fr Jul 18, 2025 22:04

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rotationsproblem
BeitragVerfasst: Mi Okt 07, 2009 11:00 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Hallo an alle DGLer,

Ich habe Mittlerweiler schon mehrere Sachen versucht jedoch komme ich einfach nicht weiter. Mein Problem ist folgendes:
Ich habe mir eine Klasse geschrieben, die auf ein Panel mehrere Objekte rendert. Soweit so gut. Sprich aus meiner Form heraus erstelle ich immer eine Instanz dieser Klasse (Unit) wenn ich zum Beispiel aus einer anderen Form heraus diese 3d-Form aufrufe. Wenn ich das Objekt drehe, möchte ich die Drehmatrix nach aussen gereicht bekommen, damit ich diese dann anschliessend bei Erstellung der Instanz (sprich nach dem Wechsel von der anderen Form aus auf die 3d Form) an die ModelviewMatrix übergeben kann, ohne dabei sämtliche Drehungen zu verlieren.

Die Matrix lese ich beim Rendervorgang so aus:

Code:
  1.  
  2.  
  3.    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.  
  5.    glMatrixMode(GL_PROJECTION);
  6.    glLoadIdentity;
  7.    gluPerspective(1, 1, NearClipping, FarClipping);
  8.  
  9.    glMatrixMode(GL_MODELVIEW);
  10.    glLoadIdentity;
  11.  
  12.    glTranslatef(0, 0, -130);
  13.    glRotatef(Frotx,1,0,0);
  14.    glRotatef(Froty,0,1,0);
  15.    
  16.   ...Rendern der Objekte
  17.  
  18.    glPopMatrix;
  19.    glGetFloatv(GL_MODELVIEW_MATRIX, @FModelViewMatrix);


Nun führe ich jedesmal beim initialisieren des Rendercontext auch eine SetTexture Procedure aus, in die ich nun meine Matrix wieder übergebe
Code:
  1.  
  2. procedure TEBSDOpenGLFigures.SetTexture(Textures : TTextureArray; SavedMatrix:TMatrix4f);
  3. var i,ix,iy : integer;
  4.     b    : PByteArray;
  5.     bitmap : TBitmap;
  6.  
  7. begin
  8.    ...
  9.    glMultMatrixf(@SavedMatrix);
  10. end;
  11.  


Jedoch bringt dies recht wenig, da aufgrund des LoadIdentity beim Rendern die Matrix wieder zurücksetzt. Hat jemand eine Idee wie ich diese Matrix übergeben bekomme ohne ein weisses Bild zu sehen?

Grüsse

heavenssake


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 07, 2009 11:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Also mich stört das PopMatrix da aus 2 Gründen
1: wo is das zugehörige push??
2: Du holst dir irgendeine Matrix vom Stack und die bekommst du dann beim auslesen

Wenn das der ganze Code ist ...dann kein Wunder das das nicht geht


Zuletzt geändert von FrenK am Mi Okt 07, 2009 11:52, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 07, 2009 11:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

speicher die Matrix doch gleich nach dem ändern:
Code:
  1.    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  2.  
  3.    glMatrixMode(GL_PROJECTION);
  4.    glLoadIdentity;
  5.    gluPerspective(1, 1, NearClipping, FarClipping);
  6.  
  7.    glMatrixMode(GL_MODELVIEW);
  8.    glLoadIdentity;
  9.  
  10.    glTranslatef(0, 0, -130);
  11.    glRotatef(Frotx,1,0,0);
  12.    glRotatef(Froty,0,1,0);
  13.    glGetFloatv(GL_MODELVIEW_MATRIX, @FModelViewMatrix);
  14.  
  15.    //...Rendern der Objekte


MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 08, 2009 13:46 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Vielen Dank Euch beiden,

Hab das jetzt mal so gelöst:

Code:
  1.  
  2.  //Zur Matrixübergabe bei neuer Instanz
  3.     if FbTextureLoad=true then
  4.     begin
  5.      if TestsMatrix(FModelViewMatrix)=false then
  6.      begin
  7.        glMultMatrixf(@FModelViewMatrix);
  8.      end;
  9.     end
  10.     else
  11.     begin
  12.      glTranslatef(0, 0, -130);
  13.      glRotatef(Frotx,1,0,0);
  14.      glRotatef(Froty,0,1,0);
  15.     end;
  16.  
  17.     glGetFloatv(GL_MODELVIEW_MATRIX, @FModelViewMatrix);
  18.  


Sprich FModelViewMatrix ist meine gesicherte Matrix.TestsMatrix macht nichts anderes als zu schauen ob die Matrixelemente alle 0 sind.

VG

Heavenssake007


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 09, 2009 15:27 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Hat nichts mit deinem Problem zu tun - eher en allgemeiner Hinweis.

Die If-Anweisung prüft, ob der Ausdruck, der ihr übergeben wurde True oder False ist. (Wußtest du, ist mir klar)
Wenn du nun sowas schreibs wie if [irgendeine Boolean-Variable] = true then [tu sonstwas] ist das in gewisserweise doppelt gemoppelt. Es reicht Delphi (und jeder anderen mir bekannten Sprache auch) schon, wenn du schreibst if [Variable] then [Anweisungen].
Ich weiß nicht, ob der Compiler von Delphi das von sich aus schon so optimiert, mir ist nur bekannt, dass Vis. Basic (jaja...) es nicht tut und dadurch (wenn auch nicht bedeutend) bei if [Variable] = true then [anweisungen] langsamer arbeitet als bei der Kurzfassung.
Aber selbst, wenn die Performance egal ist: Es erspart einem mehrere Zeichen Tipparbeit ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 09, 2009 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Code:
  1. if (Variable == true) { ... }

zu schreiben erhöht aber wiederum die Lesbarkeit und die ist mitunter weitaus wichtiger

Code:
  1. foo = (!!test ? variable : andere) ? (!andere ? x : y) : (mehr ? a : b);

Kann man lesen, aber ob das jeder auf Anhieb versteht? ;)

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 09, 2009 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
in Delphi sieht der Spaß dann aber anders aus da gibt nämlich keine Symbole und variblen itten im Code zu definier geht schon ma gar nicht sondern
or, and, not ....
und nicht
||, &&, !

das macht auch noch einen Unterschied und bei einfachen flags isses ja keine herausforderung zu erkennen was der Ausdruck darstellt
ich meine sowas wie

while not finished do
...

kann man ja fast als englischen satz interpretiern da sehe ich keine Probleme

Aber jedem das was ihm besser gefällt sofern man nicht im Team arbeitet oder das ganze veröffentlichen will, denke ich jeder wird das machen was er gewohnt ist...


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]