Rabu, 27 Mei 2015

Membuat Objek Pipa 3D Solid / Padat

Pagi yang indah semua burung sedang berkicau, karena cerah banget pagi ini...


Salam semuanya...
Pagi ini aku akan melanjutkan obrolan tentang objek pipa 3D, sebelumnya aku telah membahas cara membuat objek pipa 3D wire / kawat. Dan kali ini aku akan membahas cara untuk memberi tekstur pada objek tersebut.


Bagi rekan-rekan yang baru pertama kali mengikuti blog ini sebaiknya memulai membaca artikel lain yang lebih sederhana (balok 3D wire dan solid) agar lebih mudah memahami isi dari materi kali ini.  

Ok langsug saja kita mulai ntar keburu siang, kan ogut juga harus kerja.

Untuk proses pemberian tekstur pipa dengan 14 polygon ini ogut membagi menjadi dua bagian, yaitu tekstur sisi pipa yang tegak lurus sejajar dengan sumbu y dan tekstur alas / tutup pipa.

Sekarang mari kita bahas tekstur untuk sisi pipa.


Gambar di atas adalah gambar dari 12 polygon sisi pipa yang dibentangkan pada sebuah tekstur yang berkoordinat (0,0) , (1,0), (1,1), (0,1). Angka 0 sampai dengan 23 adalah urutan-urutan array tempat vertex-vertex polygon disimpan.

Pada gambar di atas tertera jika panjang tekstur pada sumbu x sebesar 1, maka untuk setiap polygon sisi pipa memerlukan tekstur dengan panjang 1/12, sehingga polygon 1 dengan urutan array 0, 1, 2, 3 mempunyai tekstur koordinat (0,1), (0,0), (1/12,0), (1/12,1), polygon 2 dengan urutan array 2, 3, 4,5 mempunyai tekstur koordinat (1/12,0), (1/12,1), (2/12,1), (2/12,0), dan seterusnya. Dengan pola tersebut dapat dibuat tabel untuk menentukan tekstur koordinat sisi polygon pipa.


Untuk tekstur tutup / alas pipa coba perhatikan gambar di bawah ini:


Gambar di atas adalah gambar dari tutup atas pipa yang terletak pada sebuah tekstur dengan koordinat (0,0), (1,0), (1,1), dan (0,1). Titik pusat dari tutup pipa berkoordinat (R,R) dimana R adalah jari-jari pipa, sehingga JT = 2xR.

Sekarang kita akan menghitung titik koordinat x, y untuk masing-masing vertex pada tutup pipa, perhatikan sudut yang dibentuk oleh vertex dengan urutan 0 dan 3, sudut yang dibentuk sebesar 30° sehingga x=RCos30° dan y=RSin30° tetap berlaku. Karena posisi koordinat tekstur harus dihitung dari (0,0) maka nilai x dan y harus ditambah dengan titik pusat dan dibagi JT, sehingga:

X = (R + R Cos 30°) / JT
  = R(1 + Cos 30°) / JT

Y = (R + R Sin 30°) / JT
  = R(1 + Sin 30°) / JT

Rumus di atas juga berlaku untuk vertex-vertex yang lain dalam menentukan koordinat tekstur, yang berbeda hanya sudut yang dibentuknya.


Pada tabel 2 kolom ‘X’ dan ‘Y’ hanya menyimpan sudut-sudut yang dibentuk oleh sisi polygon, pada program saat load koordinat tekstur harus di-update dengan rumus yang sudah dibuat sebelumnya. Kolom ‘Array TK’ yang berguna untuk menyimpan koordinat tekstur dimulai dari urutan ke-26 karena urutan 0 sampai dengan 25 telah dipakai untuk tekstur sisi pipa. Berikut potongan dari program untuk me-load tekstur koordinat, serta program untuk men-display pipa 3D solid:

void load_Pipa_TextKoordinat(float jari, float tinggi, Koordinat pipa_textkoordinat[38])
{
    int i = 0;
    double temp_sudut;
    double pi = 3.1415926535;
    float JT;


    ifstream tangki_tk;

    cek_error_load = true;

    tangki_tk.open("TXT_files/pipa_textkoordinat.txt");

    if (!tangki_tk)
    {
        printf("Error loading pipa_textkoordinat.txt \n");
        cek_error_load = false;
        exit(0);
    }

    while (!tangki_tk.eof())
    {
        tangki_tk >> pipa_textkoordinat[i].X >> pipa_textkoordinat[i].Y;
        i++;
    }

    for (i = 0; i < 26; i++)
        pipa_textkoordinat[i].X = pipa_textkoordinat[i].X / 12.0f;

    JT = 2 * jari;

    for (i = 26; i < 38; i++)
    {
        temp_sudut = (pipa_textkoordinat[i].X / 180) * pi;
        pipa_textkoordinat[i].X = (jari * (1 + (float)cos(temp_sudut))) / JT;

        temp_sudut = (pipa_textkoordinat[i].Y / 180) * pi;
        pipa_textkoordinat[i].Y = (jari * (1 + (float)sin(temp_sudut))) / JT;
    }
}


