Entwickler-Ecke
Multimedia / Grafik - Mit der Maus über eine Map Navigieren
t/f - Sa 19.04.03 23:53
Titel: Mit der Maus über eine Map Navigieren
Hallo Board!
Wie finde ich via OpenGL heraus, wo ich mit meiner Maus hinklicke?
Ich krieg zwar die Pixel von Form1 über das OnMouseDown-Ereignis, doch wenn ich nun in OpenGL etwas in meiner Scene verändern möchte, ( beispielsweisie, die "Kamera" an diese Stelle bewegen oder dort ein Objekt erscheinen lassen ), helfen mir die Pixel nun gar nicht weiter, da ich erstens ein zwedimensionales Koordinatensystem mit dem Urprung in der oberen linken Ecke habe, dass zweitens mit ganz anderen Maßstäben rechnet als mein OpenGL-Fenster.
nungut, die Frage nach den Maßstäben ließe sich mit Müh und not durch geschicktes Zoomen durch glTranslate und dann?
Um euch zu erklären worum es mit im Detail geht:
ich habe ein Quad, dass in eine bestimmte Lage gedreht wurde und durch einfaches Kacheln eine Map darstellen soll.
Nun klicke ich irgendwo mit der Maus hin... meine Kamera soll dabei zu diesem Ort "hinfahren".
Es wäre toll, wenn ich wenigstens für zwei Dimensionen des Koordinatensystems meine Mauskoordinaten umsetzen könnte, da die dritte ja eh nicht veränderbar sein brauch, oder?
Hier mein Quellcode (wird euch sicher aus den Tutorials bekannt vorommen :D):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OpenGL12, Textures, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure InitGL; procedure DrawScene; procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); procedure Button1Click(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure CheckKeys; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
procedure SetDCPixelFormat(Handle: HDC);
var Form1: TForm1; h_DC: hDC; hRC: HGLRC; Rotate,RotateX,PosX,PosZ,CamX,CamY: Single; MyTex: TTextur; Keys: Array[0..255] of Boolean; RealFPS: Integer = 100; FPS: Integer;
implementation
{$R *.dfm}
procedure TForm1.CheckKeys; begin if Keys[VK_LEFT] then begin Rotate:=Rotate - 2 * (100 / RealFPS); if Rotate<0 then Rotate:=Rotate + 360; end; if Keys[VK_RIGHT] then begin Rotate:=Rotate + 2 * (100 / RealFPS); if Rotate>360 then Rotate:=Rotate - 360; end; if Keys[VK_UP] then begin PosX:=PosX + Sin(-Rotate * (PI / 180)) * (0.1); PosZ:=PosZ + Cos(-Rotate * (PI / 180)) * (0.1); end; if Keys[VK_DOWN] then begin PosX:=PosX - Sin(-Rotate * (PI / 180)) * (0.1); PosZ:=PosZ - Cos(-Rotate * (PI / 180)) * (0.1); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Form1.Left := 0; Form1.Top := 0; Form1.Width := Screen.Width; Form1.Height := Screen.Height; InitOpenGL; h_DC:=GetDC(Handle); SetDCPixelFormat(h_DC); hRC:=wglCreateContext(h_DC); wglMakeCurrent(h_DC,hRC); InitGL; Application.OnIdle := ApplicationEvents1Idle; glEnable(GL_TEXTURE_2D); MyTex:=TTextur.Create('terrain1.jpg'); end;
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); begin DrawScene; Done:=False; end;
procedure TForm1.DrawScene; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity;
//CheckKeys;
glColor3f(1.0, 1.0, 1.0); glTranslate(CamX,CamY,-2); //glRotate(45,0,1,0); glRotate(-45,1,0,0); MyTex.Bind; glBegin(GL_QUADS); glTexCoord2f(50,0); glVertex3f(5,-5,0); glTexCoord2f(50,50); glVertex3f(5,5,0); glTexCoord2f(0,50); glVertex3f(-5,5,0); glTexCoord2f(0,0); glVertex3f(-5,-5,0); glEnd;
SwapBuffers(h_DC);
RotateX:=RotateX + 1; if RotateX>360 then RotateX:=RotateX - 360;
FPS := FPS + 1; end;
procedure TForm1.InitGL; begin glClearColor(0,0,0,0); glClearDepth(1); glDepthFunc(GL_LESS); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST);
glViewport(0,0,Screen.Width,Screen.Height); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45,Screen.Width/Screen.Height,1,100); glMatrixMode(GL_MODELVIEW); end;
procedure SetDCPixelFormat(Handle: HDC); var nPixelFormat: GLUint; const pfd: PIXELFORMATDESCRIPTOR = ( nSize: sizeof( PIXELFORMATDESCRIPTOR ); nVersion: 1; dwFlags: PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; iPixelType: PFD_TYPE_RGBA; cColorBits: 16; cRedBits: 0; cRedShift: 0; cGreenBits: 0; cBlueBits: 0; cBlueShift: 0; cAlphaBits: 0; cAlphaShift: 0; cAccumBits: 0; cAccumRedBits: 0; cAccumGreenBits: 0; cAccumBlueBits: 0; cAccumAlphaBits: 0; cDepthBits: 16; cStencilBits: 0; cAuxBuffers: 0; iLayerType: PFD_MAIN_PLANE; bReserved: 0; dwLayerMask: 0; dwVisibleMask: 0; dwDamageMask: 0 ); begin nPixelFormat:=ChoosePixelFormat(h_DC, @pfd); SetPixelFormat(h_DC,nPixelFormat,@pfd); end;
procedure TForm1.Button1Click(Sender: TObject); begin close; end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Keys[Key]:=true; if(Key = vk_escape)then close; end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin Keys[Key]:=false; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin RealFPS:=FPS; FPS:=0; end;
end. |
Wäre echt genial, wenn jemand mir helfen könnte :)
greetz
//me
Raphael O. - So 20.04.03 00:12
geh mal auf delphigl.de dann auf OpenGL und dann in den Tutorials nimmste "Objektauswahl"...
das ist IMO das was du meinst/willst...
Aya - So 20.04.03 00:15
huhu,
nicht verzagen, Aya frange :mrgreen:
Diese procedure sollte dir weiterhelfen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure GetMousePos(MouseX, MouseY, MouseZ: Double); var ModelView, Projection: TMatrix4d; Viewport: TVector4i; ObjX, ObjY, ObjZ: GLDouble; begin glGetDoublev(GL_MODELVIEW_MATRIX,@ModelView); glGetDoublev(GL_PROJECTION_MATRIX,@Projection); glGetIntegerv(GL_VIEWPORT,@Viewport); gluUnProject(MouseX,Viewport[3] - MouseY - 1,MouseZ,ModelView,Projection,Viewport,@ObjX,@ObjY,@ObjZ); MX:=ObjX; MY:=ObjY; MZ:=ObjZ; end; |
MX, MY und MZ ist die Position auf dein OpenGL Fenster umgerechnet.
MouseX, MouseY sind die MausKoordinaten (vom Fenster, also z.B. vom OnMouseDown das X und Y)
MouseZ ist die tiefe der Maus.. sozusagen... ;) Also in welcher tiefe du klickst...
Au'revoir,
Aya~
t/f - So 20.04.03 00:20
jo besten Dank ihr 2 :)...
kleine Frage an Aya... sieht ja furchtbar aus der Quellcode... was passiertn da eigentlich?
Aya - So 20.04.03 00:25
huhu,
Quelltext
1:
| glGetDoublev(GL_MODELVIEW_MATRIX,@ModelView); |
Speichert die aktuelle ModelMatrix nach ModelView.
Quelltext
1:
| glGetDoublev(GL_PROJECTION_MATRIX,@Projection); |
Dasselbe nur mit der ProjektionsMatrix -> Projection ;)
Quelltext
1:
| glGetIntegerv(GL_VIEWPORT,@Viewport); |
Den Viewport speichern... ;)
Quelltext
1: 2:
| gluUnProject(MouseX,Viewport[3] - MouseY - 1,MouseZ,ModelView,Projection,Viewport,@ObjX,@ObjY,@ObjZ); |
Die eigentliche funktion, mit gluUnProject werden WindowsKoordinaten in OpenGL Koordinaten umgewandelt.. mit gluProject genau andersrum, OpenGL -> Windows Koordinaten :)
Au'revoir,
Aya~
t/f - So 20.04.03 00:25
hö? jetzt mal im Nachhinein..... wie was für 'ne Tiefe denn ;) ... mein Form1 ist platt wie ne Briefmarke *g ...
Ich möcht ja 2 Koordinaten eingeben und drei wieder 'rauskriegen ;) ...
t/f - So 20.04.03 00:28
und nocheins.... MX, MY, und MZ müssen als GLDouble deklariert werden, seh' ich das richtig?
Aya - So 20.04.03 00:31
Na ja, dein Fenster ist 2D, klar... aber OpenGL ist 3D ;)
Wenn du einfach nur exakt die stelle willst wo du hinklickst, nimm für MouseZ 0.. :)
MX etc muß GLDouble sein, ja :)
Au'revoir,
Aya~
t/f - So 20.04.03 00:49
Wenn ich in meinem Proggi nun schreibe glTranslate(MX,MY,-10);
müsste ich dann mit meiner "Kamera" jetzt nicht dort landen, wohin ich mit der Maus gezeigt habe?
Irgendwie haut das nicht hin. Der Punkt, der mit der Maus angeklickt wird, soll ja nun in der Mitte meines bildschirms sein. funzt nich :?
Aya - So 20.04.03 00:52
mach es mal so:
Quelltext
1: 2: 3:
| glTranslate(0,0,-10); GetMousePos; glTranslate(MX,MY,0); |
Au'revoir,
Aya~
t/f - So 20.04.03 00:56
hm... will mein compiler nicht ([Fehler] Unit1.pas(105): Nicht genügend wirkliche Parameter), weil ich die mauskoordninaten übergeben soll (hab ich vorher im im OnMouseDown-Ereignis geholt) ... und noch ne kleine Frage... wieso gehe ich eigentlich zum Ursprung zurück? Kann ich mir das erste glTranlate nicht sparen?
Aya - So 20.04.03 01:02
huhu,
sorry.. mein fehler :)
änder die Procedure GetMousePos mal so um das keine parameter gebraucht werden.
jetzt machste drei globale Variablen:
Quelltext
1: 2: 3: 4:
| var MouseX: Integer = 0; MouseY: Integer = 0; MouseZ: Integer = 0; |
und im OnMouseDown machste dann:
Quelltext
1: 2:
| MouseX:=X; MouseY:=Y; |
so sollte es klappen.. :)
und zum glTranslate.. wenn du glTranslate(MX,MY,0) machst heißt das das es in z-Richtung um 0 Einheiten verschoben wird, nicht das es wieder zum 0 punkt zurückgeht ;)
Au'revoir,
Aya~
t/f - So 20.04.03 01:12
... und es will immernoch nicht. Es ruckelt zwar etwas hin und her, aber ich kann hinklicken wo ich will. So wirklich ändert sich meine Position nicht.
:roll: :?:
Aya - So 20.04.03 01:19
huhu,
hier mal nen beispiel.. :)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| var MX, MY, MZ: Single; MouseX, MouseY: Integer;
procedure TForm1.GetMousePos; var ModelView, Projection: TMatrix4d; Viewport: TVector4i; ObjX, ObjY, ObjZ: GLDouble; begin glGetDoublev(GL_MODELVIEW_MATRIX,@ModelView); glGetDoublev(GL_PROJECTION_MATRIX,@Projection); glGetIntegerv(GL_VIEWPORT,@Viewport); gluUnProject(MouseX,Viewport[3] - MouseY - 1,0,ModelView,Projection,Viewport,@ObjX,@ObjY,@ObjZ); MX:=ObjX; MY:=ObjY; MZ:=ObjZ; end;
procedure TForm1.OGLDrawScene(Sender: TObject; hDC: HDC; hRC: Cardinal); begin glTranslate(0,0,-2); glRotate(45,0,1,0); GetMousePos; glTranslate(MX,0,MZ); glBegin(GL_QUADS); glColor3f(1,0,0); glVertex3f(-0.3,-0.3,0); glVertex3f(0.3,-0.3,0); glColor3f(1,1,0); glVertex3f(0.3,0.3,0); glVertex3f(-0.3,0.3,0); glEnd; end;
procedure TForm1.OGLMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin MouseX:=X; MouseY:=Y; end; |
da funktioniert alles wunderbar, vieleicht hilft dir das deinen fehler zu finden :)
Muß jetzt leider erstmal weg, aber wenn das Problem morgen immernoch da ist, dann schick mir doch morgen mal deinen Code und ich schau mal durch :)
Au'revoir,
Aya~
t/f - So 20.04.03 01:31
also da erkenn ich grad noch eine grundlegende Frage:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| X | | Z | / | / | / | / | / | / |/ +-------------------Y |
Sieht so das Koordinatensystem in OpenGl aus? Sind die Achsen etwa anders belegt?
t/f - So 20.04.03 01:52
hm.... ich glaub, jetz weiß ich, wo das probem liegt ;) ...
wir reden nicht über das gleich problem.
Ich befinde mich auf einem Punkt meiner Map und klicke mit der Maus auf einen anderen. Nun soll die Kamera, die ich im Bild gekennzeichnet habe, den Ort, an dem die Maus geklickt wurde, zentrieren. D.h. mann hat als Benutzer das Gefühl, sich auf der Map zu bewegen.
Das mit dem Koordinatensystem ha6t sich soweit erstmal erledigt. Ich denk mal daran liegts nicht.
greetz
//me
Aya - So 20.04.03 04:07
huhu,
also erstmal das Koordinaten System in OpenGL ist:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Y | | Z | / | / | / | / | / | / |/ +-------------------X |
X: Breite
Y: Höhe
Z: Tiefe
wegen deinem Problem... ich hab da leider auch nich direkt ne ahnung woran das liegt... hab den gluUnProject befehl erst einmal benutzt... :oops:
Aber wie gesagt, schick mir doch morgen mal dein Programm und ich schau mal ob ich den fehler finde :) (oder spiel einfach mal ein wenig mit dem MouseZ rum.. veränder da mal die werte auf z.B. -10 :) )
Au'revoir,
Aya~
t/f - So 20.04.03 11:49
Wahnsinn, schläfst du nie? :shock:
Nuja ;) ... *g ... hast mein letztes Posting übersehen glaub ich :?
Ich hab' nu gedacht, wenn ich glTranslate hinter dem Quad einsetz bewegt sich was... aber nö. ;)
t/f - So 20.04.03 22:52
hm... also wenn die Achsen nun so verschoben sind, muss ich das bei meiner Auswertung von MX, MZ etc beachten oder macht die Funktion das alles für mich?
Andreas Pfau - Mo 21.04.03 11:47
Hallo,
ich bin begeistert vom diesem Code, weil ich auch schon nach so was gesucht habe. Aber nu is' nix: Wenn ich das ganze mit einer 2D-Projektion mache (gluOrtho2D()), alles OK. Wenn ich mit glFrustum() eine 3D-Projektion erstelle, klappt auch. Aber ich will gluPerspective verwenden. Und dann liefert gluUnProject einen Fehler:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure MainLoop; var X, Y, Z: Double; S1, S2: String; Modelview, Projection: Array[0..15] Of Double; Viewport: Array[0..3] Of Integer; begin glMatrixMode(GL_Projection); glLoadIdentity; gluPerspective(45, WinX / WinY, 0, 100); // glFrustum(-1,1,-1,1,0.1,100); glMatrixMode(GL_ModelView);
glGetDoublev(GL_Modelview_Matrix, @Modelview); glGetDoublev(GL_Projection_Matrix, @Projection); glGetIntegerv(GL_Viewport, @Viewport); gluUnProject(MouseX, MouseY, MouseWheel, @Modelview, @Projection, @Viewport, X, Y, Z); S1 := 'X=' + IntToStr(MouseX) + ' Y=' + IntToStr(MouseY) + ' Z=' + ValToStr(MouseWheel, 0, 0); S2 := 'X=' + ValToStr(X, 0, 2) + ' Y=' + ValToStr(Y, 0, 2) + ' Z=' + ValToStr(Z, 0, 2);
glMatrixMode(GL_Projection); glLoadIdentity; gluOrtho2D(0, WinX, 0, WinY); glMatrixMode(GL_ModelView);
glColor4f(1.0, 1.0, 1.0, 1.0); CallText(Font_Digital, WinX * 0.700, WinY * 0.130, WinY * 0.025, S1); CallText(Font_Digital, WinX * 0.700, WinY * 0.100, WinY * 0.025, S2); |
MouseX, MouseY und MouseWheel ist klar. WinX und WinY ist die Fenstergröße. CallText() rendert halt den Text. So wie der Code jetzt ist, kommt ein Fehler, d.h. alle Werte (X, Y, Z) sind 0, und wenn man's nachprüft, liefert gluUnProject 0 zurück, d.h. einen Fehler. Schalte ich oben um auf glFrustum, klappt alles.
Woran liegt das? Sag bloß, gluUnProject arbeitet nicht mit 3D-Projektionen???
Andreas Pfau - Mo 21.04.03 14:03
:autsch: Sorry :oops:
So ein dummer Fehler! Ich habe zNear=0 angegeben... das darf man nicht... Jetzt läuft's.
Andreas Pfau - Mo 21.04.03 18:34
Hallo nochmal,
sorry, aber ich krieg's nicht hin! Ich habe eignetlich nur vor, die Cursor-Position auf einem Körper im 3D-Raum zu bestimmen, in meinem Fall mal ein Schachbrett:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| glMatrixMode(GL_Projection); glLoadIdentity; gluPerspective(45, WinX / WinY, 0.1, 100); glMatrixMode(GL_ModelView);
glPushMatrix;
glTranslatef(0, 0, -4); glRotatef(An, 1, 0, 0);
glEnable(GL_Texture_2D); glBindTexture(GL_Texture_2D, Tex_Chess);
glColor4f(1, 1, 1, 1);
glBegin(GL_Quads); glTexCoord2f(0, 0); glVertex3f(-1, -1, 0); glTexCoord2f(0, 1); glVertex3f(-1, +1, 0); glTexCoord2f(1, 1); glVertex3f(+1, +1, 0); glTexCoord2f(1, 0); glVertex3f(+1, -1, 0); glEnd;
glDisable(GL_Texture_2D);
glPopMatrix; |
Ich denke, du verstehst den Code. Ein Schachbrett (Die Textur stellt ein Schachbrett dar) ist an Z=-4, um 45° nach hinten gedreht.
Ich dachte, mit gluUnProject, könnte ich bestimmen, wo sich der Cursor auf dem Brett befindet. Es funktioniert, wenn das Bertt nicht gedreht ist. Aber wenn ich es drehe (um die X-Achse), dann weiß ich ja nicht, an welcher Z-Position ich mich befinde. Und ohne Z gibt's kein X und Y. Verstehst du mein Problem?
Ich könnte zwar mit SelectionMode arbeiten, aber wenn man mal ein größeres Brett hat, reicht halt der SelectionBuffer nicht mehr aus. Wie lässt sich mein kleines Problem lösen???
t/f - Mo 21.04.03 19:29
hey man jetzt hab ichs gecheckt. wir sind ganz schön blöd...
das ganze glu-dingsta hab ich noch nicht wirklich verstanden. ich gehöre zu den anfänger die langsam ansätze von vorkenntnissen in ihre Proggis schreiben *g
nunja Folgendes...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| glTranslate(0,0,-2); glRotate(45,0,1,0); GetMousePos; glBegin(GL_QUADS); glVertex3f(-0.3+MX,-0.3+MY,0+MZ); glVertex3f(0.3+MX,-0.3+MY,0+MZ); glVertex3f(0.3+MX,0.3+MY,0+MZ); glVertex3f(-0.3+MX,0.3+MY,0+MZ); glEnd; |
Mein Prob war ja, dass ich versucht hab' durch glTranslate meinen Standpunkt zu verändern. Das Prinzip von OpenGL ist aber so, dass es keinen Standpunkt gibt ;).... wir kucken immer auf ein und den selben Fleck. Wir bewegen uns nur, indem wir einen Gegstand so hin - und herschieben, dass wir denEindruck haben, als würden wir uns bewegen.
glTranslate bewirkt lediglich die Verschiebung des Urspungs unseres Koordinatensystems.
GetMousePos drüfte an sich dann auch in Ordnung sein, da Aya uns dieses gute Beispiel mit dem zu verschiebenden Qudrat gezeigt hat.
jo ... ich weiß nicht wirklich ob du auch dieses Problem hattest...
GetMausPos haut bei mir super hin... keine Probs mit anderen Prozeduren, die dort eingebunden sind.
greetz
//me
Andreas Pfau - Mo 21.04.03 19:46
Nein, mein Problem ist ein anderes: Deine Fläche (Das Quad) ist flach. Wenn du rausfinden willst, welche Geometriekoordinate eine Mauskoordinate hat, nimmst du als Z den Z-Wert deines Quads. Ich habe aber ein geschwenktes Quad. Das hat an jedem Punkt eine andere Z-Koordinate. Und um die zu ermitteln, brüchte ich X/Y... die Schlange beißt sich selbst in den Schwanz...
t/f - Mo 21.04.03 22:59
und wenn du dabei einfach z (bzw. den KO-Ursprung) vorher mit glTranslate so hindrehst wie du es brauchst?
Andreas Pfau - Di 22.04.03 16:09
Du mussdir das so vorstellen: Z=f(x,y). Woher kenne ich X/Y? Indem ich X=f(Z) und Y=f(Z) mache, denn je tiefer ich in den Screen reingehe, umso schmäler wird die Szene. Also brauche ich für Z X und Y, und für X und y brauche ich Z.
Gibt es evtl. eine andere Lösung, um die Position zu bestimmen? Oder kann ich irgendwie mit SelectionModa arbeiten? Der hat halt nur einen begrenzten Namenstack, aber kann ich den umgehen???
t/f - Di 22.04.03 21:03
ja das meine ich auch. drehe via glRotate dein Koordinatensystem so, das z eine Waagerechte ist, bewege dich in x- und y-Richtung und drehe dich wieder zurück.
...
Ansonsten weiß ich das nicht besser.
Irgendwie haut meine Methode zum anderen Problem auch nicht hin. Scheinbar mache ich irgendwas bei der Verschiebung falsch.
Wär' ja hilfreich, wenn nochmal einer von den Profis das Wort ergreift und am besten 'n bissel Code postet.
greetz
//me
Andreas Pfau - Di 22.04.03 21:17
Soll ich dir was sagen? Es kann nicht gehen. Habe lange drüber nachgedacht. 0 Chance mit gluUnProject, da du ja (nach deinem kleinen Screenshot) auch eine rotierte Matrix hast. Vergiss es.
Was du brüchtest, ist, so heißt es glaube ich, Raytraycing, d.h. eien Straht, der von Auge des Btrachters ausgeht, zu verfolgen, und prüfen, wo er auf's Objekt trifft. Denn was wir hier vorliegen habe, ist nicht De-Projektion, sondern Clipping. Mit der glu-Methode fragst du ja nur "Wenn ich mir den Raum als parallelen 3D-Raum vorstelle, und an XYZ bin, wo wäre ich dann, wenn ich einen perspektivischen 3D-Raum hätte?". Was du aber willst (und ich auch), das wäre "Wenn ich mir den Raum als parallelen 3D-Raum vorstelle, und an XY bin, welches Objekt berühre ich dann im perspektivischen 3D-Raum?". Merkst du was? gluUnProject sagt nix über Objekte aus. Es rechent nur Matitzen um.
Und selbst Selectionmode langt da nicht aus, da müsstest du für jeden Pixel (!) einen namen vergeben. Das geht nicht.
Wie gesagt, du (und ich) brauchst Clipping und Raytracing. Oder wie siehst du das?
t/f - Di 22.04.03 21:27
Also was du mir sagen willst, hab ich irgendwie schon verstanden ;) .... *Turorial 'rauskram* ... aber was die einzelnen Dinger Glu-Dingsta-etc heißen, das muss ich erst noch ergründen.
Aber dann interessier tmihc, wieso Ayas Beispiels funktioniert hat, wenn es eigentlich nicht meine X- nud Y-Koordinate ins 3D Netz bringt (gut wir haben dabei z außer acht gelassen *Stirn runzel*)
greetz
//me
Andreas Pfau - Di 22.04.03 21:32
Nu ja, Aya's Objekt ist FLACH, d.h. die Z ist irrelevant, da sie überall gleich ist. Und da Z überall gleich ist, kannst du sie vorgeben, und somit X und Y berechnen. Bei einer gedrehten Fläche --> Kein Z --> Kein X/Y.
Macht's Klick?
t/f - Di 22.04.03 21:36
ja und das meinte ich ja auch vorhin. angenommen du drehst dein objekt so hin, dass es flach ist, verschiebst deine x- und y-Koordinate und drehst das Objekt danach wieder zurück.... sollte doch eigentlich hinhaun oder?
Das dumme bei meinem Prog war nur, dass ich nichtmal die x- und y-Koordinate auf dem Ding verschoben krieg. Eigentlich sieht das so einfach aus - richtig depremierend.
greetz
//me
Andreas Pfau - Di 22.04.03 21:44
Nee, das geht nicht. Stell dir sie Silhouette vor (denn die sieht man ja nur auf dem Screen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| +------------+ | | | +-+ | | / \ | | / \ | | +-------+ | | | +------------+ |
OK, das ist deine Fläche, nach hinte geschwenkt. Nun rotierst du sie, bis sie flach ist:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| +------------+ | | | +---+ | | | | | | | | | | +---+ | | | +------------+ |
So nun stimmen aber die Screenkoordinaten nicht mehr, also kannste deine Methode vergessen.
Andreas Pfau - Do 24.04.03 16:16
Titel: geöffnet"
Hä? Was habe denn Kameras damit zu tun?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!