Sabtu, 30 Mei 2015

Membuat Objek Balok Bengkok 3D Wire / Kawat

Hari masih pagi dan burung-burung tetangga masih pada ribut-ributnya, tetapi seneng juga dengernya...


Helo semuanya, rekan-rekan sekalian...
Pagi ini aku akan meneruskan obrolan tentang objek 3D wire yang ada kaitannya dengan tangki air 3D. Untuk membuat tangki air dibutuhkan objek 3D balok, pipa dan balok bengkok. Balok dan pipa telah aku bahas sebelumnya dan objek balok bengkok adalah objek terakhir yang akan aku bahas.


Perhitungan matematika yang banyak dipakai untuk membuat objek ini adalah matematika trigonometri, aku telah menulis artikel singkat tentang konsep trigonometri, jadi rekan-rekan tinggal link saja ke artikel tersebut.

Ok langsung saja ke materi...

Perhatikan gambar garis bengkok di bawah ini.


Gambar 1 adalah gambar garis bengkok yang membentuk sudut lengkung (sudut bengkok) sebesar α°, garis tersebut dibuat dengan menggunakan 5 buah garis dan setiap garis dibentuk oleh dua buah titik vertex (6, 5, 1, 2, 3, 4), panjang dari kelima garis tersebut berbeda-beda, garis yang dibentuk oleh vertex 6-5 mempunyai panjang L1, garis yang ber-vertex 5-1, 1-2, dan 2-3 mempunyai panjang sebesar L2, sedangkan garis terakhir yang ber-vertex 3-4 panjangnya L3.

Sudut θ° yang tampak pada gambar 1 dapat dihitung dengan cara:

θ° = (180° - α°) / 4

Pembagi empat (4) berasal dari kelima garis tersebut membentuk empat sudut yang sama besar, dengan nilai α° sebesar 0° (nol) sampai dengan 180°, jika α°= 0° (nol) maka garis bengkok akan membentuk seperti huruf U, dan jika α°= 180° maka garis bengkok akan membentuk garis lurus.
Dengan sudut θ° dan panjang masing-masing garis diketahui maka keenam vertex garis-garis pada gambar 1 bisa dihitung.

Vertex 1 X = -0.5 L2
         Y = 0
         Z = 0

Vertex 2 X = 0.5 L2
         Y = 0
         Z = 0

Vertex 3 X = Vertex 2 X + L2 Cos θ°
           = 0.5 L2 + L2 Cos θ°
         Y = L2 Sin θ°
         Z = 0

Vertex 4 X = Vertex 3 X + L3 Cos 2θ°
           = 0.5 L2 + L2 Cos θ° + L3 Cos 2θ°
         Y = Vertex 3 Y + L3 Sin 2θ°
           = L2 Sin θ° + L3 Sin 2θ°
         Z = 0

Vertex 5 X = - (Vertex 1 X + L2 Cos θ°)
           = - (0.5 L2 + L2 Cos θ°)
         Y = L2 Sin θ°
         Z = 0

Vertex 6 X = - (Vertex 5 X + L1 Cos 2θ°)
           = - (0.5 L2 + L2 Cos θ° + L1 Cos 2θ°)
         Y = Vertex 5 Y + L1 Sin 2θ°
           = L2 Sin θ° + L1 Sin 2θ°
         Z = 0

Setelah rekan-rekan dapat menghitung vertex-vertex pada garis bengkok, maka untuk menghitung balok bengkok dipakai cara yang sama, karena balok bengkok mempunyai tebal dan tinggi maka vertex-vertex yang diperlukan akan lebih banyak dari garis bengkok.
Sebelum kita mulai menghitung vertex-vertex pada balok bengkok, ogut akan membagi balok bengkok menjadi beberapa bagian untuk mempermudah proses perhitungan yang akan dikerjakan nanti.


Gambar 2 adalah gambar balok bengkok yang terbagi menjadi lima balok dan terbuat dari 32 vertex. Panjang balok 1 sebesar L1, balok 2, 3, dan 4 panjangnya L2, dan untuk balok 5 panjangnya L3. Untuk tinggi dan tebal balok, kelima balok tersebut mempunyai tinggi dan tebal yang sama, jadi untuk membuat balok bengkok dipakai enam (6) parameter, yaitu sudut α°, L1, L2, L3, tinggi, dan lebar/tebal. Keenam parameter tersebut diperlukan untuk membuat balok bengkok agar fleksibel sesuai dengan kebutuhan.

