Selasa, 30 Juni 2015

Pipa Berongga 3D, I Love Math

Selamat pagi...salam sukses selalu...pagi hari yang cerah walaupun hembusan angin barat sangat kencang dan dingin urusan nge-blog tetep jalan terus.


Di pagi hari ini aku akan memberikan contoh program yang masih berkaitan dengan artikel sebelumnya. Kali ini program akan menampilkan objek pipa berongga 3D seperti gambar di bawah ini.



Objek pipa dibuat dengan menggunakan rumus rotasi yang telah dibahas di artikel sebelummnya. Seperti objek Bola 3D dan Donat 3D cara pembuatan pipa berongga tidak jauh berbeda, cukup tentukan vertex dan rotasi vertex tersebut hingga terbentuk pipa berongga 3D.

void Pipa_Berongga_KTB_Solid(float d_sudut, float R, float Tebal, float Tinggi, Vertex PipaBerongga_KTB[8], Koordinat PipaBerongga_KTB_TK[4])
{
    int i, loop_i;
    float temp_sudut1, temp_sudut2;
    float R1, R2;
    double pi = 3.1415926535;

    loop_i = (int)(360.0 / d_sudut);

    R1 = R - (0.5f * Tebal);
    R2 = R + (0.5f * Tebal);

    temp_sudut1 = 0.0f;
    temp_sudut2 = d_sudut;

    glPushMatrix();

    for (i = 1; i <= loop_i; i++)
    {
        PipaBerongga_KTB[0].VX = R1 * (float)cos(temp_sudut2 / 180 * pi);
        PipaBerongga_KTB[0].VY = 0.5f * Tinggi;
        PipaBerongga_KTB[0].VZ = R1 * (float)sin(-temp_sudut2 / 180 * pi);

        PipaBerongga_KTB[1].VX = R1 * (float)cos(temp_sudut1 / 180 * pi);
        PipaBerongga_KTB[1].VY = 0.5f * Tinggi;
        PipaBerongga_KTB[1].VZ = R1 * (float)sin(-temp_sudut1 / 180 * pi);

        PipaBerongga_KTB[2].VX = R2 * (float)cos(temp_sudut1 / 180 * pi);
        PipaBerongga_KTB[2].VY = 0.5f * Tinggi;
        PipaBerongga_KTB[2].VZ = R2 * (float)sin(-temp_sudut1 / 180 * pi);

        PipaBerongga_KTB[3].VX = R2 * (float)cos(temp_sudut2 / 180 * pi);
        PipaBerongga_KTB[3].VY = 0.5f * Tinggi;
        PipaBerongga_KTB[3].VZ = R2 * (float)sin(-temp_sudut2 / 180 * pi);

        PipaBerongga_KTB[4].VX = R1 * (float)cos(temp_sudut2 / 180 * pi);
        PipaBerongga_KTB[4].VY = -0.5f * Tinggi;
        PipaBerongga_KTB[4].VZ = R1 * (float)sin(-temp_sudut2 / 180 * pi);

        PipaBerongga_KTB[5].VX = R1 * (float)cos(temp_sudut1 / 180 * pi);
        PipaBerongga_KTB[5].VY = -0.5f * Tinggi;
        PipaBerongga_KTB[5].VZ = R1 * (float)sin(-temp_sudut1 / 180 * pi);

        PipaBerongga_KTB[6].VX = R2 * (float)cos(temp_sudut1 / 180 * pi);
        PipaBerongga_KTB[6].VY = -0.5f * Tinggi;
        PipaBerongga_KTB[6].VZ = R2 * (float)sin(-temp_sudut1 / 180 * pi);

        PipaBerongga_KTB[7].VX = R2 * (float)cos(temp_sudut2 / 180 * pi);
        PipaBerongga_KTB[7].VY = -0.5f * Tinggi;
        PipaBerongga_KTB[7].VZ = R2 * (float)sin(-temp_sudut2 / 180 * pi);

        PipaBerongga_KTB_TK[0].X = (float)(i - 1) * d_sudut / 360;
        PipaBerongga_KTB_TK[0].Y = 1;

        PipaBerongga_KTB_TK[1].X = (float)(i - 1) * d_sudut / 360;
        PipaBerongga_KTB_TK[1].Y = 0;

        PipaBerongga_KTB_TK[2].X = (float)(i)* d_sudut / 360;
        PipaBerongga_KTB_TK[2].Y = 0;

        PipaBerongga_KTB_TK[3].X = (float)(i)* d_sudut / 360;
        PipaBerongga_KTB_TK[3].Y = 1;

        glBindTexture(GL_TEXTURE_2D, kulit_pipa_berongga);

        glBegin(GL_POLYGON);
        glTexCoord2f(PipaBerongga_KTB_TK[3].X, PipaBerongga_KTB_TK[3].Y);
        glVertex3f(PipaBerongga_KTB[0].VX, PipaBerongga_KTB[0].VY, PipaBerongga_KTB[0].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[0].X, PipaBerongga_KTB_TK[0].Y);
        glVertex3f(PipaBerongga_KTB[1].VX, PipaBerongga_KTB[1].VY, PipaBerongga_KTB[1].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[1].X, PipaBerongga_KTB_TK[1].Y);
        glVertex3f(PipaBerongga_KTB[2].VX, PipaBerongga_KTB[2].VY, PipaBerongga_KTB[2].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[2].X, PipaBerongga_KTB_TK[2].Y);
        glVertex3f(PipaBerongga_KTB[3].VX, PipaBerongga_KTB[3].VY, PipaBerongga_KTB[3].VZ);
        glEnd();

        glBegin(GL_POLYGON);
        glTexCoord2f(PipaBerongga_KTB_TK[0].X, PipaBerongga_KTB_TK[0].Y);
        glVertex3f(PipaBerongga_KTB[5].VX, PipaBerongga_KTB[5].VY, PipaBerongga_KTB[5].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[3].X, PipaBerongga_KTB_TK[3].Y);
        glVertex3f(PipaBerongga_KTB[4].VX, PipaBerongga_KTB[4].VY, PipaBerongga_KTB[4].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[2].X, PipaBerongga_KTB_TK[2].Y);
        glVertex3f(PipaBerongga_KTB[7].VX, PipaBerongga_KTB[7].VY, PipaBerongga_KTB[7].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[1].X, PipaBerongga_KTB_TK[1].Y);
        glVertex3f(PipaBerongga_KTB[6].VX, PipaBerongga_KTB[6].VY, PipaBerongga_KTB[6].VZ);
        glEnd();

        glBegin(GL_POLYGON);
        glTexCoord2f(PipaBerongga_KTB_TK[0].X, PipaBerongga_KTB_TK[0].Y);
        glVertex3f(PipaBerongga_KTB[2].VX, PipaBerongga_KTB[2].VY, PipaBerongga_KTB[2].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[1].X, PipaBerongga_KTB_TK[1].Y);
        glVertex3f(PipaBerongga_KTB[6].VX, PipaBerongga_KTB[6].VY, PipaBerongga_KTB[6].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[2].X, PipaBerongga_KTB_TK[2].Y);
        glVertex3f(PipaBerongga_KTB[7].VX, PipaBerongga_KTB[7].VY, PipaBerongga_KTB[7].VZ);

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

        glBegin(GL_POLYGON);
        glTexCoord2f(PipaBerongga_KTB_TK[3].X, PipaBerongga_KTB_TK[3].Y);
        glVertex3f(PipaBerongga_KTB[0].VX, PipaBerongga_KTB[0].VY, PipaBerongga_KTB[0].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[2].X, PipaBerongga_KTB_TK[2].Y);
        glVertex3f(PipaBerongga_KTB[4].VX, PipaBerongga_KTB[4].VY, PipaBerongga_KTB[4].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[1].X, PipaBerongga_KTB_TK[1].Y);
        glVertex3f(PipaBerongga_KTB[5].VX, PipaBerongga_KTB[5].VY, PipaBerongga_KTB[5].VZ);

        glTexCoord2f(PipaBerongga_KTB_TK[0].X, PipaBerongga_KTB_TK[0].Y);
        glVertex3f(PipaBerongga_KTB[1].VX, PipaBerongga_KTB[1].VY, PipaBerongga_KTB[1].VZ);
        glEnd();

        temp_sudut1 = temp_sudut1 + d_sudut;
        temp_sudut2 = temp_sudut2 + d_sudut;
    }
    glPopMatrix();
}

Sampai disini dulu rekan-rekan, aku berharap contoh-contoh program yang ogut lampirkan bisa menambah wawasan rekan-rekan. Matematika dan pemrograman grafik / game tidak akan terpisahkan, jika rekan-rekan berniat menekuni dunia pemrograman grafik dan game maka mau tidak mau rekan-rekan harus belajar tentang matematika vektor, matriks, trigonometri dan lain-lain.

Salam Sukses Selalu


Heriady
heriady.yoh@gmail.com





Artikel terkait

Transformasi geometri (Rotasi di koordinat cartesius 3D)

I Love Math, Bola 3D

I Love Math, Donat 3D

I Love Math, Botol 3D