-
Hallo.
Erstmal:
Ich lerne erst seit ca. 96 Stunden OpenGL in Verbindung mit der WinAPI, deshalb rechnet bitte nicht mit zu viel Wissen oder Können.
Ich habe aus "GL_QUADS" einen Quader erstellt und möchte, dass sich dieser durch Benutzereingaben bewegt. Mein Problem ist/war der Zoom. Inzwischen mache ich es mit glScalef, aber ich sehe ziemlich oft, dass es mit glTranslatef ( 0, 0, zoom ); gemacht wird. Bei mir verschwindet der Quader dann einfach. Bei der X -oder Y-Achse gibt es keine Probleme.
Danke, an alle, die helfen!
Mfg
üäpöol
-
Hallo,
Mit welcher OpenGL Version arbeitest du zu Zeit? Ab OpenGL 3 ist sowohl glBegin, als auch glScalef/glTranslatef deprected. Daher die Frage ob du dir nicht lieber gleich die aktuelle API anschaust.
Zu deinem Problem: Möglicherweise schiebst du den Würfel hinter deine Far-Plane oder vor deine Near-Plane (die hast du vermutlich mit glFrustum gesetzt). Solltes das nicht sein solltest du mal etwas Code posten, dann schauen wir weiter.
-
Hm. Mit welcher Version ich arbeitet, weiß ich im Moment leider nicht so genau. (Es ist schon ein bisschen her, dass ich es runtergeladen habe.) Ich glaube, es war Version 3.7, bin mir aber nicht sicher.

