Registriert: Mi Jan 08, 2003 15:49 Beiträge: 266 Wohnort: Aachen
Ich habe mal wieder eine Frage. Ich möchte in meiner 2D Engine ein Hintergrundbild darstellen ich wollte es so machen, ich lade und zeichne es wie eine normale Textur. Z = -10 und mit den Funktionen von OpenGL ziehe ich es dann so groß wie mein Fenster. Ist das so ok, wie ich das mache oder gibt es da bessere Lösungen, bestimmt
Warum soll's eine Bessere Lösung geben, wenns doch Funktioniert? Und Umständlich isses IMO auch nicht. Ich würd's zumindest genau so machen (was natürlich nix heisst) .
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Mi Jan 08, 2003 15:49 Beiträge: 266 Wohnort: Aachen
Ich habe es jetzt auch so gemacht. Doch ich habe noch einige Fragen zur Umwandeln von Zahlen und Farben.
Wie kann ich eine TColor Farbe nach einer RGB Farbe umwandeln.
Code:
Color := clYellow
glColor3f(ColorToRGB(Color));
Wie kann ich eine Position in OpenGL Positionen umwandeln, glaube zwar nicht das so was geht aber man kann ja mal fragen.
Code:
xLeft := 20 //20 Pixel von der Linken Seite des Programms
yTop := 10 //20 Pixel von der Oberen Seite des Programms
@TColor:
Was TColor betrifft, so hilf ein Blick in die Delphi-Hilfe, um zu wissen wie das geht. Leider gibt's keine Funktion (Wenn ich/s richtig weis), aber ich versuch's mal zu erklären:
TCollor ist ein einfacher 32-Bit wert. die ersten 8 Bit für Alpha (wird IMO nicht verwendet), die zweiten 8 Bit für Blau, die näschten 8 Bit für Grün und die letzten 8 Bit für Rot. Wen man sich einen Farb-Wert als Hexa-Dezimale Farbe vorstellt, sieht das dann so aus:
Eine Funktion zum Konvertieren müsste dann so aussehen:
Code:
function TColor2RGB(Col: TColor; var Blue, Green, Red: Word);
begin
Blue := (Col and $FF0000) shr 4;
Green := (Col and $FF00) shr 2;
Red := (Col and $FF);
end;
...
var R, G, B: Word;
begin
...
TColor2RGB(clYellow, B, G, R);
glColor3f(r, g, b);
...
end;
Dabei werden per AND immer die jeweiligen 8 Bit herrausgefiltert und dann "nach unten" verschoben, damit man einen reinen Word-Wert bekommt. Das ist aber theoretisch und müsste Funktionieren. Getestet hab' ichs nicht.
@Funktion/Koordinaten:
Es gibt eine glu-Funktion, welche diese Umrechnung für Dich übernimmt (wenn ich mich nicht irre). SOS kann Dir da Warscheinlich mehr sagen. Ansonsten schau einfach mal ins RedBook bzw. die OpenGL-SDK Hilfe rein (beides als Download auf DGL erhälltlich).
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Mi Jan 08, 2003 15:49 Beiträge: 266 Wohnort: Aachen
Ich habe eine Function gefunden die aus Object Koordinaten (K) Windows K macht (gluProject). Aber ich habe keine gefunden die aus Windows K. Object K. macht.
SOS hat im Thread <a href='http://www.phobeus.de/hosting/dgl/forum/viewtopic.php?t=541' target='_blank'>http://www.phobeus.de/hosting/dgl/forum/vi...topic.php?t=541</a> die Funktion gluUnProject() erwähnt. Schau mal nach, was mit der zu machen ist.
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Steht doch in der Hilfe drinnen. (Ok nicht wozu man die braucht, aber wie man die bekommt). gluUnProject wird anhand der Daten (auch der Matritzen) die gewünschten Werte berrechnen. Die Matrizen sind und der ViewPort sind zur Berechnung eben notwendig. Einfach die dafür in der Hilfe aufgeführte Funktion aufrufen und das Ergebnis des Aufrufs an die gluUnProject übergeben. Nähere Infos zu den entsprechenden Funktionen findest Du ebenfalls in der Hilfe.
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Warum machst Du glScaleF? Du hast nach gluUnProject 3 Koordinaten. Dies sind die Koorinaten, die du ketzt im Moment zum anzeigen des Objektes verwenden müsstest. Wenn Du also an Fenster-Position 100, 200 (als Beispiel) einen Punkt setzen wolltest, dann müsstest Du das entsprechend an gluUnProject übergebne. Das Ergebnis liefert dir dann die 3D-Koordinaten zurück. Beispiel:
Code:
var
a,b : pglDouble;
c : pglint;
x1,y1,z1 : GLdouble;
begin
glGetFloatv(GL_MODELVIEW_MATRIX,@a);
glGetFloatv(GL_PROJECTION_MATRIX,@b);
glGetIntegerv(GL_VIEWPORT,@c);
gluUnProject(100,200,0,@a,@b,@c,x1,y1,z1);
glBegin(GL_POINTS);
glVertex3f(x1, y1, z1);
glEnd;
Dann müsste der Punkt an der Fenster-Position 100, 200 erscheinen. Wenn Du natürlich NACH der gluUnProject-Berechnung glLoadIdendity, glTranslate usw. aufrufst, wird Deine ModelView-Matrix geändert und somit stimmen die Werte natürlich nicht. Das Umrechnen der Fenster-Koordinaten auf Objekt-Koordinatne ist immer von der aktuellen ModelView-Matrix abhängig. Wenn, dann glLoadIdendity, glTransLate, glRotate, glScale,... VOR gluUnProject aufrufen! (bzw. auf jeden Fall vor dem Ermitteln der Matrizen).
Zwei Dinge noch:
- Ich bin mir nicht sicher, was den Z-Wert angeht. Du hast ihn auf 0 gesetzt. Kann sein, dass er einen gewissen Wert braucht. Einfach mal rumspielen.
- Ich hab' mit gluUnProject bisher noch nichts gemacht. Weis also nicht, ob das (was theoretisch so funktionieren müsste) auch alles so Stimmt. Wenn nicht, berichtige mich wer's genauer weiß!
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Mi Jan 08, 2003 15:49 Beiträge: 266 Wohnort: Aachen
Ich habe es so gemacht, aber immer wenn er die letzt Zeile, meiner Procedure, Passiert hat, bekomme ich eine Exception. Wieso weis ich nicht. So sehen jetzt meine Sourcen aus:
Oh, Sorry. Hab' ich vorher den Fehler wohl nicht bemerkt.
Code:
a,b : pglDouble;
c : pglint;
du hast a und b als Zeiger auf glDouble definiert. Und c als Zeiger auf glInt. Jedoch sind das nur Pointer (als Zeiger) auf die jeweiligen Daten-Typen, nicht diese Daten-Typen selber. Auserdem muss a und b ein array of glDouble sein, da du die Matrix und nicht nur einen Wert auslesen willst. Und dann hast Du noch die Adresse des Pointers selber und nicht das, wo er hinzeigen soll. Im Klartext: Du hast gnadenlos ins nichts geschrieben. Und das ist nicht gut. Probier mal folgendes:
Mitglieder in diesem Forum: 0 Mitglieder und 11 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.