Minggu, 28 Juni 2015

Donat 3D, I Love Math

Suatu pagi di bulan ramadhan, munculah ide untuk menulis ini...

Pagi rekan-rekan sekalian, pada hari ini aku akan membagi ilmu cara penerapan rumus rotasi pada sistem koordinat cartesius 3D. Setelah sebelumnya aku memberi contoh program cara membuat bola 3D dengan rotasi, maka kali ini ogut akan membuat donat 3D juga dengan memanfaatkan rumus rotasi.


Pada gambar di bawah terlihat sebuah donat 3D yang aku buat hanya dengan memutar vertex-nya, aku tidak akan membahas program ini secara detil karena akan membosankan rekan-rekan sekalian (nanti kalo rekan-rekan bosan tulisan ogut ngak mau dibaca lagi dah...hehehe).


Fungsi di bawah ini adalah fungsi untuk membuat donat 3D, jangan lupa hanya rumus rotasi yang ogut pakai.

void donat_KTB_Solid(Vertex donat_KTB[4], float d_sudut, float R, float Tebal, Koordinat donat_KTB_TK[4])
{
    int i, j;
    int loop_YZ;
    double pi = 3.1415926535;

    float temp_sudutZ1, temp_sudutZ2;
    float temp_sudutY1, temp_sudutY2;
    float awal_X, awal_Y, awal_Z;
    float Temp_X, Temp_Y, Temp_Z;

    float d_X_Koordinat, d_Y_Koordinat;

    awal_X = 0;
    awal_Y = Tebal;
    awal_Z = 0;

    temp_sudutZ1 = 0.0f;
    temp_sudutZ2 = d_sudut;

    temp_sudutY1 = 0.0f;
    temp_sudutY2 = d_sudut;

    loop_YZ = 360 / (int)d_sudut;

    d_X_Koordinat = 1.0f / (float)loop_YZ;
    d_Y_Koordinat = 1.0f / (float)loop_YZ;

    glPushMatrix();
    for (i = 1; i <= loop_YZ; i++)
    {
        for (j = 1; j <= loop_YZ; j++)
        {
            donat_KTB[0].VX = (awal_X * (float)cos(temp_sudutZ1 / 180 * pi)) + (-awal_Y * (float)sin(temp_sudutZ1 / 180 * pi));
            donat_KTB[0].VY = (awal_X * (float)sin(temp_sudutZ1 / 180 * pi)) + (awal_Y * (float)cos(temp_sudutZ1 / 180 * pi));
            donat_KTB[0].VZ = awal_Z;

            donat_KTB[0].VX = donat_KTB[0].VX - R;

            Temp_X = donat_KTB[0].VX;
            Temp_Y = donat_KTB[0].VY;
            Temp_Z = donat_KTB[0].VZ;

            donat_KTB[0].VX = (Temp_X * (float)cos(temp_sudutY1 / 180 * pi)) + (Temp_Z * (float)sin(temp_sudutY1 / 180 * pi));
            donat_KTB[0].VY = Temp_Y;
            donat_KTB[0].VZ = (-Temp_X * (float)sin(temp_sudutY1 / 180 * pi)) + (Temp_Z * (float)cos(temp_sudutY1 / 180 * pi));

            donat_KTB[3].VX = (Temp_X * (float)cos(temp_sudutY2 / 180 * pi)) + (Temp_Z * (float)sin(temp_sudutY2 / 180 * pi));
            donat_KTB[3].VY = Temp_Y;
            donat_KTB[3].VZ = (-Temp_X * (float)sin(temp_sudutY2 / 180 * pi)) + (Temp_Z * (float)cos(temp_sudutY2 / 180 * pi));

            donat_KTB[1].VX = (awal_X * (float)cos(temp_sudutZ2 / 180 * pi)) + (-awal_Y * (float)sin(temp_sudutZ2 / 180 * pi));
            donat_KTB[1].VY = (awal_X * (float)sin(temp_sudutZ2 / 180 * pi)) + (awal_Y * (float)cos(temp_sudutZ2 / 180 * pi));
            donat_KTB[1].VZ = awal_Z;

            donat_KTB[1].VX = donat_KTB[1].VX - R;

            Temp_X = donat_KTB[1].VX;
            Temp_Y = donat_KTB[1].VY;
            Temp_Z = donat_KTB[1].VZ;

            donat_KTB[1].VX = (Temp_X * (float)cos(temp_sudutY1 / 180 * pi)) + (Temp_Z * (float)sin(temp_sudutY1 / 180 * pi));
            donat_KTB[1].VY = Temp_Y;
            donat_KTB[1].VZ = (-Temp_X * (float)sin(temp_sudutY1 / 180 * pi)) + (Temp_Z * (float)cos(temp_sudutY1 / 180 * pi));

            donat_KTB[2].VX = (Temp_X * (float)cos(temp_sudutY2 / 180 * pi)) + (Temp_Z * (float)sin(temp_sudutY2 / 180 * pi));
            donat_KTB[2].VY = Temp_Y;
            donat_KTB[2].VZ = (-Temp_X * (float)sin(temp_sudutY2 / 180 * pi)) + (Temp_Z * (float)cos(temp_sudutY2 / 180 * pi));

            donat_KTB_TK[0].X = (float)(i - 1) * d_X_Koordinat;
            donat_KTB_TK[0].Y = 1 + ((float)(j - 1) * -d_Y_Koordinat);

            donat_KTB_TK[1].X = (float)(i - 1) * d_X_Koordinat;
            donat_KTB_TK[1].Y = 1 + ((float)j * -d_Y_Koordinat);

            donat_KTB_TK[2].X = (float)i * d_X_Koordinat;
            donat_KTB_TK[2].Y = 1 + ((float)j * -d_Y_Koordinat);

            donat_KTB_TK[3].X = (float)i * d_X_Koordinat;
            donat_KTB_TK[3].Y = 1 + ((float)(j - 1) * -d_Y_Koordinat);

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

            glTexCoord2f(donat_KTB_TK[1].X, donat_KTB_TK[1].Y);
            glVertex3f(donat_KTB[1].VX, donat_KTB[1].VY, donat_KTB[1].VZ);

            glTexCoord2f(donat_KTB_TK[2].X, donat_KTB_TK[2].Y);
            glVertex3f(donat_KTB[2].VX, donat_KTB[2].VY, donat_KTB[2].VZ);

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

            temp_sudutZ1 = temp_sudutZ1 + d_sudut;
            temp_sudutZ2 = temp_sudutZ2 + d_sudut;
        }

        temp_sudutZ1 = 0;
        temp_sudutZ2 = d_sudut;

        temp_sudutY1 = temp_sudutY1 + d_sudut;
        temp_sudutY2 = temp_sudutY2 + d_sudut;
    }

    glPopMatrix();
}

Sampai disini dulu artikel ini, nanti ogut akan kembali dengan contoh program yang lebih yahut...jika idenya muncul, kalo ngak ada ide ya...ngak nge-blog...hehehe. See you soon...

Salam OpenGL Selalu


Heriady
heriady.yoh@gmail.com




Artikel terkait

Transformasi geometri (Rotasi di koordinat cartesius 3D)

I Love Math, Bola 3D

I Love Math, Botol 3D

I Love Math, Pipa Berongga 3D

Tidak ada komentar:

Posting Komentar