Hallo,
ich arbeite seit kurzem mit OpenGL und hab nu ein Problem
Ich hab ein panel erstellt auf dem ich halt mein OpenGL Zeugs
ausgebe
Nu will ich das der Mittelpunkt von OpenGL genau auf der
Mausposition liegt...
Momentan mach ich das mit dem OnMouseMove des panels
jedoch bekomm ich da nie das raus was ich haben will...
ich habe das mehr oder weniger so:
Code:
glTranslate(xs,ys,0)
wobei xs und ys die x,y Koords von MouseMove sind.
Ich würd jetzt gern wissen wie ich das hinbekomme das
der Mittelpunkt genau auf x,y liegt
Registriert: Mi Dez 15, 2004 20:36 Beiträge: 454 Wohnort: Wien, Österreich
Wenn du es mit 2D machst, dann dürfte genau das ausreichen, was du bisher gemacht hast. Da dies aber nicht das Fall ist , dann denke ich gluUnProjekt / gluProjekt sollte das Richtige sein.
_________________ "Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Willkommen am Board.
mgapski hat geschrieben:
Ich hoffe man kann verstehen was mein Problem ist
Nein. Leider verstehe ich das nicht so genau. Möchtest du mittels 2D etwas darstellen oder möchtest du einem 3D Raum, bei dem sich die Ansicht je nach Mausposition verschiebt? Also eine Art Ballerspiel.
Dafür gibt es leider sehr verschieden Wege weswegen das ein nicht zu unterschätzender Tatbestand ist.
Für den Fall, dass du bereits etwas gemacht hast und das nicht so beschreiben kannst bieten sich bilder und oder Quellcodes immer recht gut an. Ein Bild sagt oftmals mehr als man in einer Beschreibung schreiben kann. Vor allem, da man meistens nicht genau weiß wo der ein oder andere seine Prioritäten setzt.
ok, ich wusste ja das ich das ich mein Problem nicht richtig rüber bringen würde
Also noch ein versuch (Code gibts dazu nicht ^_^ )
Ich habe ein panel auf dem ich meine OpenGL Ausgabe habe...
dort zeichne ich mir ein Quad...
es ist alles in 2D und dies wird sich auch net ändern
nun will ich, bei onMouseMove des panels, den
Koordinatenursprung genau dort haben wo grad
meine maus ist
das macht man ja mit
Code:
glTranslate(xs,ys,0)
mein problem ist nun, das onMouseMove pixel zurück
gibt... die kann ich leider net einfach in glTranslate
einfügen, da das dann ja Müll ergibt...
ich hab den Hinweis von sniper_w ma nachverfolgt... komme aber bei dem
komischen gluUnProject nicht wirklich weiter
ich hab auf Wiki nachgelesen, komme aber trotzdem net
dahinter welche Params das ding von mir haben will...
könnte vielleicht jemand ein kleines Bsp. posten wie das geht?
oder gibt´s da noch nen einfacheren Weg?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also für 2D ist das ziemlich einfach. Du hast mit glOrtho eine Größe von deiner Ansicht eingestellt. Wenn du dort die genau Pixelgröße angibst, dann haut es sehr genau hin. Wobei ich das eigentlich immer direkt mit glVertex2i angebe. Und da konnte ich mich so jetzt nicht beschweren. Wenn dir das nicht weiter hilft, dann wirst du keine andere Wahl haben als ein wenig Code rauszurücken.
Result := Boolean(gluUnProject(_wx,_wy,wz[0],MV,PM,VP,_ox,_oy,_oz));
wz := nil;
end;
und finally
Code:
MouseMove(...,X,Y : Integer);
var
oglx, ogly, oglz : Double;
begin
[...]
// Windows zählt von oben nach unten, OGL von unten nach oben
if GetObjectCoords(X,Panel.Height-Y,oglx,ogly,oglz) then begin
[...]
glTranslatef(oglx,ogly,oglz)
[...]
end;
end;
Ohne Garantie. Aber so berechne ich mir den Punkt auf den der User geklickt hat, um dann einen Farbtropfen fallen zu lassen. Und es funktioniert eigentlich...
Grüße
Wolf
_________________ Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)
@ Lossy eX
das hilft mir leider nicht so wirklich weiter...
ich würd ja gern code posten.. aber wie gesagt:Mehr
als ein Quad zu zeichnen mach ich ja nicht.
Und ich glaub net das es was bringt wenn ich das hier poste... oder?
@ Blechwolf
das schaut ja fast so aus wie das was ich suche ^^
das einzige problem ist:
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Ja, was sagen wir immer über Glaux? Sofort vergessen, gibt zahlreiche bessere Varianten um es zu ersetzen *kugel.bitzer.rausholt*
Was die Fehlermeldung angeht, vermutlich sind deine Header zu alt. Es handelt sich hierbei um einen tragischen "Erbfehler", da die meisten OpenGL 1.2 Header Delphi-typisch statt gluint ein TGluInt etc. verwenden. Ist natürlich nicht sinnvoll, wenn es darum geht alten Code zu verwenden, der es nicht kann und man alle Typen umschreiben muss. Entweder definierst Du Dir einen eigenen Typ TGluInt = gluInt etc. oder einfacher: Du verwendest unsere DGL-Header. Die verstehen gleich beide Varianten und sind auf den neusten Stand. FAQ zum Initalisieren nicht vergessen. .... so und nun lese ich gerade, dass diese Typen ja gar nicht zu OpenGL gehören, sondern Du vermutlich doch eher eine Datei namens "Geometry.pas" brauchst, die IMAO von Mike Lischke für GlScene gemacht wurde. Ist diese nicht bei uns in der SDK enthalten (weiß ich wirklich spontan nicht)
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Bin davon ausgegangen, das Du die dglOpenGL.pas benutzt. Der OpenGL.pas Header von Delphi ist nämlich leider hoffnungslos veraltet und nicht wirklich vollständig.
Grüße
Wolf
_________________ Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
mgapski hat geschrieben:
@ Lossy eX das hilft mir leider nicht so wirklich weiter... ich würd ja gern code posten.. aber wie gesagt:Mehr als ein Quad zu zeichnen mach ich ja nicht. Und ich glaub net das es was bringt wenn ich das hier poste... oder?
So würde ich das nicht sehen. Du musst ja außer dem weißen Quad noch etwas machen sonst würdest du ja nicht mal das sehen und das scheint ja nicht so gehen wie du willst. Sonst hättest du ja auch keine Frage gestellt. Und da es nun mal zig Möglichkeiten gibt etwas zu lösen erlangen wir nur mit Code den vollen Durchblick. (Meistens)
Aber an deiner Stellen würde ich mir mal den Code von Sniper genau anschauen. Er sollte das machen was du haben willst.
@gluUnProjekt: Versteht mich nicht falsch. Aber was soll das bei dem Problem helfen? Er arbeitet doch in 2D wenn ich das richtig verstanden habe. Und dann ist es doch nur ein Positionierungsproblem
@Blechwolf, Sniper und glOrtho: Wer auch immer damit angefangen hat alles auf den Kopf zu stellen. Es geht auch einfacher. Du kannst bei glOrtho die Dimensionen auch so angeben, dass sie richtig herum stehen. Um mal das Wiki zu zitieren.
Wenn man also folgendes macht sind die Koordinaten like Windows. Ursprung oben links.
Code:
glOrtho(0, glPanel.Width, glPanel.Height,0,-1,1);
Das ist aber im Endeffket auch nur eine Schönheitssache für den Entwickler. OpenGL ist das mal so etwas von egal wie rum man das spiegelt und skaliert.
im ernst: sauberer ist es(finde ich zumindest) die Mauskoordinaten sauber in OpenGL-WC-Koordinaten umzurechnen.
Solche Spielchen mit dem Spiegeln machen den Code undurchsichtig.
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.