void pipa_solid(Vertex read_pipa[24], Koordinat pipa_textkoordinat[38], int index_bitmap)
{

    glBindTexture(GL_TEXTURE_2D, texture_merah );

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[0].X, pipa_textkoordinat[0].Y);
    glVertex3f(read_pipa[0].VX, read_pipa[0].VY, read_pipa[0].VZ);

    glTexCoord2f(pipa_textkoordinat[1].X, pipa_textkoordinat[1].Y);
    glVertex3f(read_pipa[1].VX, read_pipa[1].VY, read_pipa[1].VZ);

    glTexCoord2f(pipa_textkoordinat[2].X, pipa_textkoordinat[2].Y);
    glVertex3f(read_pipa[2].VX, read_pipa[2].VY, read_pipa[2].VZ);

    glTexCoord2f(pipa_textkoordinat[3].X, pipa_textkoordinat[3].Y);
    glVertex3f(read_pipa[3].VX, read_pipa[3].VY, read_pipa[3].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[2].X, pipa_textkoordinat[2].Y);
    glVertex3f(read_pipa[2].VX, read_pipa[2].VY, read_pipa[2].VZ);

    glTexCoord2f(pipa_textkoordinat[3].X, pipa_textkoordinat[3].Y);
    glVertex3f(read_pipa[3].VX, read_pipa[3].VY, read_pipa[3].VZ);

    glTexCoord2f(pipa_textkoordinat[4].X, pipa_textkoordinat[4].Y);
    glVertex3f(read_pipa[4].VX, read_pipa[4].VY, read_pipa[4].VZ);

    glTexCoord2f(pipa_textkoordinat[5].X, pipa_textkoordinat[5].Y);
    glVertex3f(read_pipa[5].VX, read_pipa[5].VY, read_pipa[5].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[4].X, pipa_textkoordinat[4].Y);
    glVertex3f(read_pipa[4].VX, read_pipa[4].VY, read_pipa[4].VZ);

    glTexCoord2f(pipa_textkoordinat[5].X, pipa_textkoordinat[5].Y);
    glVertex3f(read_pipa[5].VX, read_pipa[5].VY, read_pipa[5].VZ);

    glTexCoord2f(pipa_textkoordinat[6].X, pipa_textkoordinat[6].Y);
    glVertex3f(read_pipa[6].VX, read_pipa[6].VY, read_pipa[6].VZ);

    glTexCoord2f(pipa_textkoordinat[7].X, pipa_textkoordinat[7].Y);
    glVertex3f(read_pipa[7].VX, read_pipa[7].VY, read_pipa[7].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[6].X, pipa_textkoordinat[6].Y);
    glVertex3f(read_pipa[6].VX, read_pipa[6].VY, read_pipa[6].VZ);

    glTexCoord2f(pipa_textkoordinat[7].X, pipa_textkoordinat[7].Y);
    glVertex3f(read_pipa[7].VX, read_pipa[7].VY, read_pipa[7].VZ);

    glTexCoord2f(pipa_textkoordinat[8].X, pipa_textkoordinat[8].Y);
    glVertex3f(read_pipa[8].VX, read_pipa[8].VY, read_pipa[8].VZ);

    glTexCoord2f(pipa_textkoordinat[9].X, pipa_textkoordinat[9].Y);
    glVertex3f(read_pipa[9].VX, read_pipa[9].VY, read_pipa[9].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[8].X, pipa_textkoordinat[8].Y);
    glVertex3f(read_pipa[8].VX, read_pipa[8].VY, read_pipa[8].VZ);

    glTexCoord2f(pipa_textkoordinat[9].X, pipa_textkoordinat[9].Y);
    glVertex3f(read_pipa[9].VX, read_pipa[9].VY, read_pipa[9].VZ);

    glTexCoord2f(pipa_textkoordinat[10].X, pipa_textkoordinat[10].Y);
    glVertex3f(read_pipa[10].VX, read_pipa[10].VY, read_pipa[10].VZ);

    glTexCoord2f(pipa_textkoordinat[11].X, pipa_textkoordinat[11].Y);
    glVertex3f(read_pipa[11].VX, read_pipa[11].VY, read_pipa[11].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[10].X, pipa_textkoordinat[10].Y);
    glVertex3f(read_pipa[10].VX, read_pipa[10].VY, read_pipa[10].VZ);

    glTexCoord2f(pipa_textkoordinat[11].X, pipa_textkoordinat[11].Y);
    glVertex3f(read_pipa[11].VX, read_pipa[11].VY, read_pipa[11].VZ);

    glTexCoord2f(pipa_textkoordinat[12].X, pipa_textkoordinat[12].Y);
    glVertex3f(read_pipa[12].VX, read_pipa[12].VY, read_pipa[12].VZ);

    glTexCoord2f(pipa_textkoordinat[13].X, pipa_textkoordinat[13].Y);
    glVertex3f(read_pipa[13].VX, read_pipa[13].VY, read_pipa[13].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[12].X, pipa_textkoordinat[12].Y);
    glVertex3f(read_pipa[12].VX, read_pipa[12].VY, read_pipa[12].VZ);

    glTexCoord2f(pipa_textkoordinat[13].X, pipa_textkoordinat[13].Y);
    glVertex3f(read_pipa[13].VX, read_pipa[13].VY, read_pipa[13].VZ);

    glTexCoord2f(pipa_textkoordinat[14].X, pipa_textkoordinat[14].Y);
    glVertex3f(read_pipa[14].VX, read_pipa[14].VY, read_pipa[14].VZ);

    glTexCoord2f(pipa_textkoordinat[15].X, pipa_textkoordinat[15].Y);
    glVertex3f(read_pipa[15].VX, read_pipa[15].VY, read_pipa[15].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[14].X, pipa_textkoordinat[14].Y);
    glVertex3f(read_pipa[14].VX, read_pipa[14].VY, read_pipa[14].VZ);

    glTexCoord2f(pipa_textkoordinat[15].X, pipa_textkoordinat[15].Y);
    glVertex3f(read_pipa[15].VX, read_pipa[15].VY, read_pipa[15].VZ);

    glTexCoord2f(pipa_textkoordinat[16].X, pipa_textkoordinat[16].Y);
    glVertex3f(read_pipa[16].VX, read_pipa[16].VY, read_pipa[16].VZ);

    glTexCoord2f(pipa_textkoordinat[17].X, pipa_textkoordinat[17].Y);
    glVertex3f(read_pipa[17].VX, read_pipa[17].VY, read_pipa[17].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[16].X, pipa_textkoordinat[16].Y);
    glVertex3f(read_pipa[16].VX, read_pipa[16].VY, read_pipa[16].VZ);

    glTexCoord2f(pipa_textkoordinat[17].X, pipa_textkoordinat[17].Y);
    glVertex3f(read_pipa[17].VX, read_pipa[17].VY, read_pipa[17].VZ);

    glTexCoord2f(pipa_textkoordinat[18].X, pipa_textkoordinat[18].Y);
    glVertex3f(read_pipa[18].VX, read_pipa[18].VY, read_pipa[18].VZ);

    glTexCoord2f(pipa_textkoordinat[19].X, pipa_textkoordinat[19].Y);
    glVertex3f(read_pipa[19].VX, read_pipa[19].VY, read_pipa[19].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[18].X, pipa_textkoordinat[18].Y);
    glVertex3f(read_pipa[18].VX, read_pipa[18].VY, read_pipa[18].VZ);

    glTexCoord2f(pipa_textkoordinat[19].X, pipa_textkoordinat[19].Y);
    glVertex3f(read_pipa[19].VX, read_pipa[19].VY, read_pipa[19].VZ);

    glTexCoord2f(pipa_textkoordinat[20].X, pipa_textkoordinat[20].Y);
    glVertex3f(read_pipa[20].VX, read_pipa[20].VY, read_pipa[20].VZ);

    glTexCoord2f(pipa_textkoordinat[21].X, pipa_textkoordinat[21].Y);
    glVertex3f(read_pipa[21].VX, read_pipa[21].VY, read_pipa[21].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[20].X, pipa_textkoordinat[20].Y);
    glVertex3f(read_pipa[20].VX, read_pipa[20].VY, read_pipa[20].VZ);

    glTexCoord2f(pipa_textkoordinat[21].X, pipa_textkoordinat[21].Y);
    glVertex3f(read_pipa[21].VX, read_pipa[21].VY, read_pipa[21].VZ);

    glTexCoord2f(pipa_textkoordinat[22].X, pipa_textkoordinat[22].Y);
    glVertex3f(read_pipa[22].VX, read_pipa[22].VY, read_pipa[22].VZ);

    glTexCoord2f(pipa_textkoordinat[23].X, pipa_textkoordinat[23].Y);
    glVertex3f(read_pipa[23].VX, read_pipa[23].VY, read_pipa[23].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[22].X, pipa_textkoordinat[22].Y);
    glVertex3f(read_pipa[22].VX, read_pipa[22].VY, read_pipa[22].VZ);

    glTexCoord2f(pipa_textkoordinat[23].X, pipa_textkoordinat[23].Y);
    glVertex3f(read_pipa[23].VX, read_pipa[23].VY, read_pipa[23].VZ);

    glTexCoord2f(pipa_textkoordinat[24].X, pipa_textkoordinat[24].Y);
    glVertex3f(read_pipa[0].VX, read_pipa[0].VY, read_pipa[0].VZ);

    glTexCoord2f(pipa_textkoordinat[25].X, pipa_textkoordinat[25].Y);
    glVertex3f(read_pipa[1].VX, read_pipa[1].VY, read_pipa[1].VZ);
    glEnd();


    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[26].X, pipa_textkoordinat[26].Y);
    glVertex3f(read_pipa[0].VX, read_pipa[0].VY, read_pipa[0].VZ);

    glTexCoord2f(pipa_textkoordinat[27].X, pipa_textkoordinat[27].Y);
    glVertex3f(read_pipa[3].VX, read_pipa[3].VY, read_pipa[3].VZ);

    glTexCoord2f(pipa_textkoordinat[28].X, pipa_textkoordinat[28].Y);
    glVertex3f(read_pipa[4].VX, read_pipa[4].VY, read_pipa[4].VZ);

    glTexCoord2f(pipa_textkoordinat[29].X, pipa_textkoordinat[29].Y);
    glVertex3f(read_pipa[7].VX, read_pipa[7].VY, read_pipa[7].VZ);

    glTexCoord2f(pipa_textkoordinat[30].X, pipa_textkoordinat[30].Y);
    glVertex3f(read_pipa[8].VX, read_pipa[8].VY, read_pipa[8].VZ);

    glTexCoord2f(pipa_textkoordinat[31].X, pipa_textkoordinat[31].Y);
    glVertex3f(read_pipa[11].VX, read_pipa[11].VY, read_pipa[11].VZ);

    glTexCoord2f(pipa_textkoordinat[32].X, pipa_textkoordinat[32].Y);
    glVertex3f(read_pipa[12].VX, read_pipa[12].VY, read_pipa[12].VZ);

    glTexCoord2f(pipa_textkoordinat[33].X, pipa_textkoordinat[33].Y);
    glVertex3f(read_pipa[15].VX, read_pipa[15].VY, read_pipa[15].VZ);

    glTexCoord2f(pipa_textkoordinat[34].X, pipa_textkoordinat[34].Y);
    glVertex3f(read_pipa[16].VX, read_pipa[16].VY, read_pipa[16].VZ);

    glTexCoord2f(pipa_textkoordinat[35].X, pipa_textkoordinat[35].Y);
    glVertex3f(read_pipa[19].VX, read_pipa[19].VY, read_pipa[19].VZ);

    glTexCoord2f(pipa_textkoordinat[36].X, pipa_textkoordinat[36].Y);
    glVertex3f(read_pipa[20].VX, read_pipa[20].VY, read_pipa[20].VZ);

    glTexCoord2f(pipa_textkoordinat[37].X, pipa_textkoordinat[37].Y);
    glVertex3f(read_pipa[23].VX, read_pipa[23].VY, read_pipa[23].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[26].X, pipa_textkoordinat[26].Y);
    glVertex3f(read_pipa[1].VX, read_pipa[1].VY, read_pipa[1].VZ);

    glTexCoord2f(pipa_textkoordinat[27].X, pipa_textkoordinat[27].Y);
    glVertex3f(read_pipa[2].VX, read_pipa[2].VY, read_pipa[2].VZ);

    glTexCoord2f(pipa_textkoordinat[28].X, pipa_textkoordinat[28].Y);
    glVertex3f(read_pipa[5].VX, read_pipa[5].VY, read_pipa[5].VZ);

    glTexCoord2f(pipa_textkoordinat[29].X, pipa_textkoordinat[29].Y);
    glVertex3f(read_pipa[6].VX, read_pipa[6].VY, read_pipa[6].VZ);

    glTexCoord2f(pipa_textkoordinat[30].X, pipa_textkoordinat[30].Y);
    glVertex3f(read_pipa[9].VX, read_pipa[9].VY, read_pipa[9].VZ);

    glTexCoord2f(pipa_textkoordinat[31].X, pipa_textkoordinat[31].Y);
    glVertex3f(read_pipa[10].VX, read_pipa[10].VY, read_pipa[10].VZ);

    glTexCoord2f(pipa_textkoordinat[32].X, pipa_textkoordinat[32].Y);
    glVertex3f(read_pipa[13].VX, read_pipa[13].VY, read_pipa[13].VZ);

    glTexCoord2f(pipa_textkoordinat[33].X, pipa_textkoordinat[33].Y);
    glVertex3f(read_pipa[14].VX, read_pipa[14].VY, read_pipa[14].VZ);

    glTexCoord2f(pipa_textkoordinat[34].X, pipa_textkoordinat[34].Y);
    glVertex3f(read_pipa[17].VX, read_pipa[17].VY, read_pipa[17].VZ);

    glTexCoord2f(pipa_textkoordinat[35].X, pipa_textkoordinat[35].Y);
    glVertex3f(read_pipa[18].VX, read_pipa[18].VY, read_pipa[18].VZ);

    glTexCoord2f(pipa_textkoordinat[36].X, pipa_textkoordinat[36].Y);
    glVertex3f(read_pipa[21].VX, read_pipa[21].VY, read_pipa[21].VZ);

    glTexCoord2f(pipa_textkoordinat[37].X, pipa_textkoordinat[37].Y);
    glVertex3f(read_pipa[22].VX, read_pipa[22].VY, read_pipa[22].VZ);
    glEnd();
}

