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

Aktuelle Zeit: Mi Jul 16, 2025 18:56

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Feb 04, 2005 19:37 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Feb 04, 2005 19:27
Beiträge: 14
Hi,
Ich fange gerade an, ein wenig mit OpenGL zu basteln und versuche meine Sachen zu kapseln. Ziel ist es, einen (bzw. mehrere) Würfel zu erzeugen und per OnMouseMove() zu bewegen. Mein Ansatz sieht wie folgt aus:

Code:
  1.  
  2. type TAxis=(ax,ay,az);
  3.      T3DCoordinates=array[TAxis] of GLdouble;
  4.  
  5. procedure TGLObject.Project(var Value : T3DCoordinates);
  6. var ModelView  : TMatrixDblArray;
  7.     Projection : TMatrixDblArray;
  8.     ViewPort   : TViewPortArray;
  9.     wX,wY,wZ   : GLdouble;
  10. begin
  11.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelView[0]);
  12.   glGetDoublev(GL_PROJECTION_MATRIX, @projection[0]);
  13.   glGetIntegerv(GL_VIEWPORT, @ViewPort[0]);
  14.   gluProject(FTranslation[ax], FTranslation[ay], FTranslation[az],
  15.              ModelView, Projection, ViewPort,
  16.              Value[ax], Value[ay], Value[az]);
  17. end;
  18.  
  19. procedure TGLObject.UnProject(var Value:T3DCoordinates);
  20. var ModelView  : TMatrixDblArray;
  21.     Projection : TMatrixDblArray;
  22.     ViewPort   : TViewPortArray;
  23.     wX,wY,wZ   : GLdouble;
  24. begin
  25.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelView[0]);
  26.   glGetDoublev(GL_PROJECTION_MATRIX, @projection[0]);
  27.   glGetIntegerv(GL_VIEWPORT, @ViewPort[0]);
  28.   gluUnProject(Value[ax], ViewPort[3]-Value[ay], Value[az],
  29.                ModelView, Projection, ViewPort,
  30.                Value[ax], Value[ay], Value[az]);
  31. end;
  32.  
  33. { --------------------- }
  34.  
  35. procedure TGLCross.SetLeft(const Value: Integer);
  36. var Coord : T3DCoordinates;
  37. begin
  38.   if Value<>FLeft then
  39.   begin
  40.     Project(Coord);
  41.     Coord[ax]:=Value;
  42.     UnProject(Coord);
  43.     FTranslation[ax]:=FTranslation[ax]+Coord[ax];
  44.     FLeft:=Value;
  45.   end;
  46. end;
  47.  
  48. procedure TGLCross.Paint;
  49. begin
  50.   glColor4f(GetRValue(FColor)/255,GetGValue(FColor)/255,GetBValue(FColor)/255,FAlpha);
  51.  
  52.   glRotatef(FRotation[ax], 1.0, 0.0, 0.0);
  53.   glRotatef(FRotation[ay], 0.0, 1.0, 0.0);
  54.   glRotatef(FRotation[az], 0.0, 0.0, 1.0);
  55.  
  56.   glTranslatef(FTranslation[ax], FTranslation[ay], FTranslation[az]);
  57.  
  58.   glBegin(GL_LINE_STRIP);
  59.     glVertex3f(-1.0, 0.0, 1.0);
  60.     glVertex3f( 0.0, 1.0, 1.0);
  61.   glEnd;
  62.   glBegin(GL_LINE_STRIP);
  63.     glVertex3f( 0.0, 0.0, 1.0);
  64.     glVertex3f(-1.0, 1.0, 1.0);
  65.   glEnd;
  66.  
  67. end;
  68.  
  69.  


Mache ich nur ein FTranslation[ax]:=Coord[ax], dann springt mein Kreuz zwischen zwei Positionen hin und her. Mit der Addition kann ich zwar hin und her schieben, aber irgendwo muss da ein Multiplikator drin sein. Wo sollte ich nach dem Fehler suchen?
TIA, Heiko.

--
"Software is like sex, it´s better when it´s free!"
(Linus Torvalds)
http://www.scrabble.online.de.vu (Version 3.0, OpenSource)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 07, 2005 00:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Prinzipiell bist du auf dem richtigen Weg - auch wenn es nicht sehr performant ist, jeden Frame Viewport, ModelView und Projection Matrix erneut auszulesen - und das sogar mehrmals.
Code:
  1. FTranslation[ax]:=FTranslation[ax]+Coord[ax];

ist falsch, es sollte wahrscheinlich heißen
Code:
  1. FTranslation[ax]:=Coord[ax];


Nachdem das auch nicht funktioniert, solltest du überprüfen,
* wann FTranslation eigentlich gesetzt wird (initialisierst du diese Variable vielleicht mehrmals pro Frame? - dann musst Du dich nicht wundern, wenn dein Objekt "hüpft".)
* ob deine ModelViewMatrix (geändert in der Paint Routine) fallweise auch zurückgesetzt wird?

Mehr kann ich bei den vorliegenden Codeschnippseln leider nicht sagen.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 07, 2005 13:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Feb 04, 2005 19:27
Beiträge: 14
Mars hat geschrieben:
Nachdem das auch nicht funktioniert, solltest du überprüfen,
* wann FTranslation eigentlich gesetzt wird (initialisierst du diese Variable vielleicht mehrmals pro Frame? - dann musst Du dich nicht wundern, wenn dein Objekt "hüpft".)
* ob deine ModelViewMatrix (geändert in der Paint Routine) fallweise auch zurückgesetzt wird?

Meinst Du glLoadIdentity() mit ModelViewMatrix zurücksetzen? Genau an der Stelle bastel ich gerade rum, erfolglos. Ich muss wohl doch noch deutlich mehr lesen, bevor ich einen sinnvollen Code schreiben kann... :?
Gruss, Heiko

_________________
"Software is like sex, it´s better when it´s free!" (Linus Torvalds)
http://scrabble.game-server.cc


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]