Senin, 10 Oktober 2011

TUGAS KELOMPOK Open GL

Kelompok : Mulatiar Kresno            (3411 0858)
                   Wiwin Fitriani achmad   (39110096)


Dosen       :Pak Agam



Kami akan membuat Open GL dengan menggunakan bahasa C++,dan dengan sofware Dev-C++ 4.9.9.2
Cara membuka Open GL setelah install Dev-C++ 4.9.9.2 dengan mengklik File - New - Projek , dan ada 3 pilihan yaitu ada Basic , Introduction dan Multimedia. Klik Multimedia - Open GL Enter/Ok dan masukan kodingan anda yang ingin dicari:



Membuat Segitiga    (dengan bentuk umum)




/**************************
 * Includes
 *
 **************************/

#include
#include


/**************************
 * Function Declarations
 *
 **************************/

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);


/**************************
 * WinMain
 *
 **************************/

int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;       
    MSG msg;
    BOOL bQuit = FALSE;
    float theta = 0.0f;

    /* register window class */
    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 = "GLSample";
    RegisterClass (&wc);

    /* create main window */
    hWnd = CreateWindow (
      "GLSample", "OpenGL Sample",
      WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
      0, 0, 256, 256,
      NULL, NULL, hInstance, NULL);

    /* 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
        {
            /* OpenGL animation code goes here */           

           
            glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
            glClear (GL_COLOR_BUFFER_BIT);

            glPushMatrix ();
            glRotatef (theta, 0.0f, 0.0f, 1.0f);                   
(bagian bawah ini yang digunakan untuk memasukan
                                                                                     codingan dalam mengubah bentuk Open GL)
            glBegin (GL_TRIANGLES);
            glColor3f (1.0f, 0.0f, 0.0f);   glVertex2f (0.0f, 1.0f);
            glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (0.87f, -0.5f);
            glColor3f (0.0f, 0.0f, 1.0f);   glVertex2f (-0.87f, -0.5f);
            glEnd ();
            glPopMatrix ();

            SwapBuffers (hDC);

            theta += 1.0f;
            Sleep (1);
        }
    }

    /* shutdown OpenGL */
    DisableOpenGL (hWnd, hDC, hRC);

    /* destroy the window explicitly */
    DestroyWindow (hWnd);

    return msg.wParam;
}


/********************
 * Window Procedure
 *
 ********************/

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:
        switch (wParam)
        {
        case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;
        }
        return 0;

    default:
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
}


/*******************
 * Enable OpenGL
 *
 *******************/

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 );

}


/******************
 * Disable OpenGL
 *
 ******************/

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
{
    wglMakeCurrent (NULL, NULL);
    wglDeleteContext (hRC);
    ReleaseDC (hWnd, hDC);

}




Membuat Sebuah Titik

masukan codingan bawah ini kedalam tempat yang telah saya beri keterangan diatas

// Titik pertama -----------------------------
 
glPointSize(5.0f);

glBegin(GL_POINTS);
 glColor3f(1.0f, 0.0f, 0.0f);
 glVertex3f( -10.0f, 5.0f, -20.0f);
glEnd();

glPointSize(5.0f) digunakan untuk mengatur besar titik yang akan digambar. Di sini, kita akan menggambar titik dengan ukuran 5.0. glBegin(GL_POINTS) digunakan untuk menggambar titik. Posisi titik yang akan digambar harus ditulis antara glBegin(GL_POINTS) dan glEnd(). glColor3f(1.0f, 0.0f, 0.0f) adalah warna dari titk yang akan digambar. Format yang digunakan adalah format RGB, jadi warna titik adalah merah. glVertex3f( -10.0f, 5.0f, -20.0f) berarti posisi titik adalah 10 satuan ke kiri, 5 satuan ke atas, dan 20 satuan menjauh dari layar. Untuk koordinat, posisi tengah (posisi 0,0,0) berada tepat di tengah-tengah layar. Sumbu X negatif berarti ke kiri, positif berarti ke kanan. Sumbu Y positif berarti ke atas, negatif ke bawah. Sedangkan untuk sumbu Z, tanda positif berarti di depan layar (di luar layar), jadi tidak terlihat di layar. Jadi sumbu Z harus menggunakan tanda negatif agar objek dapat dilihat. Cukup rumit untuk menggambar bukan, tapi ada cara ayng lebih mudah. Sekarang perhatikan titik kedua