Sebelum melangkah lebih lanjut coba perhatikan gambar di bawah ini:


Gambar di atas adalah gambar balok 1, 2, dan 3 dari balok bengkok. Coba perhatikan sudut-sudut yang dibentuk oleh persegipanjang-persegipanjang di atas, sudut yang dibentuk bervariasi antara θ°, 2θ°, 90°- θ°, dan 90°- 2θ°. Keempat sudut tersebut akan kita pakai untuk perhitungan 32 vertex yang membentuk balok bengkok.

Sekarang kita akan memulai menghitung vertex-vertex yang akan digunakan untuk membuat balok bengkok, kita mulai dari balok 1 dan hasil perhitungan vertex-vertex tersebut akan disimpan di array dengan urutan 0 sampai dengan 7 (lihat gambar  2).


Pada tabel 1 semua perhitungan untuk vertex x dan vertex y memakai cara yang sama dengan perhitungan pada pembuatan pipa (rumus trigonometri yang sama), hanya pada vertex z saja yang berbeda, karena vertex z diisi dengan nilai dari tebal balok bengkok, jadi semua sisi muka balok 1, 2, 3, 4, dan 5 vertex z-nya akan bernilai +0.5xtebal, dan untuk sisi bagian belakang akan bernilai -0.5xtebal.

Berikut ini adalah tabel-tabel yang berisi perhitungan untuk balok 2, 3, 4, dan 5.





Setelah kelima balok dihitung nilai vertex-nya, maka tahap selanjutnya menghitung nilai vertex untuk bidang prisma segitiga yang ada di setiap sudut antara dua buah balok. Berikut tabel-tabel perhitungannya.


Setelah nilai dari semua vertex diketahui tahap akhir tinggal membuat program untuk balok bengkok. Berikut ini adalah potongan program untuk membuat balok bengkok wire:

void loadBalok_Bengkok(float sudut_alpha, float L1, float L2, float L3, float tinggi, float lebar, Vertex read_BalokB[32])
{
    int i = 0;
    double pi = 3.1415926535;
    double half_pi = pi * 0.5;
    double sudut_teta;
    double temp_1, temp_2, temp_3, temp_4, temp_5;
    double temp_6, temp_7, temp_8, temp_9, temp_10;

    ifstream balokB_Dat;

    cek_error_load = true;

    balokB_Dat.open("TXT_files/bbengkok_vertex.txt");

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

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

    for (i = 0; i < 32; i++)
    {
        read_BalokB[i].VZ = read_BalokB[i].VZ * lebar;
    }

    sudut_teta = (180 - sudut_alpha) / 4;
    sudut_teta = (sudut_teta / 180) * pi;

    temp_1 = tinggi * cos(half_pi - (2 * sudut_teta));
    temp_2 = tinggi * cos(half_pi - sudut_teta);
    temp_3 = L2 * cos(sudut_teta);
    temp_4 = L1 * cos(2 * sudut_teta);
    temp_5 = L2 * sin(sudut_teta);
    temp_6 = L1 * sin(2 * sudut_teta);
    temp_7 = tinggi * sin(half_pi - (2 * sudut_teta));
    temp_8 = tinggi * sin(half_pi - sudut_teta);
    temp_9 = L3 * cos(2 * sudut_teta);
    temp_10 = L3 * sin(2 * sudut_teta);

    read_BalokB[0].VX = -(float)(temp_1 + (0.5*L2) + temp_3 + temp_4);
    read_BalokB[0].VY = (float)(temp_5 + temp_6 - temp_7);

    read_BalokB[1].VX = -(float)((0.5*L2) + temp_3 + temp_4);
    read_BalokB[1].VY = (float)(temp_5 + temp_6);

    read_BalokB[2].VX = -(float)((0.5*L2) + temp_3);
    read_BalokB[2].VY = (float)temp_5;

    read_BalokB[3].VX = -(float)(temp_1 + (0.5*L2) + temp_3);
    read_BalokB[3].VY = (float)(temp_5 - temp_7);

    read_BalokB[4].VX = read_BalokB[3].VX;
    read_BalokB[4].VY = read_BalokB[3].VY;

    read_BalokB[5].VX = read_BalokB[2].VX;
    read_BalokB[5].VY = read_BalokB[2].VY;

    read_BalokB[6].VX = read_BalokB[1].VX;
    read_BalokB[6].VY = read_BalokB[1].VY;

    read_BalokB[7].VX = read_BalokB[0].VX;
    read_BalokB[7].VY = read_BalokB[0].VY;

    read_BalokB[8].VX = -(float)(temp_2 + (0.5*L2) + temp_3);
    read_BalokB[8].VY = (float)(temp_5 - temp_8);

    read_BalokB[9].VX = -(float)(0.5*L2);

    read_BalokB[10].VX = -(float)(temp_2 + (0.5*L2));
    read_BalokB[10].VY = -(float)temp_8;

    read_BalokB[11].VX = read_BalokB[10].VX;
    read_BalokB[11].VY = read_BalokB[10].VY;

    read_BalokB[12].VX = read_BalokB[9].VX;

    read_BalokB[13].VX = read_BalokB[8].VX;
    read_BalokB[13].VY = read_BalokB[8].VY;

    read_BalokB[14].VX = -(float)(0.5*L2);
    read_BalokB[14].VY = -tinggi;

    read_BalokB[15].VX = (float)(0.5*L2);

    read_BalokB[16].VX = (float)(0.5*L2);
    read_BalokB[16].VY = -tinggi;

    read_BalokB[17].VX = read_BalokB[16].VX;
    read_BalokB[17].VY = read_BalokB[16].VY;

    read_BalokB[18].VX = read_BalokB[15].VX;

    read_BalokB[19].VX = read_BalokB[14].VX;
    read_BalokB[19].VY = read_BalokB[14].VY;

    read_BalokB[20].VX = (float)(temp_2 + (0.5*L2));
    read_BalokB[20].VY = -(float)temp_8;

    read_BalokB[21].VX = (float)((0.5*L2) + temp_3);
    read_BalokB[21].VY = (float)temp_5;

    read_BalokB[22].VX = (float)(temp_2 + (0.5*L2) + temp_3);
    read_BalokB[22].VY = (float)(temp_5 - temp_8);

    read_BalokB[23].VX = read_BalokB[22].VX;
    read_BalokB[23].VY = read_BalokB[22].VY;

    read_BalokB[24].VX = read_BalokB[21].VX;
    read_BalokB[24].VY = read_BalokB[21].VY;

    read_BalokB[25].VX = read_BalokB[20].VX;
    read_BalokB[25].VY = read_BalokB[20].VY;

    read_BalokB[26].VX = (float)(temp_1 + (0.5*L2) + temp_3);
    read_BalokB[26].VY = (float)(temp_5 - temp_7);

    read_BalokB[27].VX = (float)((0.5*L2) + temp_3 + temp_9);
    read_BalokB[27].VY = (float)(temp_5 + temp_10);

    read_BalokB[28].VX = (float)(temp_1 + (0.5*L2) + temp_3 + temp_9);
    read_BalokB[28].VY = (float)(temp_5 + temp_10 - temp_7);

    read_BalokB[29].VX = read_BalokB[28].VX;
    read_BalokB[29].VY = read_BalokB[28].VY;

    read_BalokB[30].VX = read_BalokB[27].VX;
    read_BalokB[30].VY = read_BalokB[27].VY;

    read_BalokB[31].VX = read_BalokB[26].VX;
    read_BalokB[31].VY = read_BalokB[26].VY;
}