Ok selesai dah pembahasan mengenai pipa 3D solid, selamat belajar dan berkarya rekan-rekan, berikut ini ogut sertakan kode program secara lengkap.

//berguna untuk memangkas library
//yang tidak terpakai
#define WIN32_LEAN_AND_MEAN    
#define VC_LEANMEAN    
#define VC_EXTRALEAN       

//include yang harus disertakan
#include<windows.h>
#include<stdio.h>          
#include<stdlib.h>
#include<mmsystem.h>
#include <fstream>              

using std::ifstream;

//include khusus OpenGL
#include<gl/gl.h>               
#include<gl/glu.h>
#include "glaux/glaux.h" //header ini ada di dalam folder GLAUX

//library untuk OpenGL
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "GLAUX/glaux.lib") //library ini ada di dalam folder GLAUX

//Variable global yang dipakai untuk program ini
HDC My_HDC_Global;

//set tinggi dan lebar untuk window screen
unsigned int tinggi_window_Screen = 600;
unsigned int lebar_window_Screen = 800;

//penempatan posisi window screen di monitor
unsigned int X_window_Screen = 150;
unsigned int Y_window_Screen = 50;


float Sudut_Putar = 0.0f;
bool cek_error_load;

/////////////////Struct
typedef struct
{
    float VX, VY, VZ;
}Vertex;