// Titik kedua ------------------------------

glPointSize(10.0f);

glTranslatef(-5.0f, 5.0f, -20.0f);

glBegin(GL_POINTS);
 glColor3f(0.0f, 1.0f, 0.0f);
 glVertex3f( 0.0f, 0.0f, 0.0f);
glEnd();

glTranslatef( 5.0f, -5.0f, 20.0f);

glTranslatef(-5.0f, 5.0f, -20.0f) digunakan untuk merubah titik tengah sumbu koordinat. Bila tadinya pusat sumbu korrdinat terletak tepat di tengah-tengah layar, sekarang titik pusat sumbu koordinat terletak di posisi -5, 5,-20. Jadi kita bisa melihat titik yang digambar di posisi 0,0,0. Setelah menggambar titik, titik tengah sumbu koordinat dikembalikan ke posisi awal dengan glTranslatef( 5.0f, -5.0f, 20.0f). Bila tidak dikembalikan, akan menimbulkan kebingungan karena titik tengah sumbu koordinat tidak terletak di tengah. Tentu cukup merepotkan bila harus mengembalikan titik tengah sumbu koordinat tiap kali kita merubahnya. Untuk itu, digunakan cara yang lebih mudah lagi seperti pada penggambaran titik ketiga.


// Titik ketiga -----------------------------

glPointSize(7.0f);

glPushMatrix();

glTranslatef( 0.0f, 5.0f, -20.0f);

glBegin(GL_POINTS);
 glColor3f(0.0f, 0.0f, 1.0f);
 glVertex3f( 0.0f, 0.0f, 0.0f);
glEnd();

glPopMatrix();

Dengan glPushMatrix() dan glPopMatrix(), kita tidak perlu mengembalikan posisi titik tengah sumbu koordinat. Apapun perubahan yang dilakukan setelah glPushMatrix() akan dikembalikan ke nilai awal setelah glPopMatrix. Untuk penggambaran objek dasar berikutnya, semua akan menggunakan cara ini. Untuk menggambar banyak titik, memasukkan posisinya satu demi satu tidaklah efisien. Maka diperlukan looping untuk mengambar banyak titik. Caranya adalah dengan menyimpan data ke variabel, lalu variabel tersebut digunakan dalam looping untuk dimasukkan ke dalam glVertex3f(...). Penggambaran titik keempat menggunakan looping untuk menggambar beberapa titik.


// Titik keempat ---------------------------

glPointSize(5.0f);

glPushMatrix();

glTranslatef( 5.0f, 5.0f, -20.0f);

GLfloat PosX;

glBegin(GL_POINTS);

 glColor3f(1.0f, 1.0f, 0.0f);

 for (PosX = 0.0f; PosX < 1.0f; PosX += 0.2f)
  glVertex3f( PosX, 0.0f, 0.0f);

glEnd();

glPopMatrix();

Setelah bisa menggambar titik, kita akan belajar menggambar garis. Garis terdiri dati dua titik, caranya mirip dengan cara menggambar titik. Tinggal mengganti glBegin(GL_POINTS) menjadi glBegin(GL_LINES) seperti pada program bagian garis pertama. Ingat, garis terdiri dari dua titik. Jadi glVertex3f(...) harus dituliskan dua kali, masing-masing untuk sebuat titik.


Membuat sebuah Garis      (lakukan hal sama seperti kodingan diatas)
 
//Garis pertama ---------------------------

glLineWidth(2.0f);

glPushMatrix();

glTranslatef(-10.0f, 0.0f, -20.0f);

glColor3f(1.0f, 0.0f, 0.0f);

glBegin(GL_LINES);
 glVertex3f( 0.0f, 1.0f, 0.0f);
 glVertex3f( 0.0f, -1.0f, 0.0f);