void Balok_Bengkok_Wire(Vertex read_BalokB[32])
{
    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[0].VX, read_BalokB[0].VY, read_BalokB[0].VZ);
    glVertex3f(read_BalokB[1].VX, read_BalokB[1].VY, read_BalokB[1].VZ);
    glVertex3f(read_BalokB[2].VX, read_BalokB[2].VY, read_BalokB[2].VZ);
    glVertex3f(read_BalokB[3].VX, read_BalokB[3].VY, read_BalokB[3].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[4].VX, read_BalokB[4].VY, read_BalokB[4].VZ);
    glVertex3f(read_BalokB[5].VX, read_BalokB[5].VY, read_BalokB[5].VZ);
    glVertex3f(read_BalokB[6].VX, read_BalokB[6].VY, read_BalokB[6].VZ);
    glVertex3f(read_BalokB[7].VX, read_BalokB[7].VY, read_BalokB[7].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[6].VX, read_BalokB[6].VY, read_BalokB[6].VZ);
    glVertex3f(read_BalokB[7].VX, read_BalokB[7].VY, read_BalokB[7].VZ);
    glVertex3f(read_BalokB[0].VX, read_BalokB[0].VY, read_BalokB[0].VZ);
    glVertex3f(read_BalokB[1].VX, read_BalokB[1].VY, read_BalokB[1].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[1].VX, read_BalokB[1].VY, read_BalokB[1].VZ);
    glVertex3f(read_BalokB[2].VX, read_BalokB[2].VY, read_BalokB[2].VZ);
    glVertex3f(read_BalokB[5].VX, read_BalokB[5].VY, read_BalokB[5].VZ);
    glVertex3f(read_BalokB[6].VX, read_BalokB[6].VY, read_BalokB[6].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[0].VX, read_BalokB[0].VY, read_BalokB[0].VZ);
    glVertex3f(read_BalokB[3].VX, read_BalokB[3].VY, read_BalokB[3].VZ);
    glVertex3f(read_BalokB[4].VX, read_BalokB[4].VY, read_BalokB[4].VZ);
    glVertex3f(read_BalokB[7].VX, read_BalokB[7].VY, read_BalokB[7].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[8].VX, read_BalokB[8].VY, read_BalokB[8].VZ);
    glVertex3f(read_BalokB[2].VX, read_BalokB[2].VY, read_BalokB[2].VZ);
    glVertex3f(read_BalokB[9].VX, read_BalokB[9].VY, read_BalokB[9].VZ);
    glVertex3f(read_BalokB[10].VX, read_BalokB[10].VY, read_BalokB[10].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[11].VX, read_BalokB[11].VY, read_BalokB[11].VZ);
    glVertex3f(read_BalokB[12].VX, read_BalokB[12].VY, read_BalokB[12].VZ);
    glVertex3f(read_BalokB[5].VX, read_BalokB[5].VY, read_BalokB[5].VZ);
    glVertex3f(read_BalokB[13].VX, read_BalokB[13].VY, read_BalokB[13].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[2].VX, read_BalokB[2].VY, read_BalokB[2].VZ);
    glVertex3f(read_BalokB[9].VX, read_BalokB[9].VY, read_BalokB[9].VZ);
    glVertex3f(read_BalokB[12].VX, read_BalokB[12].VY, read_BalokB[12].VZ);
    glVertex3f(read_BalokB[5].VX, read_BalokB[5].VY, read_BalokB[5].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[8].VX, read_BalokB[8].VY, read_BalokB[8].VZ);
    glVertex3f(read_BalokB[10].VX, read_BalokB[10].VY, read_BalokB[10].VZ);
    glVertex3f(read_BalokB[11].VX, read_BalokB[11].VY, read_BalokB[11].VZ);
    glVertex3f(read_BalokB[13].VX, read_BalokB[13].VY, read_BalokB[13].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[14].VX, read_BalokB[14].VY, read_BalokB[14].VZ);
    glVertex3f(read_BalokB[9].VX, read_BalokB[9].VY, read_BalokB[9].VZ);
    glVertex3f(read_BalokB[15].VX, read_BalokB[15].VY, read_BalokB[15].VZ);
    glVertex3f(read_BalokB[16].VX, read_BalokB[16].VY, read_BalokB[16].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[17].VX, read_BalokB[17].VY, read_BalokB[17].VZ);
    glVertex3f(read_BalokB[18].VX, read_BalokB[18].VY, read_BalokB[18].VZ);
    glVertex3f(read_BalokB[12].VX, read_BalokB[12].VY, read_BalokB[12].VZ);
    glVertex3f(read_BalokB[19].VX, read_BalokB[19].VY, read_BalokB[19].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[9].VX, read_BalokB[9].VY, read_BalokB[9].VZ);
    glVertex3f(read_BalokB[15].VX, read_BalokB[15].VY, read_BalokB[15].VZ);
    glVertex3f(read_BalokB[18].VX, read_BalokB[18].VY, read_BalokB[18].VZ);
    glVertex3f(read_BalokB[12].VX, read_BalokB[12].VY, read_BalokB[12].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[14].VX, read_BalokB[14].VY, read_BalokB[14].VZ);
    glVertex3f(read_BalokB[16].VX, read_BalokB[16].VY, read_BalokB[16].VZ);
    glVertex3f(read_BalokB[17].VX, read_BalokB[17].VY, read_BalokB[17].VZ);
    glVertex3f(read_BalokB[19].VX, read_BalokB[19].VY, read_BalokB[19].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[20].VX, read_BalokB[20].VY, read_BalokB[20].VZ);
    glVertex3f(read_BalokB[15].VX, read_BalokB[15].VY, read_BalokB[15].VZ);
    glVertex3f(read_BalokB[21].VX, read_BalokB[21].VY, read_BalokB[21].VZ);
    glVertex3f(read_BalokB[22].VX, read_BalokB[22].VY, read_BalokB[22].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[23].VX, read_BalokB[23].VY, read_BalokB[23].VZ);
    glVertex3f(read_BalokB[24].VX, read_BalokB[24].VY, read_BalokB[24].VZ);
    glVertex3f(read_BalokB[18].VX, read_BalokB[18].VY, read_BalokB[18].VZ);
    glVertex3f(read_BalokB[25].VX, read_BalokB[25].VY, read_BalokB[25].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[15].VX, read_BalokB[15].VY, read_BalokB[15].VZ);
    glVertex3f(read_BalokB[21].VX, read_BalokB[21].VY, read_BalokB[21].VZ);
    glVertex3f(read_BalokB[24].VX, read_BalokB[24].VY, read_BalokB[24].VZ);
    glVertex3f(read_BalokB[18].VX, read_BalokB[18].VY, read_BalokB[18].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[20].VX, read_BalokB[20].VY, read_BalokB[20].VZ);
    glVertex3f(read_BalokB[22].VX, read_BalokB[22].VY, read_BalokB[22].VZ);
    glVertex3f(read_BalokB[23].VX, read_BalokB[23].VY, read_BalokB[23].VZ);
    glVertex3f(read_BalokB[25].VX, read_BalokB[25].VY, read_BalokB[25].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[26].VX, read_BalokB[26].VY, read_BalokB[26].VZ);
    glVertex3f(read_BalokB[21].VX, read_BalokB[21].VY, read_BalokB[21].VZ);
    glVertex3f(read_BalokB[27].VX, read_BalokB[27].VY, read_BalokB[27].VZ);
    glVertex3f(read_BalokB[28].VX, read_BalokB[28].VY, read_BalokB[28].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[27].VX, read_BalokB[27].VY, read_BalokB[27].VZ);
    glVertex3f(read_BalokB[28].VX, read_BalokB[28].VY, read_BalokB[28].VZ);
    glVertex3f(read_BalokB[29].VX, read_BalokB[29].VY, read_BalokB[29].VZ);
    glVertex3f(read_BalokB[30].VX, read_BalokB[30].VY, read_BalokB[30].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[29].VX, read_BalokB[29].VY, read_BalokB[29].VZ);
    glVertex3f(read_BalokB[30].VX, read_BalokB[30].VY, read_BalokB[30].VZ);
    glVertex3f(read_BalokB[24].VX, read_BalokB[24].VY, read_BalokB[24].VZ);
    glVertex3f(read_BalokB[31].VX, read_BalokB[31].VY, read_BalokB[31].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[21].VX, read_BalokB[21].VY, read_BalokB[21].VZ);
    glVertex3f(read_BalokB[27].VX, read_BalokB[27].VY, read_BalokB[27].VZ);
    glVertex3f(read_BalokB[30].VX, read_BalokB[30].VY, read_BalokB[30].VZ);
    glVertex3f(read_BalokB[24].VX, read_BalokB[24].VY, read_BalokB[24].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[26].VX, read_BalokB[26].VY, read_BalokB[26].VZ);
    glVertex3f(read_BalokB[28].VX, read_BalokB[28].VY, read_BalokB[28].VZ);
    glVertex3f(read_BalokB[29].VX, read_BalokB[29].VY, read_BalokB[29].VZ);
    glVertex3f(read_BalokB[31].VX, read_BalokB[31].VY, read_BalokB[31].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[2].VX, read_BalokB[2].VY, read_BalokB[2].VZ);
    glVertex3f(read_BalokB[3].VX, read_BalokB[3].VY, read_BalokB[3].VZ);
    glVertex3f(read_BalokB[8].VX, read_BalokB[8].VY, read_BalokB[8].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[3].VX, read_BalokB[3].VY, read_BalokB[3].VZ);
    glVertex3f(read_BalokB[4].VX, read_BalokB[4].VY, read_BalokB[4].VZ);
    glVertex3f(read_BalokB[13].VX, read_BalokB[13].VY, read_BalokB[13].VZ);
    glVertex3f(read_BalokB[8].VX, read_BalokB[8].VY, read_BalokB[8].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[5].VX, read_BalokB[5].VY, read_BalokB[5].VZ);
    glVertex3f(read_BalokB[4].VX, read_BalokB[4].VY, read_BalokB[4].VZ);
    glVertex3f(read_BalokB[13].VX, read_BalokB[13].VY, read_BalokB[13].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[9].VX, read_BalokB[9].VY, read_BalokB[9].VZ);
    glVertex3f(read_BalokB[10].VX, read_BalokB[10].VY, read_BalokB[10].VZ);
    glVertex3f(read_BalokB[14].VX, read_BalokB[14].VY, read_BalokB[14].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[10].VX, read_BalokB[10].VY, read_BalokB[10].VZ);
    glVertex3f(read_BalokB[11].VX, read_BalokB[11].VY, read_BalokB[11].VZ);
    glVertex3f(read_BalokB[19].VX, read_BalokB[19].VY, read_BalokB[19].VZ);
    glVertex3f(read_BalokB[14].VX, read_BalokB[14].VY, read_BalokB[14].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[12].VX, read_BalokB[12].VY, read_BalokB[12].VZ);
    glVertex3f(read_BalokB[11].VX, read_BalokB[11].VY, read_BalokB[11].VZ);
    glVertex3f(read_BalokB[19].VX, read_BalokB[19].VY, read_BalokB[19].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[15].VX, read_BalokB[15].VY, read_BalokB[15].VZ);
    glVertex3f(read_BalokB[16].VX, read_BalokB[16].VY, read_BalokB[16].VZ);
    glVertex3f(read_BalokB[20].VX, read_BalokB[20].VY, read_BalokB[20].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[16].VX, read_BalokB[16].VY, read_BalokB[16].VZ);
    glVertex3f(read_BalokB[17].VX, read_BalokB[17].VY, read_BalokB[17].VZ);
    glVertex3f(read_BalokB[25].VX, read_BalokB[25].VY, read_BalokB[25].VZ);
    glVertex3f(read_BalokB[20].VX, read_BalokB[20].VY, read_BalokB[20].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[18].VX, read_BalokB[18].VY, read_BalokB[18].VZ);
    glVertex3f(read_BalokB[17].VX, read_BalokB[17].VY, read_BalokB[17].VZ);
    glVertex3f(read_BalokB[25].VX, read_BalokB[25].VY, read_BalokB[25].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[21].VX, read_BalokB[21].VY, read_BalokB[21].VZ);
    glVertex3f(read_BalokB[22].VX, read_BalokB[22].VY, read_BalokB[22].VZ);
    glVertex3f(read_BalokB[26].VX, read_BalokB[26].VY, read_BalokB[26].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[22].VX, read_BalokB[22].VY, read_BalokB[22].VZ);
    glVertex3f(read_BalokB[23].VX, read_BalokB[23].VY, read_BalokB[23].VZ);
    glVertex3f(read_BalokB[31].VX, read_BalokB[31].VY, read_BalokB[31].VZ);
    glVertex3f(read_BalokB[26].VX, read_BalokB[26].VY, read_BalokB[26].VZ);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(read_BalokB[24].VX, read_BalokB[24].VY, read_BalokB[24].VZ);
    glVertex3f(read_BalokB[23].VX, read_BalokB[23].VY, read_BalokB[23].VZ);
    glVertex3f(read_BalokB[31].VX, read_BalokB[31].VY, read_BalokB[31].VZ);
    glEnd();
}

Selesailah obrolan kita kali ini, pembuatan objek 3D dasar seperti balok, pipa dan balok bengkok akan sangat membantu rekan-rekan untuk belajar matematika yang nantinya akan digunakan terus untuk membuat program grafik / game.

Sampai Jumpa di artikel berikutnya


Heriady
heriady.yoh@gmail.com


Download program rekan-rekan tinggal klik link ini, ngak usah sungkan dari pada ngetik lagi.


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












Artikel terkait
Program balok 3D wire
Program pipa 3D wire
Program meja 3D
Program tangki air 3D