typedef struct
{
    float X, Y;
}Koordinat;

Vertex pipa1_vertex[24];
Vertex pipa2_vertex[24];
Vertex pipa3_vertex[24];
Vertex pipa4_vertex[24];

Koordinat pipa1_TK[38];
Koordinat pipa2_TK[38];
Koordinat pipa3_TK[38];
Koordinat pipa4_TK[38];

bool Load_All_Data();
void loadPipa(Vertex read_pipa[24], float jari, float tinggi);
void load_Pipa_TextKoordinat(float jari, float tinggi, Koordinat pipa_textkoordinat[38]);
void pipa_solid(Vertex read_pipa[24], Koordinat pipa_textkoordinat[38], int index_bitmap);

unsigned int Create_Texture(char *filename);
bool Load_Texture();

unsigned int texture_merah;
//+++++++++++++++++++++++++++++++++++++++++++
//untuk membuat program grafik dengan OpenGL
//hanya dibutuhkan empat buah fungsi, dengan
//WinMain sebagai fungsi utama (WinMain 1 fungsi tambah 3 fungsi dibawah ini jadi 4 semuanya)
LRESULT CALLBACK My_WindowProc(HWND hwnd_p, UINT message_p, WPARAM wparam_p, LPARAM lparam_p);
void Window_Pixel_Format(HDC hdc_GPF_p);
void Display_Grafik();

//+++++++++++++++++++++++++++++++++++++++++++

//fungsi yang dipanggil pertama kali
//oleh Operating system Windows, pada
//saat program dijalankan
int WINAPI WinMain(HINSTANCE hinstance_p, HINSTANCE hprevinstance_p, LPSTR lpcmdline_p, int nshowcmd_p)
{
    MSG My_MSG;
    WNDCLASSEX My_WNDCLASSEX;
    HWND My_HWND;
    bool My_MainLoop = false;

    //deklarasi variable untuk membuat window
    My_WNDCLASSEX.cbSize = sizeof(WNDCLASSEX);
    My_WNDCLASSEX.style = CS_HREDRAW | CS_VREDRAW;

    //My_WindowProc adalah fungsi yang kita buat
    //untuk memproses message-message,
    //fungsi ini yang terus menerus akan dipanggil
    //oleh fungsi WinMain, sehingga harus kita
    //daftarkan di bawah ini
    My_WNDCLASSEX.lpfnWndProc = My_WindowProc;

    My_WNDCLASSEX.cbClsExtra = 0;
    My_WNDCLASSEX.cbWndExtra = 0;
    My_WNDCLASSEX.hInstance = hinstance_p;
    My_WNDCLASSEX.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    My_WNDCLASSEX.hCursor = LoadCursor(NULL, IDC_WAIT);
    My_WNDCLASSEX.hbrBackground = NULL;
    My_WNDCLASSEX.lpszMenuName = NULL;
    My_WNDCLASSEX.lpszClassName = "MyOpenGL";
    My_WNDCLASSEX.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

    //register window Class
    //jika terjadi error program dihentikan
    if (!RegisterClassEx(&My_WNDCLASSEX))
    {
        MessageBox(NULL,
            "Register Window Class Failed", "Window Error", MB_OK);
        return 0;
    }

    //jika register window class berhasil
    //lanjutkan dengan create window
    My_HWND = CreateWindowEx(
        NULL,
        "MyOpenGL",
        "Heriady Blog heriadyblog.blogspot.com (Esc to quit)",
        NULL,
        X_window_Screen,
        Y_window_Screen,
        lebar_window_Screen,
        tinggi_window_Screen,
        NULL,
        NULL,
        hinstance_p,
        NULL);

    //jika window tidak bisa di-create
    //program dihentikan
    if (!My_HWND)
    {
        MessageBox(NULL,
            "Failed to Create Window", "Window Error", MB_OK);
        return 0;
    }

    ///////////LOAD Vertex
    if (!Load_All_Data())
        return 0;

    //load all texture here
    if (!Load_Texture())
        return 0;

    //jika window bisa di-create
    //tampilkan window ke monitor
    ShowWindow(My_HWND, SW_SHOW);
    UpdateWindow(My_HWND);

    //Looping utama
    while (!My_MainLoop)
    {
        //proses message dari antrian
        PeekMessage(&My_MSG, 0, 0, 0, PM_REMOVE);

        //selama tidak ada message 'Quit'
        //looping akan terus berjalan
        if (My_MSG.message != WM_QUIT)
        {
            //panggil fungsi untuk render window
            //disini
            Display_Grafik();

            //translate Virtual key message,
            //menjadi chararcter message dan
            //buang message yang sudah diproses
            TranslateMessage(&My_MSG);
            DispatchMessage(&My_MSG);
        }
        else
            //jika message = 'Quit'
            //keluar dari looping
            My_MainLoop = true;


    } //while (!My_MainLoop)

    //unregister window class
    UnregisterClass("MyOpenGL", My_WNDCLASSEX.hInstance);

    //akhiri program
    return (int)My_MSG.wParam;
}