Was bedeuted "deprected"?
Ich benutzte glOrtho, statt glFrustum, aber es bewegt sich eine Zeitlang nich´s (ca. 1 sek.) und dann ist es weg. Ich poste mal ein bisschen Code.
Code :1 2 3 4 5 6 7 8 9 10
case WM_KEYDOWN: switch ( wParam ) { case VK_ADD: zoom = zoom - 0.001; glTranslatef ( 0, 0, zoom ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break;
-
Welche Parameter hast du denn bei glOrtho übergeben? glOrtho erzeugt dir übrigends eine Parallelprojektion, glFrustrum eine perspektivische Projektion.
Weils mir grad noch aufgefallen ist: Lässt du das Fenster immer nur neu Zeichnen wenn sich was verändert hat, oder nach jedem Durchlauf der Renderschleife? Du darfst SwapBuffers auf jeden Fall nur einmal pro Frame aufrufen.
-
glOrtho sieht bei mir so aus:
Aber mir ist grade etwas aufgefallen. Wenn ich den Quader ein bisschen drehe, sehe ich schon, dass er sich bewegt. Nur, wenn ich gerade draufschaue, passiert nichts.Code :1
glOrtho ( -1.0, 1.0, -1.0f, 1.0f, -1.0f, 1.0f );
Ich lasse, das Fenster immer neu zeichnen, wenn sich etwas verändert.
-
Hallo,
Der Grund warum du von vorne keine Veränderung siehst liegt, wie oben schon erwähnt, daran, dass du mit einer Parallelprojektion arbeitest. Wenn du Tiefenwahrnemung brauchst, musst eine perspektivische Projektion verwenden.
Das Verschwinden des Würfels ist genau so wie vermutet dadurch bedingt, dass du ihn hinter die Far-Plane schiebst, welche du mit 1.0f angegeben hast. (siehe glOrtho) Wenn daher dein Würfel weiter weg ist als 1.0 wird er geclippt.
Version 3.7 gibts nicht. Es gibt nur 3.1, 3.2 und dann 4.Ich glaube, es war Version 3.7
Das war mein Fehler, hätte "deprecated" heißen sollen. Bedeutet, dass diese Befehle zwar in der aktuellen Version noch drin sind, aber nicht mehr genutzt werden sollten da sie in einer der nächsten verschwinden werden. Der Grund dafür ist in diesem Fall das die von mir oben genannten Funktion (und einigen weitere) nur auf Basis der Fixed Function Pipeline funktionieren und diese auf moderner Hardware nicht mehr direkt unterstützt wird.Was bedeuted "deprected"?
-
Ich habe nachgeschaut, es ist Version 3.1.
Heißt das zusammengefasst, dass glFrustum benutzen muss?
Wie kann man denn die anderen Funktionen ersetzten?
Um einen Link oder ein Buchtipp wäre ich sehr dankbar.
Ich probier´s heute Abend mal so aus. Nur ejtzt ahb ich keine Zeit.
-
Für den Anfang wirds reichen wenn du auf glFrustrum umsteigst und den Wert für die farPlane auf was größeres als 1 setzt.
Buchtipps:
OpenGL Superbible (ab der fifth Edition)
Ich hab dir auch einen Link per PM geschickt wo du ein paar Links findest.
-
Vielen herzlichen Dank!
-
Ach verdammt.

Ich war mir schon sicher, dass das die Lösung sei, aber es hat nichts geändert.
Es muss ein anderer Fehler sein.
Soll ich mal den ganzen Code posten?
-
Ja bitte, du kannst ihn eh hier im Forum hochladen. Lad bitte auch die Projektfiles mit hoch.
-
Hm. Die Datei ist aus einem, mir unbekannten Grund, "ungültig". Vielleicht reicht ja erstmal der Code. Ich kümmere ich mal morgen um dieses Problem. Heute bin ich ein bisschen zu müde.

Code :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 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
// MAIN.CPP // #include <Windows.h> #include <glut.h> #include <gl\GL.h> #include <gl\GLU.h> LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); HWND hWnd; HINSTANCE hInstance; HDC hDC; HGLRC hRC; float zoom = 0.0; PIXELFORMATDESCRIPTOR pfd = { sizeof ( PIXELFORMATDESCRIPTOR ), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0 }; int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR szCmdLine, int iCmdShow ) { hInstance = hInst; const char szClassname[] = "hWnd"; MSG msg; WNDCLASS wc; wc.cbClsExtra = NULL; wc.cbWndExtra = NULL; wc.hbrBackground = NULL; wc.hCursor = LoadCursor ( NULL, IDC_ARROW ); wc.hIcon = LoadIcon ( NULL, IDI_APPLICATION ); wc.hInstance = hInst; wc.lpfnWndProc = WndProc; wc.lpszClassName = szClassname; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; if ( ! RegisterClass ( &wc ) ) { MessageBox ( NULL, "Das Fenster konnte nicht erstellt werden.", "Fehler", MB_OK | MB_ICONERROR ); return 1; } hWnd = CreateWindow ( szClassname, "Bewegung im Raum", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 100, 100, 800, 600, NULL, NULL, NULL, NULL ); if ( ! hWnd ) { MessageBox ( NULL, "Das Fenster konnte nicht erstellt werden.", "Fehler", MB_OK | MB_ICONERROR ); return 1; } ShowWindow ( hWnd, SW_SHOW ); UpdateWindow ( hWnd ); while ( GetMessage ( &msg, NULL, 0, 0 ) ) { TranslateMessage ( &msg ); DispatchMessage ( &msg ); } return 0; } LRESULT CALLBACK WndProc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { int iPF; switch ( msg ) { case WM_CREATE: hDC = GetDC ( hwnd ); iPF = ChoosePixelFormat ( hDC, &pfd ); SetPixelFormat ( hDC, iPF, &pfd ); hRC = wglCreateContext ( hDC ); wglMakeCurrent ( hDC, hRC ); glViewport ( 0, 0, ( GLsizei ) 800 , ( GLsizei ) 600 ); glMatrixMode ( GL_PROJECTION ); glLoadIdentity ( ); glFrustum ( -1.0, 1.0, -1.0f, 1.0f, -1.0f, 1.0f ); glLoadIdentity ( ); glMatrixMode ( GL_MODELVIEW ); break; case WM_KEYDOWN: switch ( wParam ) { case VK_ADD: zoom = zoom - 0.1; glTranslatef ( 0, 0, zoom ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; case VK_SUBTRACT: glEnable(GL_DEPTH_TEST); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glRotatef ( 10.0, 0, 0, 0 ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; case 'X': glEnable(GL_DEPTH_TEST); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glRotatef ( 5, 0, 1, 0 ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; case 'Y': glEnable(GL_DEPTH_TEST); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glRotatef ( 5, 1, 0, 0 ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; case 'Z': glEnable(GL_DEPTH_TEST); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glRotatef ( 5, 0, 0, 1 ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; case VK_LEFT: glEnable(GL_DEPTH_TEST); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glTranslatef ( 0.025, 0, 0 ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; case VK_RIGHT: glEnable(GL_DEPTH_TEST); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glTranslatef ( -0.025, 0, 0 ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; case VK_UP: glEnable(GL_DEPTH_TEST); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glTranslatef ( 0, 0.025, 0 ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; case VK_DOWN: glEnable(GL_DEPTH_TEST); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glTranslatef ( 0, -0.025, 0 ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break; } break; case WM_PAINT: glEnable(GL_DEPTH_TEST); glClearColor ( 1.0f, 1.0f, 1.0f, 1.0f ); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glBegin ( GL_QUADS ); glColor3f ( 1, 0, 0 ); glVertex3f ( -0.25, 0.25, 0 ); glVertex3f ( -0.25, -0.25, 0 ); glVertex3f ( 0.25, -0.25, 0 ); glVertex3f ( 0.25, 0.25, 0 ); glColor3f ( 0, 1, 0 ); glVertex3f ( -0.25, 0.25, 0 ); glVertex3f ( -0.25, -0.25, 0 ); glVertex3f ( -0.25, -0.25, -0.25 ); glVertex3f ( -0.25, 0.25, -0.25 ); glColor3f ( 0, 0, 1 ); glVertex3f ( 0.25, 0.25, 0 ); glVertex3f ( 0.25, -0.25, 0 ); glVertex3f ( 0.25, -0.25, -0.25 ); glVertex3f ( 0.25, 0.25, -0.25 ); glColor3f ( 1, 1, 0 ); glVertex3f ( -0.25, 0.25, -0.25 ); glVertex3f ( -0.25, -0.25, -0.25 ); glVertex3f ( 0.25, -0.25, -0.25 ); glVertex3f ( 0.25, 0.25, -0.25 ); glColor3f ( 0, 1, 1 ); glVertex3f ( -0.25, 0.25, 0 ); glVertex3f ( 0.25, 0.25, 0 ); glVertex3f ( 0.25, 0.25, -0.25 ); glVertex3f ( -0.25, 0.25, -0.25 ); glColor3f ( 1, 0, 1 ); glVertex3f ( -0.25, -0.25, 0 ); glVertex3f ( 0.25, -0.25, 0 ); glVertex3f ( 0.25, -0.25, -0.25 ); glVertex3f ( -0.25, -0.25, -0.25 ); glEnd ( ); glFlush ( ); SwapBuffers ( hDC ); ValidateRect ( hwnd, NULL ); break; case WM_DESTROY: wglMakeCurrent ( hDC, NULL ); wglDeleteContext ( hRC ); PostQuitMessage ( 0 ); break; } return DefWindowProc ( hwnd, msg, wParam, lParam ); }
-
Nochmal der Hinweis von oben: Du musst die Farplane auf was größeres als 1 setzen.
-
Achso, das hab ich vergessen zu erwähnen. Auch das hab ich schon ausprobiert (Ich hab viel rumprobiert
). Hat aber leider nichts geändert.
-
Hallo,
Ich hab mich jetzt mal durch deinen Code durchgearbeitet, du verwendest nicht Visual Studio oder?
Aber egal, hier mal die wichtigsten Sachen damit das Programm mal läuft:
Projektionsmatrix:
Code cpp:1 2 3
glLoadIdentity ( ); glFrustum ( -1.0, 1.0, -1.0f, 1.0f, -1.0f, 1.0f ); glLoadIdentity ( );
Du lädtst dir als erstes eine Identitätsmatrix in den MatrixStack (glLoadIdentity), dann schreibst du eine Perspektivische Matrix drüber (wobei hier auch die Parameter nicht passen). Und zu guter letzt überschreibst du in der dritten Zeile alles was vorher was mit einer Identitätsmatrix --> im Matrixstack steht nur eine Identitätsmatrix. Das erklärt mal warum du keine Tiefenwahrnehmung hast.
zu glFrustrum: Ein bisschen selbst in der Doku nachschlagen wäre schon notwendig: Dort steht z.B.:
Fensterseitenverhältnis:GL_INVALID_VALUE is generated if nearVal or farVal is not positive, ...
Da dein Fenster nicht rechteckig ist muss sich dies auch in der Projektionsmatrix wiederspiegeln, also musst du bottom und top Werte geben die das Seitenverhältnis von Höhe/Breite wiederspiegeln.
Gesammt sollte der Code für die Projektionsmatrix so aussehen
Code cpp:1 2 3 4
glMatrixMode ( GL_PROJECTION ); glLoadIdentity ( ); float aspectRatio = 600.0f/800.0f; glFrustum ( -1.0, 1.0, -aspectRatio, aspectRatio, 0.1f, 10.0f );
Zoom:
glTranslatef multipliziert (genauso wie glRotatef) immer den aktuellen Wert zum bereits bestehenden dazu, daher kannst du nicht zuerst 0.1, dann 0.2 und dann 0.3 übergeben wenn du drei Schritte weg willst (ergibt ja gesammt 0.6), sondern musst jedes mal 0.1 verwenden. Anzumerken ist hier das du das bei den Rotationen ja auch schon so gemacht hast, indem du jedes mal 5 Grad übergibst.
Der Code sollte dann so ausschauen
Code cpp:1 2 3 4 5 6
case VK_ADD: glTranslatef ( 0, 0, -0.01f ); glFlush ( ); SwapBuffers ( hDC ); InvalidateRect ( hwnd, NULL, true ); break;
Ach ja nebenbei, der Würfel ist bei dir kein Würfel.
Edit: Wenn du schon mit OpenGL Fixed Function arbeiten möchtest, solltest du wenigstens auf GLUT verzichten, wie man auf der Homepage sieht wurde daran seit 2001 nicht mehr gearbeitet. 10 Jahre sind grad im Bereich der Spieleentwicklung einfach zu lange, vorallem da du bis jetzt keine GLUT Funktionalitäten nutzt.Geändert von Steiner_B (06.08.11 um 13:28 Uhr) Grund: Noch was eingefallen
Ähnliche Themen
-
JQuery Fancybox mit Script anpassen funtkioniert nicht ganz
Von Jan-Frederik Stieler im Forum Javascript & AjaxAntworten: 8Letzter Beitrag: 16.09.10, 13:11 -
php für Zoom funktioniert nicht
Von c4er im Forum PHPAntworten: 7Letzter Beitrag: 20.11.08, 14:41 -
Unterstützung für OpenGL Entwicklung mit Java via Netbeans und OpenGL Pack
Von Thomas Darimont im Forum JavaAntworten: 0Letzter Beitrag: 04.06.08, 15:13 -
cipher funtkioniert nicht so wie ich das will
Von jer1cho im Forum JavaAntworten: 2Letzter Beitrag: 13.08.07, 08:57 -
[C++ & OGL] Problem mit glRotatef und glTranslatef
Von Gothicfreak im Forum Borland CBuilder und VCLAntworten: 0Letzter Beitrag: 25.06.07, 19:02



14Danke

Zitieren
Login






