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

Aktuelle Zeit: Do Jul 10, 2025 21:04

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Jul 22, 2006 23:16 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 23, 2006 13:01 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 23, 2006 13:14 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 23, 2006 16:34 
Offline
DGL Member
Benutzeravatar

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:

Code:
  1.  
  2. glTranslatef(mx,my,0);
  3. glRotatef(45,0,0,1);
  4.  
  5. glBegin(GL_QUADS);
  6.   glTexCoord2f(0,0); glVertex3f(x,y-hoehe, 0);
  7.   glTexCoord2f(1,0); glVertex3f(x+breite,y-hoehe, 0);
  8.   glTexCoord2f(1,1); glVertex3f(x+breite,y, 0);
  9.   glTexCoord2f(0,1); glVertex3f(x,y, 0);
  10. glEnd;
  11.  


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 :D

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 23, 2006 17:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,


wenn du dein Objekt um dessen Mittelpunkt drehen möchtest, probier mal folgendes :

Code:
  1.  
  2. glTranslatef(mx,my,0);
  3. glRotatef(45,0,0,1);
  4. glTranslatef(-x-breite/2, -y+hoehe/2, 0);
  5.        
  6. glBegin(GL_QUADS);
  7. glTexCoord2f(0,0); glVertex3f(x,y-hoehe, 0);
  8. glTexCoord2f(1,0); glVertex3f(x+breite,y-hoehe, 0);
  9. glTexCoord2f(1,1); glVertex3f(x+breite,y, 0);
  10. glTexCoord2f(0,1); glVertex3f(x,y, 0);
  11. glEnd;
  12.  



Noch besser wäre allerdings folgendes :
Code:
  1.  
  2. glTranslatef(mx+x,my+y,0);
  3. glRotatef(45,0,0,1);
  4.        
  5. glBegin(GL_QUADS);
  6. glTexCoord2f(0,0); glVertex3f(-breite/2,-hoehe/2, 0);
  7. glTexCoord2f(1,0); glVertex3f(breite/2,-hoehe/2, 0);
  8. glTexCoord2f(1,1); glVertex3f(breite/2, hoehe/2, 0);
  9. glTexCoord2f(0,1); glVertex3f(-breite/2,hoehe/2, 0);
  10. glEnd;
  11.  


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.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 23, 2006 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Oh, die zweite Variante funktioniert tatsächlich :D

Vielen Dank


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 23, 2006 17:48 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 24, 2006 08:16 
Offline
DGL Member
Benutzeravatar

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.

http://oss.sgi.com/projects/ogl-sample/registry/ARB/texture_rectangle.txt
http://oss.sgi.com/projects/ogl-sample/registry/NV/texture_rectangle.txt
Eine Ext Variante gibt es auch noch. Die ist genau wie eine von den beiden oberen nur mit anderem Name.

Wenn möglich würde ich aber immer auf die originalen Texturen zurückgreifen.


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


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 16 Queries | GZIP : On ]