//fungsi yang dipanggil oleh WinMain
//untuk memproses message-message
LRESULT CALLBACK My_WindowProc(HWND hwnd_p, UINT message_p, WPARAM wparam_p, LPARAM lparam_p)
{
    static HGLRC My_HGLRC;
    static HDC My_HDC;

    //pada saat window dibuat pertama kali
    //kondisi if di bawah memenuhi
    if (message_p == WM_CREATE)
    {
        My_HDC = GetDC(hwnd_p);
        My_HDC_Global = My_HDC;

        //pada saat pertama kali dibuat 
        //window screen harus di setup pixel
        //agar bisa dibuat untuk tampilan grafik
        Window_Pixel_Format(My_HDC);

        My_HGLRC = wglCreateContext(My_HDC);
        wglMakeCurrent(My_HDC, My_HGLRC);

        return 0;
    }

    //pada saat program hendak keluar
    //kondisi if di bawah memenuhi
    if (message_p == WM_DESTROY)
    {
        wglMakeCurrent(My_HDC, NULL);
        wglDeleteContext(My_HGLRC);
        PostQuitMessage(0);

        return 0;
    }

    //untuk saat window dibuat pertama kali atau
    //window diubah ukurannya.
    //pada program ini ukuran window
    //tidak bisa diubah, tetapi kondisi if
    //di bawah harus tetap di pasang
    if (message_p == WM_SIZE)
    {
        //fungsi OpenGL untuk set
        //tinggi dan lebar window screen
        glViewport(0, 0, lebar_window_Screen, tinggi_window_Screen);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();

        //memakai pandangan 3D perspektif
        gluPerspective(45.0, (GLfloat)lebar_window_Screen / (GLfloat)tinggi_window_Screen, 1.0, 1000.0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        //warna latar belakang hitam
        glClearColor(0.0, 0.0, 0.0, 0.0);

        //perhitungan depth buffer diaktifkan
        glEnable(GL_DEPTH_TEST);

        return 0;
    }

    //tombol ESC ditekan
    //untuk keluar dari program
    if ((message_p == WM_KEYDOWN) && (wparam_p == VK_ESCAPE))
    {
        //fungsi untuk mengirimkan
        //message WM_QUIT
        PostQuitMessage(0);

        return 0;
    }

    //return kembali nilai LRESULT
    return (DefWindowProc(hwnd_p, message_p, wparam_p, lparam_p));
}

//fungsi untuk setup pixel, yang
//dipakai untuk program grafik,
//fungsi ini harus ada jika hendak membuat
//program grafik
void Window_Pixel_Format(HDC hdc_GPF_p)
{
    int My_Pixel_Format;

    static PIXELFORMATDESCRIPTOR My_PFD =
    {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW |
        PFD_SUPPORT_OPENGL |
        PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,
        16,
        0, 0, 0, 0, 0, 0,
        0,
        0,
        0,
        0, 0, 0, 0,
        16,
        0,
        0,
        PFD_MAIN_PLANE,
        0,
        0, 0, 0
    };

    My_Pixel_Format = ChoosePixelFormat(hdc_GPF_p, &My_PFD);

    SetPixelFormat(hdc_GPF_p, My_Pixel_Format, &My_PFD);
}

//load file bitmap 24 bit
bool Load_Texture()
{
    glEnable(GL_TEXTURE_2D);

    if ((texture_merah = Create_Texture("Bmp_Files/Text_merah.bmp")) == NULL)
        return false;

    return true;
}

//digunakan untuk membuat tekstur dari file bitmap 24 bit
unsigned int Create_Texture(char *filename)
{
    AUX_RGBImageRec *My_Texture;
    unsigned int My_IDTexture;

    My_Texture = auxDIBImageLoad(filename);

    if (My_Texture != NULL)
    {
        glGenTextures(1, &My_IDTexture);

        glBindTexture(GL_TEXTURE_2D, My_IDTexture);

        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB,
            My_Texture->sizeX, My_Texture->sizeY,
            GL_RGB, GL_UNSIGNED_BYTE,
            My_Texture->data);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
            My_Texture->sizeX, My_Texture->sizeY,
            0, GL_RGB, GL_UNSIGNED_BYTE,
            My_Texture->data);

        free(My_Texture);

        return My_IDTexture;
    }

    return NULL;
}

bool Load_All_Data()
{
    loadPipa(pipa1_vertex, 0.6f, 0.6f);
    if (cek_error_load == false)
        return false;
    load_Pipa_TextKoordinat(0.6f, 0.6f, pipa1_TK);
    if (cek_error_load == false)
        return false;

    loadPipa(pipa2_vertex, 0.3f, 0.7f);
    if (cek_error_load == false)
        return false;
    load_Pipa_TextKoordinat(0.3f, 0.7f, pipa2_TK);
    if (cek_error_load == false)
        return false;

    loadPipa(pipa3_vertex, 0.1f, 0.8f);
    if (cek_error_load == false)
        return false;
    load_Pipa_TextKoordinat(0.1f, 0.8f, pipa3_TK);
    if (cek_error_load == false)
        return false;

    loadPipa(pipa4_vertex, 0.7f, 0.2f);
    if (cek_error_load == false)
        return false;
    load_Pipa_TextKoordinat(0.7f, 0.2f, pipa4_TK);
    if (cek_error_load == false)
        return false;

    return true;
}