glEnd();

glPopMatrix();

glLineWidth(2.0f) digunakan untuk menentukan lebar garis yang akan digambar. Di sini,kita akan menggambar garis dengan lebar 2. Garis bisa memiliki warna degradasi. Ingat bahwa garsi terdiri dari dua titik. Bila titik pertama berwarna hijau dan titik kedua berwarna biru, warna garis akan berdegradasi dari hijau ke biru. Lihat bagian garis kedua untuk melihat warna degradasi.


//Garis kedua ---------------------------

glPushMatrix();

glTranslatef( -5.0f, 0.0f, -20.0f);

glBegin(GL_LINES);
 glColor3f(0.0f, 1.0f, 0.0f); glVertex3f( 0.0f, 1.0f, 0.0f);
 glColor3f(0.0f, 0.0f, 1.0f); glVertex3f( 0.0f, -1.0f, 0.0f);
glEnd();

glPopMatrix();

Garis ketiga menggambarkan cara menggunakan looping untuk membuat beberapa garis. Bila glVertex3f(...) dimasukkan beberapa kali, maka titik pertama dan kedua akan membentuk satu garis. Titik ketiga dan keempat membentuk garis kedua, dan seterusnya.

//Garis ketiga -------------------------

glPushMatrix();

glTranslatef( 0.0f, 0.0f, -20.0f);

glBegin(GL_LINES);
 for (PosX = 0.0f; PosX <= 1.0f; PosX += 0.2f)
 {
  glColor3f(0.0f, 1.0f, 0.0f); glVertex3f( PosX, 1.0f, 0.0f);
  glColor3f(0.0f, 0.0f, 1.0f); glVertex3f( PosX, -1.0f, 0.0f);
 }

glEnd();

glPopMatrix();

Bila kita ingin menggambar beberapa garis yang terhubung, digunakan glBegin(GL_LINE_STRIP). Jadi kita memasukkan beberapa titik di sini. Titik pertama dan kedua akan membentuk suatu garis, lalu titik kedua dan ketiga membentuk garis berikutnya, lalu titik ketiga dan keempat membentuk garis baru lagi, dan seterusnya. Coba juga glBegin(GL_LINE_LOOP) untuk cara lain.


//Garis keempat -------------------------

glPushMatrix();

glTranslatef( 5.0f, 0.0f, -20.0f);

glBegin(GL_LINE_STRIP);
 for (PosX = 0.0f; PosX <= 2.0f; PosX += 0.5f)
 {
  glColor3f(0.0f, 1.0f, 0.0f); glVertex3f( PosX, 1.0f, 0.0f);
  glColor3f(0.0f, 0.0f, 1.0f); glVertex3f( PosX, -1.0f, 0.0f);
 }

glEnd();

glPopMatrix();


Membuat kotak  (lakukan penempatan yang sama seperti diatas)

glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
glClear (GL_COLOR_BUFFER_BIT);


 glBegin (GL_POLYGON);
glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (-0.5f, -0.5f);
glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (-0.5f, 0.5f);
glColor3f (0.0f, 2.0f, 0.0f); glVertex2f (0.5f, 0.5f);
glColor3f (0.0f, 0.0f, 3.0f); glVertex2f (0.5f, -0.5f);
glEnd ();

SwapBuffers (hDC);


Sleep (1);



 Dibutuhkan 4 buah vertex, masing-masing koordinat vertex1,2, 3, dan 4 akan saling terhubung membentuk persegi. Koordinat harus sama sisi, jika ingin berbentuk persegi (kubus) karena glvertex akan membentuk sebuah bidang bersisi
glVertex3i(1,0,-2);
glVertex3f(1.0, 0.0, -2.0);


adalah sama yaitu meletakkan titik di layar pada koordinat x = 1, y = 0 dan z = -2, perbedaannya yaitu pada perintah pertama menspesifikasikan titik dengan tipe data integer 32-bit, sedangkan yang kedua dengan tipe data single precision floating point

Tidak ada komentar:

Posting Komentar