Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL] Wyświetlanie brył przestrzennych

Ostatnio zmodyfikowano 2012-07-13 11:33
Autor Wiadomość
tommy8
Temat założony przez niniejszego użytkownika
[OpenGL] Wyświetlanie brył przestrzennych
» 2012-07-12 13:17:56
Mam poniższy kod (lekko przerobiony z szablonu projektu w Code::Blocks):
C/C++
#include <windows.h>
#include <gl/glu.h>

LRESULT CALLBACK WindowProc( HWND, UINT, WPARAM, LPARAM );
void EnableOpenGL( HWND hwnd, HDC *, HGLRC * );
void DisableOpenGL( HWND, HDC, HGLRC );


int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
    WNDCLASSEX wcex;
    HWND hwnd;
    HDC hDC;
    HGLRC hRC;
    MSG msg;
    BOOL bQuit = FALSE;
    float theta = 0.0f;
   
    // register window class
    wcex.cbSize = sizeof( WNDCLASSEX );
    wcex.style = CS_OWNDC;
    wcex.lpfnWndProc = WindowProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
    wcex.hbrBackground =( HBRUSH ) GetStockObject( BLACK_BRUSH );
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "GLSample";
    wcex.hIconSm = LoadIcon( NULL, IDI_APPLICATION );;
   
   
    if( !RegisterClassEx( & wcex ) )
         return 0;
   
    // create main window
    hwnd = CreateWindowEx( 0,
    "GLSample",
    "OpenGL Sample",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    500,
    500,
    NULL,
    NULL,
    hInstance,
    NULL );
   
    ShowWindow( hwnd, nCmdShow ); //        SW_MAXIMIZE
   
    // enable OpenGL for the window
    EnableOpenGL( hwnd, & hDC, & hRC );
   
    // program main loop
    while( !bQuit )
    {
        // check for messages
        if( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) )
        {
            // handle or dispatch messages
            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 );
           
            glPushMatrix();
           
            /**   Tu zaszly zmiany   */
            glRotatef( theta, 1, 1, 0 );
           
            ///     ramiona ostroslupa
            glBegin( GL_TRIANGLES );
           
            glColor3f( 0, 1, 1 ); //seledynowy
           
            glVertex3f( - 0.5, 0, 0.5 ); ///1
            glVertex3f( 0.5, 0, 0.5 );
            glVertex3f( 0, 1, 0 );
           
           
            glColor3f( 0, 1, 0 ); //zielony
           
           
            glVertex3f( - 0.5, 0, - 0.5 ); ///2
            glVertex3f( 0.5, 0, - 0.5 );
            glVertex3f( 0, 1, 0 );
           
            glColor3f( 0, 0, 1 ); //niebieski
           
            glVertex3f( - 0.5, 0, - 0.5 ); ///3
            glVertex3f( - 0.5, 0, 0.5 );
            glVertex3f( 0, 1, 0 );
           
           
            glColor3f( 1, 1, 0 ); //zolty
            glVertex3f( 0.5, 0, 0.5 ); ///4
            glVertex3f( 0.5, 0, - 0.5 );
            glVertex3f( 0, 1, 0 );
           
            glEnd();
           
            ///     podstawa ostroslupa
           
            glBegin( GL_POLYGON );
            glColor3f( 1, 1, 1 ); //bialy
           
            glVertex3f( 0.5, 0, 0.5 );
            glVertex3f( 0.5, 0, - 0.5 );
            glVertex3f( - 0.5, 0, - 0.5 );
            glVertex3f( - 0.5, 0, 0.5 );
           
           
           
            glEnd();
           
            glPopMatrix();
           
            SwapBuffers( hDC );
           
            theta += 1.0f;
            Sleep( 1 );
        }
    }
   
    // shutdown OpenGL
    DisableOpenGL( hwnd, hDC, hRC );
   
    // destroy the window explicitly
    DestroyWindow( hwnd );
   
    return msg.wParam;
}

LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch( uMsg )
    {
    case WM_CLOSE:
        PostQuitMessage( 0 );
        break;
       
    case WM_DESTROY:
        return 0;
       
    case WM_KEYDOWN:
        {
            switch( wParam )
            {
            case VK_ESCAPE: PostQuitMessage( 0 ); break;
            }
        }
        break;
       
        default: return DefWindowProc( hwnd, uMsg, wParam, lParam );
    }
   
    return 0;
}

void EnableOpenGL( HWND hwnd, HDC * hDC, HGLRC * hRC )
{
    PIXELFORMATDESCRIPTOR pfd;
   
    int iFormat;
   
    // get the device context (DC)
    * hDC = GetDC( hwnd );
   
    // set the pixel format for the DC
    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 );
   
    // create and enable the render context (RC)
    * hRC = wglCreateContext( * hDC );
   
    wglMakeCurrent( * hDC, * hRC );
}

void DisableOpenGL( HWND hwnd, HDC hDC, HGLRC hRC )
{
    wglMakeCurrent( NULL, NULL );
    wglDeleteContext( hRC );
    ReleaseDC( hwnd, hDC );
}
Chodzi mi o to, żeby w obracającym się ostrosłupie lepiej widoczne były ścianki znajdujące się "bliżej widza", bo jak na razie zawsze niezależnie od położenia widoczne są te "później opisane" w kodzie. Skompilujcie i zobaczcie o co biega.
P-59884
xevuel
» 2012-07-12 13:26:59
» Kurs STC » Kolorowanie składniKolorowanie składni języka C++ lekcja

Nie kompilowałem, ale myślę, że użycie bufora głębokości załatwi sprawę. Dodaj:
glEnable( GL_DEPTH_TEST );
 na końcu EnableOpenGL(), a
glClear( GL_COLOR_BUFFER_BIT );
 zamień na
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
P-59886
tommy8
Temat założony przez niniejszego użytkownika
» 2012-07-13 11:33:08
Dzięki, działa jak złoto:)
P-59916
« 1 »
  Strona 1 z 1