void loadPipa(Vertex read_pipa[24], float jari, float tinggi)
{
    int i = 0;
    double temp_sudut;
    double pi = 3.1415926535;

    ifstream pipaDat;

    cek_error_load = true;

    pipaDat.open("TXT_files/pipa_vertex.txt");

    if (!pipaDat)
    {
        printf("Error loading pipa_vertex.txt \n");
        cek_error_load = false;
        exit(0);
    }

    while (!pipaDat.eof())
    {
        pipaDat >> read_pipa[i].VX >> read_pipa[i].VY >> read_pipa[i].VZ;
        i++;
    }


    for (i = 0; i < 24; i++)
    {
        temp_sudut = read_pipa[i].VX;
        temp_sudut = (temp_sudut / 180) * pi;
        read_pipa[i].VX = jari * (float)cos(temp_sudut);

        read_pipa[i].VY = read_pipa[i].VY * tinggi;

        temp_sudut = read_pipa[i].VZ;
        temp_sudut = (temp_sudut / 180) * pi;
        read_pipa[i].VZ = jari * (float)sin(temp_sudut);
    }
}

void load_Pipa_TextKoordinat(float jari, float tinggi, Koordinat pipa_textkoordinat[38])
{
    int i = 0;
    double temp_sudut;
    double pi = 3.1415926535;
    float JT;


    ifstream tangki_tk;

    cek_error_load = true;

    tangki_tk.open("TXT_files/pipa_textkoordinat.txt");

    if (!tangki_tk)
    {
        printf("Error loading pipa_textkoordinat.txt \n");
        cek_error_load = false;
        exit(0);
    }

    while (!tangki_tk.eof())
    {
        tangki_tk >> pipa_textkoordinat[i].X >> pipa_textkoordinat[i].Y;
        i++;
    }

    for (i = 0; i < 26; i++)
        pipa_textkoordinat[i].X = pipa_textkoordinat[i].X / 12.0f;

    JT = 2 * jari;

    for (i = 26; i < 38; i++)
    {
        temp_sudut = (pipa_textkoordinat[i].X / 180) * pi;
        pipa_textkoordinat[i].X = (jari * (1 + (float)cos(temp_sudut))) / JT;

        temp_sudut = (pipa_textkoordinat[i].Y / 180) * pi;
        pipa_textkoordinat[i].Y = (jari * (1 + (float)sin(temp_sudut))) / JT;
    }
}


