OpenGL - Begrenzter 3D-Raum?



  • Hi zusammen

    Ich habe ein Programm geschrieben bei welchem man einen Drathgitter-Würfel mit der W- und der S-Taste auf der Z-Achse nach vorne und nach hinten schieben kann. Wenn man die W-Taste eine Weile gedrückt hält, verschwindet der w
    Würfel einfach! Dann habe ich einen Boden hinzugefügt. Wenn der Würfel die hintere Kante der Fläche berührt, verschwindet alles was dahinter ist.
    Ich bin noch nicht sehr lange mit OpenGL tätig, deshalb kann es sein, dass ich einen Anfängerfehler gemacht habe.

    Hier der Code:

    #include <windows.h>
    #include <gl/gl.h>
    
    LRESULT CALLBACK WndProc    (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    void   EnableOpenGL         (HWND hWnd, HDC *hDC, HGLRC *hRC);
    void   DisableOpenGL        (HWND hWnd, HDC hDC, HGLRC hRC);
    
    int WINAPI WinMain (HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int iCmdShow)
    {
        WNDCLASS wc;
        HWND hWnd;
        HDC hDC;
        HGLRC hRC;        
        MSG msg;
        bool bQuit = false;
    
        wc.style = CS_OWNDC;
        wc.lpfnWndProc = WndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInstance;
        wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wc.hCursor = LoadCursor (NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
        wc.lpszMenuName = NULL;
        wc.lpszClassName = "OpenGL_WND";
        RegisterClass (&wc);
    
        hWnd = CreateWindowA (
          "OpenGL_WND",
          "OpenGL",
          WS_POPUPWINDOW | WS_VISIBLE ,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,                               
          NULL,
          hInstance,
          NULL);
    
        ShowWindow(hWnd, SW_SHOWMAXIMIZED);
    
        EnableOpenGL (hWnd, &hDC, &hRC);
    
        while (!bQuit)
        {
            if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
            {
                if (msg.message == WM_QUIT)
                {
                    bQuit = true;
                }
                else
                {
                    TranslateMessage (&msg);
                    DispatchMessage (&msg);
                }
            }
            else
            {
                glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
                glClear (GL_COLOR_BUFFER_BIT);
    
                glShadeModel(GL_SMOOTH);
    
                glEnable (GL_BLEND);
                glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
                static float PosZ = 0.0f;
                if(GetAsyncKeyState(83) < 0)
                {
                  PosZ += 0.005f;
                }
                if(GetAsyncKeyState(87) < 0)
                {
                  PosZ -= 0.005f;
                }
    
                static float RotX = 25.0f;
                static float RotY = 10.0f;
    
                POINT MousePos;
                GetCursorPos(&MousePos);
    
                static int LastCurPosX;
                static int LastCurPosY;
    
                if((GetAsyncKeyState(VK_LBUTTON) < 0) || (GetAsyncKeyState(VK_RBUTTON) < 0) || (GetAsyncKeyState(VK_MBUTTON) < 0))
                {
                  RotX += (float)((float)MousePos.x - (float)LastCurPosX) / 2.5f;
                  RotY += (float)((float)MousePos.y - (float)LastCurPosY) / 2.5f;
                }
    
                LastCurPosX = MousePos.x;
                LastCurPosY = MousePos.y;
    
                glPushMatrix();
    
                        glRotatef(RotY, 1, 0, 0);
                        glRotatef(RotX, 0, 1, 0);
    
                        glBegin(GL_QUADS);
    
                                glColor3f(1.0f, 0.0f, 1.0f);
                                glVertex3f(-1.0f, -0.5f,  1.0f);
    
                                glColor3f(0.0f, 1.0f, 1.0f);
                                glVertex3f(-1.0f, -0.5f, -1.0f);
    
                                glColor3f(1.0f, 1.0f, 0.0f);
                                glVertex3f( 1.0f, -0.5f, -1.0f);
    
                                glColor3f(1.0f, 0.5f, 0.0f);
                                glVertex3f( 1.0f, -0.5f,  1.0f);
    
                        glEnd();
    
                        glTranslatef(0.0f, 0.0f, PosZ);
    
                        glLineWidth(5.0f);
    
                        glBegin(GL_LINES);
    
                                glColor4d(1.0f, 1.0f, 1.0f, 1.0f);
    
                                glVertex3f(-0.5, -0.5, -0.5);
                                glVertex3f(-0.5,  0.5, -0.5);
    
                                glVertex3f(-0.5,  0.5, -0.5);
                                glVertex3f( 0.5,  0.5, -0.5);
    
                                glVertex3f( 0.5,  0.5, -0.5);
                                glVertex3f( 0.5, -0.5, -0.5);
    
                                glVertex3f( 0.5, -0.5, -0.5);
                                glVertex3f(-0.5, -0.5, -0.5);
    
                                glVertex3f(-0.5, -0.5, -0.5);
                                glVertex3f( 0.5,  0.5, -0.5);
    
                        glEnd();
    
                        glBegin(GL_LINES);
    
                                glColor4d(1.0f, 1.0f, 1.0f, 1.0f);
    
                                glVertex3f(-0.5, -0.5,  0.5);
                                glVertex3f(-0.5,  0.5,  0.5);
    
                                glVertex3f(-0.5,  0.5,  0.5);
                                glVertex3f( 0.5,  0.5,  0.5);
    
                                glVertex3f( 0.5,  0.5,  0.5);
                                glVertex3f( 0.5, -0.5,  0.5);
    
                                glVertex3f( 0.5, -0.5,  0.5);
                                glVertex3f(-0.5, -0.5,  0.5);
    
                                glVertex3f(-0.5, -0.5,  0.5);
                                glVertex3f( 0.5,  0.5,  0.5);
    
                        glEnd();
    
                        glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
    
                        glBegin(GL_LINES);
    
                                glColor4d(1.0f, 1.0f, 1.0f, 1.0f);
    
                                glVertex3f(-0.5, -0.5, -0.5);
                                glVertex3f(-0.5,  0.5, -0.5);
    
                                glVertex3f(-0.5,  0.5, -0.5);
                                glVertex3f( 0.5,  0.5, -0.5);
    
                                glVertex3f( 0.5,  0.5, -0.5);
                                glVertex3f( 0.5, -0.5, -0.5);
    
                                glVertex3f( 0.5, -0.5, -0.5);
                                glVertex3f(-0.5, -0.5, -0.5);
    
                                glVertex3f(-0.5, -0.5, -0.5);
                                glVertex3f( 0.5,  0.5, -0.5);
    
                        glEnd();
    
                        glBegin(GL_LINES);
    
                                glColor4d(1.0f, 1.0f, 1.0f, 1.0f);
    
                                glVertex3f(-0.5, -0.5,  0.5);
                                glVertex3f(-0.5,  0.5,  0.5);
    
                                glVertex3f(-0.5,  0.5,  0.5);
                                glVertex3f( 0.5,  0.5,  0.5);
    
                                glVertex3f( 0.5,  0.5,  0.5);
                                glVertex3f( 0.5, -0.5,  0.5);
    
                                glVertex3f( 0.5, -0.5,  0.5);
                                glVertex3f(-0.5, -0.5,  0.5);
    
                                glVertex3f(-0.5, -0.5,  0.5);
                                glVertex3f( 0.5,  0.5,  0.5);
    
                        glEnd();
    
                        glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
    
                        glBegin(GL_LINES);
    
                                glColor4d(1.0f, 1.0f, 1.0f, 1.0f);
    
                                glVertex3f(-0.5, -0.5, -0.5);
                                glVertex3f(-0.5,  0.5, -0.5);
    
                                glVertex3f(-0.5,  0.5, -0.5);
                                glVertex3f( 0.5,  0.5, -0.5);
    
                                glVertex3f( 0.5,  0.5, -0.5);
                                glVertex3f( 0.5, -0.5, -0.5);
    
                                glVertex3f( 0.5, -0.5, -0.5);
                                glVertex3f(-0.5, -0.5, -0.5);
    
                                glVertex3f(-0.5, -0.5, -0.5);
                                glVertex3f( 0.5,  0.5, -0.5);
    
                        glEnd();
    
                        glBegin(GL_LINES);
    
                                glColor4d(1.0f, 1.0f, 1.0f, 1.0f);
    
                                glVertex3f(-0.5, -0.5,  0.5);
                                glVertex3f(-0.5,  0.5,  0.5);
    
                                glVertex3f(-0.5,  0.5,  0.5);
                                glVertex3f( 0.5,  0.5,  0.5);
    
                                glVertex3f( 0.5,  0.5,  0.5);
                                glVertex3f( 0.5, -0.5,  0.5);
    
                                glVertex3f( 0.5, -0.5,  0.5);
                                glVertex3f(-0.5, -0.5,  0.5);
    
                                glVertex3f(-0.5, -0.5,  0.5);
                                glVertex3f( 0.5,  0.5,  0.5);
    
                        glEnd();
    
                glPopMatrix();
    
                SwapBuffers(hDC);
            }
        }
    
        DisableOpenGL (hWnd, hDC, hRC);
    
        DestroyWindow (hWnd);
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                              WPARAM wParam, LPARAM lParam)
    {
    
        switch (message)
        {
          case WM_CREATE:
              return 0;
          case WM_CLOSE:
              PostQuitMessage (0);
              return 0;
    
          case WM_DESTROY:
              return 0;
    
          case WM_KEYDOWN:
              return 0;
    
          default:
              return DefWindowProc (hWnd, message, wParam, lParam);
        }
    }
    
    void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
    {
        PIXELFORMATDESCRIPTOR pfd;
        int iFormat;
    
        *hDC = GetDC (hWnd);
    
        ZeroMemory (&pfd, sizeof (pfd));
        pfd.nSize = sizeof (pfd);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW |
          PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 24;
        pfd.cDepthBits = 16;
        pfd.iLayerType = PFD_MAIN_PLANE;
        iFormat = ChoosePixelFormat (*hDC, &pfd);
        SetPixelFormat (*hDC, iFormat, &pfd);
    
        *hRC = wglCreateContext( *hDC );
        wglMakeCurrent( *hDC, *hRC );
    
    }
    
    void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
    {
        wglMakeCurrent (NULL, NULL);
        wglDeleteContext (hRC);
        ReleaseDC (hWnd, hDC);
    }
    

    Vielen Dank im Voraus!



  • gluPerspective(45.0f,x/y,0.1f,100.0f);
    Letzter Parameter steht für die Tiefe.



  • Such mal nach farplane



  • Danke für die schnelle Antwort!

    @Kóyaánasqatsi
    Was bedeuten die einzelnen Parameter?



  • X.DarkForce.X schrieb:

    Danke für die schnelle Antwort!

    @Kóyaánasqatsi
    Was bedeuten die einzelnen Parameter?

    Ein bischen Eigeninitiative darf man hoffentlich vorraussetzen?
    Wenn man nach gluPerspective googelt erhält man zig Suchergebnisse zu Seiten, auf denen genau diese Frage beantwortet wird:

    gluPerspective



  • Wieviel nehmt ihr eigentlich? Es soll eine Ego-Shooter werden...



  • Das kann man nicht pauschalisieren - hängt davon ab, was du wie anzeigen möchtest.

    • fovy - Kann in einem shooter normalerweise vom Spieler selbst gewählt werden (natürlich nur innerhalb eines definierten Intervalls). Beim snipern würde man hier einen ziemlich kleinen Wert setzten, dadurch wird der zoom-effekt realisiert), ansonsten eben einen normalen Wert (60-90).
    • aspect - ist denke ich klar
    • zNear - gibst du einen zu grossen Wert ein, wird eben alles geclippt (sprich nicht angezeigt) was näher ist.
    • zFar - bei grossen Werten wird natürlich weniger geclippt - dafür muss aber eben auch mehr gerendert werden. Benutzt du beispielsweise Nebel (fog), so wird die Weitsicht ohnehin durch den Nebel beschränkt, sodass du entsprechend auch zFar so setzen kannst, dass alles geclippt wird, was ohnehin nicht durch den Nebel gesehen werden kann. Für extreme Weitsicht muss der Wert natürlich gross sein.

    Die Genauigkeit des Tiefenpuffers nimmt aber mit Zunehmendem Verhältniss von zFar zu zNear ab.

    Übrigens ist die äquivaltente Funktion aus der gl-library glFrustum.



  • X.DarkForce.X schrieb:

    Wieviel nehmt ihr eigentlich? Es soll eine Ego-Shooter werden...

    25 Euro pro Stunde



  • TGGC schrieb:

    X.DarkForce.X schrieb:

    Wieviel nehmt ihr eigentlich? Es soll eine Ego-Shooter werden...

    25 Euro pro Stunde

    für 26 hätt ich paar nette frauen die beglückt werden wollen 😉


Anmelden zum Antworten