Registriert: Sa Jul 22, 2006 00:43 Beiträge: 30 Wohnort: Borland
Da die Beschreibung meiner Probleme durch den Threadtitel noch nicht so wirklich aussagekräftig ist, hier nochmal detaillierter:
1. Objektrotation
Ich hangele mich gerade am Tutorial von Phobeus entlang und bin sehr begeistert, es macht wirklich Spaß dieses Tutorial zu lesen, was einem immer wieder Motivation zum weitermachen gibt , aber nun genug der Schmeicheleien. In Lektion 3 wird auf die Funktionen glTranslate, glRotate und glScale eingegangen. Ich habe nun ein Objekt erstellt und wollte dieses um seine Z-Achse drehen lassen, da ich mit glOrtho arbeite. Es soll sich also auf einem Punkt drehen, macht es auch, allerdings nur wenn ich den Mittelpunkt des Objekts direkt auf den Ursprung setze.
Im "Tutorial Matrix2" wird allerdings beschrieben, dass mit glTranslate der Ursprung versetzt wird, scheinbar funktioniert das bei mir nicht richtig oder (was ich eher glaube) ich habe etwas falsch gemacht/verstanden. Denn wenn ich meine "Kamera-Position" mit glTranslate ändere, bleibt der Ursprung immer am selben Ort. Ich habe versucht den Ursprung auf den Mittelpunkt des Objekts zu verschieben um von dort aus dann mein Objekt zu rotieren, aber wie eben erwähnt bleibt der Ursprung am "Ursprungsort". Hat das Objekt mit seinem Mittelpunkt also nicht die Koordinaten des Ursprungs, so bewegt es sich auf einer Kreisbahn um den Ursprung wenn ich es rotieren lasse. :-/
Was mache ich falsch oder was habe ich da falsch verstanden? Wie kann ich also ein Objekt an beliebiger Position drehen?
2. Verpixelung
Zum tapezieren habe ich mich vorerst für die textures.pas entschieden, mit dieser lese ich ein 32-bit Targa-Bild unkomprimiert ein. Sobald ich in irgendeiner Art rotiere, ist es am Rand allerdings recht verpixelt. Da ich allerdings erst vor ein paar Tagen auf OpenGL mit Delphi gestoßen bin und vorher mit DelphiX gearbeitet habe, unten ein Vergleich der beiden Objekte jeweils bei Rotation. DirectDraw bekommt das wesentlich besser hin, bis auf die Filterung im Inneren. Wie bekomme ich diese Pixel am Rand weg?
Update: Kleiner Nachtrag, ich habe mal etwas mit glScale an das Objekt herangezoomt und das Bild angehängt, es scheint einen Verlauf ins Weiße zu geben, kann man das auch ins Schwarze machen? Liegt es evtl. am Alphakanal?
3. Texturenformat
Beim herumstöbern durch verschiedene Threads bin ich auf die Information gestoßen, dass man bei 2d Texturen immer eine Größe von 2er-Potenzen benutzen muss. Gibt es keine Möglichkeit um 2D-Texturen mit "exotischen" Größen ohne Darstellungsfehler (Verschwommen) zu benutzen?
Ich wäre euch sehr dankbar für jede Art von Hilfestellungen :>
MfG MB
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
@1:
Willst du ein Objekt um die eigene Achse drehen, so musst du es einfach erst rotieren und es dann mit glTranslate ausrichten.
@2:
Ich vermute mal du nutzt den Alphatest. Damit sind die von dir beobachteten weißen Ränder völlig normal. Wenn du alle Fragmente mit einem Alphawert von größer gleich 0.3 ''ausblenden'' willst, so werden immernoch alle Fragmente mit einem Alphawert von 0.29 dargestellt. Selbst wenn du in deiner Textur nur Alphawerte von 0 und 1 vergeben hast, so existieren z.B. dank linearer Filterung Fragmente, deren Alphawerte irgendwo dazuwischen liegen.
Abhilfe schafft hier ganz normales Blending (glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ))
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Registriert: Sa Nov 13, 2004 11:00 Beiträge: 229 Wohnort: Steinhude
ansonsten hilfts auch, soweit möglich, wenn in der Orginaltextur der Farbbereich etwas über die im Alphakanal gezeichnete Maske hinausgestreckt wird (also der Rand wiederholt).
Zur Rotation: Hängt davon ab, wie dein Objekt vorliegt. Wenn die Daten so aufgebaut sind, das ohne Veränderung der Ursprung in der Mitte des Objektes liegen würde, musst du wie bereits erwähnt es zunächst drehen und dann an seine stelle schieben, ansonsten musst dus erst in die entgegengesetzte Richtung verschieben und dann drehen und zurückverschieben.
Registriert: Sa Jul 22, 2006 00:43 Beiträge: 30 Wohnort: Borland
Vielen Dank für die Antworten, das mit dem Blending hat wunderbar funktioniert Frage 3 hat sich ebenfalls erledigt
Allerdings scheine ich immer noch an der Rotation zu scheitern... ich glaube das einzige was jetzt noch hilft ist ein Codebeispiel Naja, folgendes funktioniert schonmal nicht:
Wenn ich Translate mit Rotate vertausche passiert das selbe, nur ist das Objekt halt woanders. (mx und my sind die Mittelpunktkoordinaten des Objekts und werden vorher berechnet).
Gibt es bei OpenGL keine vorgefertigte Klasse bei der soetwas einfacher geht wie z.B. bei DX mit den TImageSprites? Dort gibts z.B. dann eine Eigenschaft namens Angle die das Objekt dann automatisch um einen bestimmten Grad um die eigene Achse dreht (mehr oder weniger) Aber wahrscheinlich muss ich mir die Klasse selber schreiben, fehlt halt nur die Drehprozedur
Update:
Jetzt gehts O_o scheinbar... sehr seltsam.
Ok, stellen wir uns jetzt mal vor, dass es sehr sehr viele Objekte gibt die sich gleichzeitig drehen, muss ich dann für jede Bewegung den Urpsrung auf den Mittelpunkt des Objekts verlegen oder gibt es da eine einfachere Möglichkeit?
Der Vorteil bei der zweiten Methode ist, das sich x und y nur auf den Mittelpunkt deines Objektes beziehen (also dessen lokale Rotationsachse).
Du solltest den (lokalen) Ursprung deines Objektes immer versuchen auf dessen Rotationsachse zu legen, da dies dessen einzig fixer Punkt ist.
Viele Grüße
dj3hut1
Zuletzt geändert von dj3hut1 am Mo Jul 24, 2006 06:50, insgesamt 2-mal geändert.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Vielleicht noch ein kleiner Tip : bei Matrizenoperation sollte man versuchen nicht von oben nach unten sondern von unten nach oben zu lesen.
Also bei meinem ersten Beispiel z.B.: zuerst zeichnest du dein Objekt, dann verschiebst du es zu dessen Ursprung, dann rotierst du es, und zum Schluss verschiebst du das Objekt komplett.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
2: Da hab ich noch ne Anmerkung. Es liegt alles nur an der Texturfilterung. Dadurch wird wie oben schon erwähnt auch der Alphakanal gefiltert. Der Grund warum es bei DirectDraw aber gut aussieht ist der, dass dabei die Filterung deaktiviert ist. Man kann da ganz klar den Unterschied zu OpenGL erkennen. OpenGL sieht dank Filterung viel unpixeliger (argh hässliches Wort) aus. Wenn du die Filterung in OpenGL ausstellen würdest hättest du auch keine Probleme mit dem Rand.
3: Es kommt ganz darauf an was du für eine Zielplatform ansprechen müsstest. Ab OpenGL 2.0 existiert die Beschränkung auf Potenz von 2 nicht mehr. Dann kannst du jedes beliebe Format benutzen. Oder aber auch, wenn die Extension GL_ARB_texture_non_power_of_two unterstützt wird.
Eine ganz andere Alternative ist dazu Texture_rectangle. Das sollte für einfache Texturen und Handhabungen auch ausreichend sein. Dabei musst du aber andere Texturekoordinaten angeben. Wären du normal von 0-1 angeben musst musst du dabei von 0-Breite oder 0-Höhe (In Pixeln) angeben.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.