void pipa_solid(Vertex read_pipa[24], Koordinat pipa_textkoordinat[38], int index_bitmap)
{

    glBindTexture(GL_TEXTURE_2D, texture_merah );

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[0].X, pipa_textkoordinat[0].Y);
    glVertex3f(read_pipa[0].VX, read_pipa[0].VY, read_pipa[0].VZ);

    glTexCoord2f(pipa_textkoordinat[1].X, pipa_textkoordinat[1].Y);
    glVertex3f(read_pipa[1].VX, read_pipa[1].VY, read_pipa[1].VZ);

    glTexCoord2f(pipa_textkoordinat[2].X, pipa_textkoordinat[2].Y);
    glVertex3f(read_pipa[2].VX, read_pipa[2].VY, read_pipa[2].VZ);

    glTexCoord2f(pipa_textkoordinat[3].X, pipa_textkoordinat[3].Y);
    glVertex3f(read_pipa[3].VX, read_pipa[3].VY, read_pipa[3].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[2].X, pipa_textkoordinat[2].Y);
    glVertex3f(read_pipa[2].VX, read_pipa[2].VY, read_pipa[2].VZ);

    glTexCoord2f(pipa_textkoordinat[3].X, pipa_textkoordinat[3].Y);
    glVertex3f(read_pipa[3].VX, read_pipa[3].VY, read_pipa[3].VZ);

    glTexCoord2f(pipa_textkoordinat[4].X, pipa_textkoordinat[4].Y);
    glVertex3f(read_pipa[4].VX, read_pipa[4].VY, read_pipa[4].VZ);

    glTexCoord2f(pipa_textkoordinat[5].X, pipa_textkoordinat[5].Y);
    glVertex3f(read_pipa[5].VX, read_pipa[5].VY, read_pipa[5].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[4].X, pipa_textkoordinat[4].Y);
    glVertex3f(read_pipa[4].VX, read_pipa[4].VY, read_pipa[4].VZ);

    glTexCoord2f(pipa_textkoordinat[5].X, pipa_textkoordinat[5].Y);
    glVertex3f(read_pipa[5].VX, read_pipa[5].VY, read_pipa[5].VZ);

    glTexCoord2f(pipa_textkoordinat[6].X, pipa_textkoordinat[6].Y);
    glVertex3f(read_pipa[6].VX, read_pipa[6].VY, read_pipa[6].VZ);

    glTexCoord2f(pipa_textkoordinat[7].X, pipa_textkoordinat[7].Y);
    glVertex3f(read_pipa[7].VX, read_pipa[7].VY, read_pipa[7].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[6].X, pipa_textkoordinat[6].Y);
    glVertex3f(read_pipa[6].VX, read_pipa[6].VY, read_pipa[6].VZ);

    glTexCoord2f(pipa_textkoordinat[7].X, pipa_textkoordinat[7].Y);
    glVertex3f(read_pipa[7].VX, read_pipa[7].VY, read_pipa[7].VZ);

    glTexCoord2f(pipa_textkoordinat[8].X, pipa_textkoordinat[8].Y);
    glVertex3f(read_pipa[8].VX, read_pipa[8].VY, read_pipa[8].VZ);

    glTexCoord2f(pipa_textkoordinat[9].X, pipa_textkoordinat[9].Y);
    glVertex3f(read_pipa[9].VX, read_pipa[9].VY, read_pipa[9].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[8].X, pipa_textkoordinat[8].Y);
    glVertex3f(read_pipa[8].VX, read_pipa[8].VY, read_pipa[8].VZ);

    glTexCoord2f(pipa_textkoordinat[9].X, pipa_textkoordinat[9].Y);
    glVertex3f(read_pipa[9].VX, read_pipa[9].VY, read_pipa[9].VZ);

    glTexCoord2f(pipa_textkoordinat[10].X, pipa_textkoordinat[10].Y);
    glVertex3f(read_pipa[10].VX, read_pipa[10].VY, read_pipa[10].VZ);

    glTexCoord2f(pipa_textkoordinat[11].X, pipa_textkoordinat[11].Y);
    glVertex3f(read_pipa[11].VX, read_pipa[11].VY, read_pipa[11].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[10].X, pipa_textkoordinat[10].Y);
    glVertex3f(read_pipa[10].VX, read_pipa[10].VY, read_pipa[10].VZ);

    glTexCoord2f(pipa_textkoordinat[11].X, pipa_textkoordinat[11].Y);
    glVertex3f(read_pipa[11].VX, read_pipa[11].VY, read_pipa[11].VZ);

    glTexCoord2f(pipa_textkoordinat[12].X, pipa_textkoordinat[12].Y);
    glVertex3f(read_pipa[12].VX, read_pipa[12].VY, read_pipa[12].VZ);

    glTexCoord2f(pipa_textkoordinat[13].X, pipa_textkoordinat[13].Y);
    glVertex3f(read_pipa[13].VX, read_pipa[13].VY, read_pipa[13].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[12].X, pipa_textkoordinat[12].Y);
    glVertex3f(read_pipa[12].VX, read_pipa[12].VY, read_pipa[12].VZ);

    glTexCoord2f(pipa_textkoordinat[13].X, pipa_textkoordinat[13].Y);
    glVertex3f(read_pipa[13].VX, read_pipa[13].VY, read_pipa[13].VZ);

    glTexCoord2f(pipa_textkoordinat[14].X, pipa_textkoordinat[14].Y);
    glVertex3f(read_pipa[14].VX, read_pipa[14].VY, read_pipa[14].VZ);

    glTexCoord2f(pipa_textkoordinat[15].X, pipa_textkoordinat[15].Y);
    glVertex3f(read_pipa[15].VX, read_pipa[15].VY, read_pipa[15].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[14].X, pipa_textkoordinat[14].Y);
    glVertex3f(read_pipa[14].VX, read_pipa[14].VY, read_pipa[14].VZ);

    glTexCoord2f(pipa_textkoordinat[15].X, pipa_textkoordinat[15].Y);
    glVertex3f(read_pipa[15].VX, read_pipa[15].VY, read_pipa[15].VZ);

    glTexCoord2f(pipa_textkoordinat[16].X, pipa_textkoordinat[16].Y);
    glVertex3f(read_pipa[16].VX, read_pipa[16].VY, read_pipa[16].VZ);

    glTexCoord2f(pipa_textkoordinat[17].X, pipa_textkoordinat[17].Y);
    glVertex3f(read_pipa[17].VX, read_pipa[17].VY, read_pipa[17].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[16].X, pipa_textkoordinat[16].Y);
    glVertex3f(read_pipa[16].VX, read_pipa[16].VY, read_pipa[16].VZ);

    glTexCoord2f(pipa_textkoordinat[17].X, pipa_textkoordinat[17].Y);
    glVertex3f(read_pipa[17].VX, read_pipa[17].VY, read_pipa[17].VZ);

    glTexCoord2f(pipa_textkoordinat[18].X, pipa_textkoordinat[18].Y);
    glVertex3f(read_pipa[18].VX, read_pipa[18].VY, read_pipa[18].VZ);

    glTexCoord2f(pipa_textkoordinat[19].X, pipa_textkoordinat[19].Y);
    glVertex3f(read_pipa[19].VX, read_pipa[19].VY, read_pipa[19].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[18].X, pipa_textkoordinat[18].Y);
    glVertex3f(read_pipa[18].VX, read_pipa[18].VY, read_pipa[18].VZ);

    glTexCoord2f(pipa_textkoordinat[19].X, pipa_textkoordinat[19].Y);
    glVertex3f(read_pipa[19].VX, read_pipa[19].VY, read_pipa[19].VZ);

    glTexCoord2f(pipa_textkoordinat[20].X, pipa_textkoordinat[20].Y);
    glVertex3f(read_pipa[20].VX, read_pipa[20].VY, read_pipa[20].VZ);

    glTexCoord2f(pipa_textkoordinat[21].X, pipa_textkoordinat[21].Y);
    glVertex3f(read_pipa[21].VX, read_pipa[21].VY, read_pipa[21].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[20].X, pipa_textkoordinat[20].Y);
    glVertex3f(read_pipa[20].VX, read_pipa[20].VY, read_pipa[20].VZ);

    glTexCoord2f(pipa_textkoordinat[21].X, pipa_textkoordinat[21].Y);
    glVertex3f(read_pipa[21].VX, read_pipa[21].VY, read_pipa[21].VZ);

    glTexCoord2f(pipa_textkoordinat[22].X, pipa_textkoordinat[22].Y);
    glVertex3f(read_pipa[22].VX, read_pipa[22].VY, read_pipa[22].VZ);

    glTexCoord2f(pipa_textkoordinat[23].X, pipa_textkoordinat[23].Y);
    glVertex3f(read_pipa[23].VX, read_pipa[23].VY, read_pipa[23].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[22].X, pipa_textkoordinat[22].Y);
    glVertex3f(read_pipa[22].VX, read_pipa[22].VY, read_pipa[22].VZ);

    glTexCoord2f(pipa_textkoordinat[23].X, pipa_textkoordinat[23].Y);
    glVertex3f(read_pipa[23].VX, read_pipa[23].VY, read_pipa[23].VZ);

    glTexCoord2f(pipa_textkoordinat[24].X, pipa_textkoordinat[24].Y);
    glVertex3f(read_pipa[0].VX, read_pipa[0].VY, read_pipa[0].VZ);

    glTexCoord2f(pipa_textkoordinat[25].X, pipa_textkoordinat[25].Y);
    glVertex3f(read_pipa[1].VX, read_pipa[1].VY, read_pipa[1].VZ);
    glEnd();


    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[26].X, pipa_textkoordinat[26].Y);
    glVertex3f(read_pipa[0].VX, read_pipa[0].VY, read_pipa[0].VZ);

    glTexCoord2f(pipa_textkoordinat[27].X, pipa_textkoordinat[27].Y);
    glVertex3f(read_pipa[3].VX, read_pipa[3].VY, read_pipa[3].VZ);

    glTexCoord2f(pipa_textkoordinat[28].X, pipa_textkoordinat[28].Y);
    glVertex3f(read_pipa[4].VX, read_pipa[4].VY, read_pipa[4].VZ);

    glTexCoord2f(pipa_textkoordinat[29].X, pipa_textkoordinat[29].Y);
    glVertex3f(read_pipa[7].VX, read_pipa[7].VY, read_pipa[7].VZ);

    glTexCoord2f(pipa_textkoordinat[30].X, pipa_textkoordinat[30].Y);
    glVertex3f(read_pipa[8].VX, read_pipa[8].VY, read_pipa[8].VZ);

    glTexCoord2f(pipa_textkoordinat[31].X, pipa_textkoordinat[31].Y);
    glVertex3f(read_pipa[11].VX, read_pipa[11].VY, read_pipa[11].VZ);

    glTexCoord2f(pipa_textkoordinat[32].X, pipa_textkoordinat[32].Y);
    glVertex3f(read_pipa[12].VX, read_pipa[12].VY, read_pipa[12].VZ);

    glTexCoord2f(pipa_textkoordinat[33].X, pipa_textkoordinat[33].Y);
    glVertex3f(read_pipa[15].VX, read_pipa[15].VY, read_pipa[15].VZ);

    glTexCoord2f(pipa_textkoordinat[34].X, pipa_textkoordinat[34].Y);
    glVertex3f(read_pipa[16].VX, read_pipa[16].VY, read_pipa[16].VZ);

    glTexCoord2f(pipa_textkoordinat[35].X, pipa_textkoordinat[35].Y);
    glVertex3f(read_pipa[19].VX, read_pipa[19].VY, read_pipa[19].VZ);

    glTexCoord2f(pipa_textkoordinat[36].X, pipa_textkoordinat[36].Y);
    glVertex3f(read_pipa[20].VX, read_pipa[20].VY, read_pipa[20].VZ);

    glTexCoord2f(pipa_textkoordinat[37].X, pipa_textkoordinat[37].Y);
    glVertex3f(read_pipa[23].VX, read_pipa[23].VY, read_pipa[23].VZ);
    glEnd();

    glBegin(GL_POLYGON);
    glTexCoord2f(pipa_textkoordinat[26].X, pipa_textkoordinat[26].Y);
    glVertex3f(read_pipa[1].VX, read_pipa[1].VY, read_pipa[1].VZ);

    glTexCoord2f(pipa_textkoordinat[27].X, pipa_textkoordinat[27].Y);
    glVertex3f(read_pipa[2].VX, read_pipa[2].VY, read_pipa[2].VZ);

    glTexCoord2f(pipa_textkoordinat[28].X, pipa_textkoordinat[28].Y);
    glVertex3f(read_pipa[5].VX, read_pipa[5].VY, read_pipa[5].VZ);

    glTexCoord2f(pipa_textkoordinat[29].X, pipa_textkoordinat[29].Y);
    glVertex3f(read_pipa[6].VX, read_pipa[6].VY, read_pipa[6].VZ);

    glTexCoord2f(pipa_textkoordinat[30].X, pipa_textkoordinat[30].Y);
    glVertex3f(read_pipa[9].VX, read_pipa[9].VY, read_pipa[9].VZ);

    glTexCoord2f(pipa_textkoordinat[31].X, pipa_textkoordinat[31].Y);
    glVertex3f(read_pipa[10].VX, read_pipa[10].VY, read_pipa[10].VZ);

    glTexCoord2f(pipa_textkoordinat[32].X, pipa_textkoordinat[32].Y);
    glVertex3f(read_pipa[13].VX, read_pipa[13].VY, read_pipa[13].VZ);

    glTexCoord2f(pipa_textkoordinat[33].X, pipa_textkoordinat[33].Y);
    glVertex3f(read_pipa[14].VX, read_pipa[14].VY, read_pipa[14].VZ);

    glTexCoord2f(pipa_textkoordinat[34].X, pipa_textkoordinat[34].Y);
    glVertex3f(read_pipa[17].VX, read_pipa[17].VY, read_pipa[17].VZ);

    glTexCoord2f(pipa_textkoordinat[35].X, pipa_textkoordinat[35].Y);
    glVertex3f(read_pipa[18].VX, read_pipa[18].VY, read_pipa[18].VZ);

    glTexCoord2f(pipa_textkoordinat[36].X, pipa_textkoordinat[36].Y);
    glVertex3f(read_pipa[21].VX, read_pipa[21].VY, read_pipa[21].VZ);

    glTexCoord2f(pipa_textkoordinat[37].X, pipa_textkoordinat[37].Y);
    glVertex3f(read_pipa[22].VX, read_pipa[22].VY, read_pipa[22].VZ);
    glEnd();
}

