Minggu, 28 Juni 2015

Bola 3D, I Love Math

Dari depan lapotopku yang sangat setia menemani daku nge-blog...

Pagi semuanya...setelah break beberapa waktu...sekarang saatnya kembali aktif nge-blog...

Setelah sebelumnya aku membahas tentang matematika  transformasi geormetri khususnya tentang rotasi di koordinat cartesius 3D, kali ini aku akan memberikan contoh progam yang menggunakan rumus rotasi


Pada gambar di bawah Anda dapat melihat objek bola 3D yang dibuat dengan menggunakan rumus rotasi, ogut tidak akan menerangkan secara rinci karena prinsipnya sangat sederhana, tentukan sebuah vertex lalu rotasikan vertex tersebut hingga terbentuk bola.




Fungsi yang digunakan untuk membuat bola sebagai berikut.

void bola_KTB_Solid(float R)
{
    int i, j;
    int loop_Y, loop_Z;
    Vertex bola_KTB[4];
    double pi = 3.1415926535;

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

    Koordinat bola_KTB_TK[4];
    float d_X_Koordinat, d_Y_Koordinat;

    d_sudut = 10.0f;

    awal_X = 0;
    awal_Y = R;
    awal_Z = 0;

    temp_sudutZ1 = 0.0f;
    temp_sudutZ2 = d_sudut;

    temp_sudutY1 = 0.0f;
    temp_sudutY2 = d_sudut;

    loop_Z = 180 / (int)d_sudut;
    loop_Y = 360 / (int)d_sudut;

    /////teture koordinat
    d_X_Koordinat = 1.0f / (float)loop_Y;
    d_Y_Koordinat = 1.0f / (float)loop_Z;

    glPushMatrix();

    for (i = 1; i <= loop_Y; i++)
    {
        for (j = 1; j <= loop_Z; j++)
        {
            //array 0, titik awal di putar sumbu Z dgn sudut Z1, lalu di putar sumby Y dgn sudut Y1
            bola_KTB[0].VX = (awal_X * (float)cos(temp_sudutZ1 / 180 * pi)) + (-1 * awal_Y * (float)sin(temp_sudutZ1 / 180 * pi));
            bola_KTB[0].VY = (awal_X * (float)sin(temp_sudutZ1 / 180 * pi)) + (awal_Y * (float)cos(temp_sudutZ1 / 180 * pi));
            bola_KTB[0].VZ = awal_Z;

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

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

            //array 1, titik awal di putar sumbu Z dgn sudut Z2, lalu di putar sumby Y dgn sudut Y1
            bola_KTB[1].VX = (awal_X * (float)cos(temp_sudutZ2 / 180 * pi)) + (-1 * awal_Y * (float)sin(temp_sudutZ2 / 180 * pi));
            bola_KTB[1].VY = (awal_X * (float)sin(temp_sudutZ2 / 180 * pi)) + (awal_Y * (float)cos(temp_sudutZ2 / 180 * pi));
            bola_KTB[1].VZ = awal_Z;

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

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

            //array 2, titik awal di putar sumbu Z dgn sudut Z2, lalu di putar sumby Y dgn sudut Y2
            bola_KTB[2].VX = (awal_X * (float)cos(temp_sudutZ2 / 180 * pi)) + (-1 * awal_Y * (float)sin(temp_sudutZ2 / 180 * pi));
            bola_KTB[2].VY = (awal_X * (float)sin(temp_sudutZ2 / 180 * pi)) + (awal_Y * (float)cos(temp_sudutZ2 / 180 * pi));
            bola_KTB[2].VZ = awal_Z;

            Temp_X = bola_KTB[2].VX;
            Temp_Y = bola_KTB[2].VY;
            Temp_Z = bola_KTB[2].VZ;

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

            //array 3, titik awal di putar sumbu Z dgn sudut Z1, lalu di putar sumby Y dgn sudut Y2
            bola_KTB[3].VX = (awal_X * (float)cos(temp_sudutZ1 / 180 * pi)) + (-1 * awal_Y * (float)sin(temp_sudutZ1 / 180 * pi));
            bola_KTB[3].VY = (awal_X * (float)sin(temp_sudutZ1 / 180 * pi)) + (awal_Y * (float)cos(temp_sudutZ1 / 180 * pi));
            bola_KTB[3].VZ = awal_Z;

            Temp_X = bola_KTB[3].VX;
            Temp_Y = bola_KTB[3].VY;
            Temp_Z = bola_KTB[3].VZ;

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

            //perhitungan texture koordinat
            bola_KTB_TK[0].X = (float)(i - 1) * d_X_Koordinat;
            bola_KTB_TK[0].Y = 1 + ((float)(j - 1) * -d_Y_Koordinat);

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

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

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

            //gambar bola       
            glBindTexture(GL_TEXTURE_2D, kulit_bola);

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

            glTexCoord2f(bola_KTB_TK[1].X, bola_KTB_TK[1].Y);
            glVertex3f(bola_KTB[1].VX, bola_KTB[1].VY, bola_KTB[1].VZ);

            glTexCoord2f(bola_KTB_TK[2].X, bola_KTB_TK[2].Y);
            glVertex3f(bola_KTB[2].VX, bola_KTB[2].VY, bola_KTB[2].VZ);

            glTexCoord2f(bola_KTB_TK[3].X, bola_KTB_TK[3].Y);
            glVertex3f(bola_KTB[3].VX, bola_KTB[3].VY, bola_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();
}

Mudah kan, dengan contoh program di atas ogut berharap rekan-rekan bisa lebih berkreasi lagi, masih banyak trik dan program grafik / game yang dapat Anda buat, sekian dulu sampai jumpa di artikel berikutnya.

Salam Sukses Selalu


Heriady
heriady.yoh@gmail.com




Artikel terkait

Transformasi geometri (Rotasi di koordinat cartesius 3D)

I Love Math, Donut 3D

I Love Math, Botol 3D

I Love Math, Pipa Berongga 3D

Tidak ada komentar:

Posting Komentar