tutorials.de Buch-Aktion 05/2012
Seite 1 von 3 123 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
33
ZUGRIFFE
1028
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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
     

  2. #2
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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.
    üäpöol bedankt sich. 

  3. #3
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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;
     

  4. #4
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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.
    üäpöol bedankt sich. 

  5. #5
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    glOrtho sieht bei mir so aus:
    Code :
    1
    
    glOrtho ( -1.0, 1.0, -1.0f, 1.0f, -1.0f, 1.0f );
    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.
    Ich lasse, das Fenster immer neu zeichnen, wenn sich etwas verändert.
     

  6. #6
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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.

    Ich glaube, es war Version 3.7
    Version 3.7 gibts nicht. Es gibt nur 3.1, 3.2 und dann 4.

    Was bedeuted "deprected"?
    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.
    üäpöol bedankt sich. 

  7. #7
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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.
     

  8. #8
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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.
    üäpöol bedankt sich. 

  9. #9
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Vielen herzlichen Dank!
     

  10. #10
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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?
     

  11. #11
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Ja bitte, du kannst ihn eh hier im Forum hochladen. Lad bitte auch die Projektfiles mit hoch.
    üäpöol bedankt sich. 

  12. #12
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    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 );
    }
     

  13. #13
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Nochmal der Hinweis von oben: Du musst die Farplane auf was größeres als 1 setzen.
    üäpöol bedankt sich. 

  14. #14
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Achso, das hab ich vergessen zu erwähnen. Auch das hab ich schon ausprobiert (Ich hab viel rumprobiert ). Hat aber leider nichts geändert.
     

  15. #15
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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.:
    GL_INVALID_VALUE is generated if nearVal or farVal is not positive, ...
    Fensterseitenverhältnis:
    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
    üäpöol bedankt sich. 

Ähnliche Themen

  1. JQuery Fancybox mit Script anpassen funtkioniert nicht ganz
    Von Jan-Frederik Stieler im Forum Javascript & Ajax
    Antworten: 8
    Letzter Beitrag: 16.09.10, 13:11
  2. php für Zoom funktioniert nicht
    Von c4er im Forum PHP
    Antworten: 7
    Letzter Beitrag: 20.11.08, 14:41
  3. Antworten: 0
    Letzter Beitrag: 04.06.08, 15:13
  4. Antworten: 2
    Letzter Beitrag: 13.08.07, 08:57
  5. [C++ & OGL] Problem mit glRotatef und glTranslatef
    Von Gothicfreak im Forum Borland CBuilder und VCL
    Antworten: 0
    Letzter Beitrag: 25.06.07, 19:02

Stichworte