//fungsi yang dipakai untuk menampilkan
//semua object(Polygon) yang akan kita buat
//pada window screen
void Display_Grafik()
{
    //clear buffer
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    //...........................
    //display object  di sini
    //...........................
    //mundurkan objek sebanyak 5 satuan
    //ke arah sumbu -Z
    glTranslatef(0.0f, 0.0f, -5.0f);
    glRotatef(15.0, 1.0f, 0.0f, 1.0f);
    glRotatef(Sudut_Putar, 0.0f, 1.0f, 0.0f);

    Sudut_Putar += 0.03f;
    if (Sudut_Putar > 360.0f)
        Sudut_Putar = 0.0f;


    ///////////Object di sini

    //glRotatef(Sudut_Putar, 0.0f, 1.0f, 0.0f);

    //sumbu x
    glBegin(GL_LINES);
    glVertex3f(3.0f, 0.0f, 0.0f);
    glVertex3f(-3.0f, 0.0f, 0.0f);
    glEnd();
    //sumbu y
    glBegin(GL_LINES);
    glVertex3f(0.0f, 3.0f, 0.0f);
    glVertex3f(0.0f, -3.0f, 0.0f);
    glEnd();
    //sumbu z
    glBegin(GL_LINES);
    glVertex3f(0.0f, 0.0f, 3.0f);
    glVertex3f(0.0f, 0.0f, -3.0f);
    glEnd();

    //display pipa
    glTranslatef(-1.0f, 0.0f, -1.0f);
    pipa_solid(pipa1_vertex, pipa1_TK, 1);
    glTranslatef(2.0f, 0.0f, 0.0f);
    pipa_solid(pipa2_vertex, pipa2_TK, 1);
    glTranslatef(0.0f, 0.0f, 2.0f);
    pipa_solid(pipa4_vertex, pipa4_TK, 1);
    glTranslatef(-2.0f, 0.0f, 0.0f);
    pipa_solid(pipa3_vertex, pipa3_TK, 1);

    //fungsi swapbuffer harus dipasang pada akhir Display_Grafik()
    SwapBuffers(My_HDC_Global);
}

Salam Sukses selalu buat rekan-rekan


Heriady
heriady.yoh@gmail.com




Sumber
Artikel ini bersumber dari buku Pemrograman Grafik 3D menggunakan C & OpenGL, karangan Heriady (halaman 98 s/d 109)












Artikel terkait