Senin, 15 Juni 2015

Objek 3D low polygon dengan 3ds max

Hari masih pagi, setelah habis weekend lanjut ngeblog lagi...

Met Pagi semuanya, aku berharap rekan-rekan dalam keadaan sehat selalu...kali ini aku akan memberi contoh program yang menampilkan objek 3D yang dibuat dengan jumlah poligon sedikit (low polygon). Bagi rekan-rekan yang baru bergabung atau baru membaca artikel  ini sebaiknya membaca artikel yang aku tulis sebelumnya agar tidak bingung (tik tok tik tok).


Objek 3D low polygon diperlukan untuk membuat game agar proses render ke layar monitor menjadi lebih cepat. Objek 3D low polygon pada program ini semuanya dibuat dengan menggunakan 3ds max, rekan-rekan dapat melihat screen shoot yang ogut capture.






Dengan menggunakan metode 3 daftar objek 3D yang dibuat dengan 3ds max bisa ditampilkan oleh OpenGL, seperti gambar berikut ini.






Teknik pemrogramman tidak akan ogut jelaskan lagi, karena telah ogut bahas di artikel konsep face dan metode 3 daftar. Ada dua proses penting yang harus rekan-rekan perhatikan, pertama load objek 3 daftar seperti bangku, pohon dan lampu.

bool Load_All_Data()
{
    int i;

    if (!Load_3_Daftar("Bangku/Bangku.Meshtxt", 0.035f, Bangku1))
        return false;
    for (i = 0; i < Bangku1.TotalV_Mesh3D; i++)
        TranslasiXYZ(Bangku1.V_Mesh3D[i].X, Bangku1.V_Mesh3D[i].Y, Bangku1.V_Mesh3D[i].Z, 0.0f, 0.0f, 1.5f);
    if (!Load_3_Daftar("Bangku/Bangku.Meshtxt", 0.035f, Bangku2))
        return false;
    for (i = 0; i < Bangku2.TotalV_Mesh3D; i++)
    {
        RotasiY(180, Bangku2.V_Mesh3D[i].X, Bangku2.V_Mesh3D[i].Y, Bangku2.V_Mesh3D[i].Z);
        TranslasiXYZ(Bangku2.V_Mesh3D[i].X, Bangku2.V_Mesh3D[i].Y, Bangku2.V_Mesh3D[i].Z, 0.0f, 0.0f, -1.5f);
    }

    if (!Load_3_Daftar("Meja/Meja.Meshtxt", 0.035f, Meja))
        return false;
    //for (i = 0; i < Meja.TotalV_Mesh3D; i++)
    //    TranslasiXYZ(Meja.V_Mesh3D[i].X, Meja.V_Mesh3D[i].Y, Meja.V_Mesh3D[i].Z, 0.0f, 0.0f, 1.0f);

    if (!Load_3_Daftar("Lampu/Lampu.Meshtxt", 0.025f, Lampu))
        return false;
    for (i = 0; i < Lampu.TotalV_Mesh3D; i++)
    {
        RotasiY(90, Lampu.V_Mesh3D[i].X, Lampu.V_Mesh3D[i].Y, Lampu.V_Mesh3D[i].Z);
        TranslasiXYZ(Lampu.V_Mesh3D[i].X, Lampu.V_Mesh3D[i].Y, Lampu.V_Mesh3D[i].Z, 3.0f, 0.0f, 0.0f);
    }
   
    if (!Load_3_Daftar("Pohon_kelapa/Dahankelapa.Meshtxt", 0.045f, DahanKelapa))
        return false;
    for (i = 0; i < DahanKelapa.TotalV_Mesh3D; i++)
        TranslasiXYZ(DahanKelapa.V_Mesh3D[i].X, DahanKelapa.V_Mesh3D[i].Y, DahanKelapa.V_Mesh3D[i].Z, -4.0f, 3.0f, 2.0f);

    if (!Load_3_Daftar("Pohon_kelapa/Daunkelapa.Meshtxt", 0.045f, DaunKelapa))
        return false;
    for (i = 0; i < DaunKelapa.TotalV_Mesh3D; i++)
        TranslasiXYZ(DaunKelapa.V_Mesh3D[i].X, DaunKelapa.V_Mesh3D[i].Y, DaunKelapa.V_Mesh3D[i].Z, -4.0f, 3.0f, 2.0f);

    if (!Load_3_Daftar("Talas/Talas.Meshtxt", 0.02f, Talas1))
        return false;
    for (i = 0; i < Talas1.TotalV_Mesh3D; i++)
        TranslasiXYZ(Talas1.V_Mesh3D[i].X, Talas1.V_Mesh3D[i].Y, Talas1.V_Mesh3D[i].Z, 4.5f, 0.0f, 0.0f);

    if (!Load_3_Daftar("Talas/Talas.Meshtxt", 0.02f, Talas2))
        return false;
    for (i = 0; i < Talas2.TotalV_Mesh3D; i++)
    {
        RotasiY(45, Talas2.V_Mesh3D[i].X, Talas2.V_Mesh3D[i].Y, Talas2.V_Mesh3D[i].Z);
        TranslasiXYZ(Talas2.V_Mesh3D[i].X, Talas2.V_Mesh3D[i].Y, Talas2.V_Mesh3D[i].Z, 4.5f, 0.0f, 1.4f);
    }

    if (!Load_3_Daftar("Talas/Talas.Meshtxt", 0.02f, Talas3))
        return false;
    for (i = 0; i < Talas3.TotalV_Mesh3D; i++)
    {
        RotasiY(90, Talas3.V_Mesh3D[i].X, Talas3.V_Mesh3D[i].Y, Talas3.V_Mesh3D[i].Z);
        TranslasiXYZ(Talas3.V_Mesh3D[i].X, Talas3.V_Mesh3D[i].Y, Talas3.V_Mesh3D[i].Z, 4.5f, 0.0f, 2.8f);
    }

    if (!Load_3_Daftar("Talas/Talas.Meshtxt", 0.02f, Talas4))
        return false;
    for (i = 0; i < Talas4.TotalV_Mesh3D; i++)
    {
        RotasiY(135, Talas4.V_Mesh3D[i].X, Talas4.V_Mesh3D[i].Y, Talas4.V_Mesh3D[i].Z);
        TranslasiXYZ(Talas4.V_Mesh3D[i].X, Talas4.V_Mesh3D[i].Y, Talas4.V_Mesh3D[i].Z, 4.5f, 0.0f, -1.4f);
    }

    if (!Load_3_Daftar("Talas/Talas.Meshtxt", 0.02f, Talas5))
        return false;
    for (i = 0; i < Talas5.TotalV_Mesh3D; i++)
    {
        RotasiY(180, Talas5.V_Mesh3D[i].X, Talas5.V_Mesh3D[i].Y, Talas5.V_Mesh3D[i].Z);
        TranslasiXYZ(Talas5.V_Mesh3D[i].X, Talas5.V_Mesh3D[i].Y, Talas5.V_Mesh3D[i].Z, 4.5f, 0.0f, -2.8f);
    }

    return true;
}

Kedua menampilkan objek 3D low polygon ke layar monitor.

void Display_Grafik()
{
    int Display_polygon = 1;
    //clear buffer
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

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

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

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

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

    ////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();

    glBindTexture(GL_TEXTURE_2D, texture_merah);
    if (Display_polygon == 1)
        glBegin(GL_POLYGON);
    else
        glBegin(GL_LINES);
    glTexCoord2f(0.0f, 0.0f);
    glVertex3f(-5.0f, 0.0f, 5.0f);
    glTexCoord2f(1.0f, 0.0f);
    glVertex3f(5.0f, 0.0f, 5.0f);
    glTexCoord2f(1.0f, 1.0f);
    glVertex3f(5.0f, 0.0f, -5.0f);
    glTexCoord2f(0.0f, 1.0f);
    glVertex3f(-5.0f, 0.0f, -5.0f);
    glEnd();

    glBindTexture(GL_TEXTURE_2D, Text_Bangku);
    Display_3_Daftar(Bangku1, Display_polygon);
    Display_3_Daftar(Bangku2, Display_polygon);
    Display_3_Daftar(Meja, Display_polygon);

    glBindTexture(GL_TEXTURE_2D, Text_Lampu);
    Display_3_Daftar(Lampu, Display_polygon);

    glBindTexture(GL_TEXTURE_2D, Text_Talas);
    Display_3_Daftar(Talas1, Display_polygon);
    Display_3_Daftar(Talas2, Display_polygon);
    Display_3_Daftar(Talas3, Display_polygon);
    Display_3_Daftar(Talas4, Display_polygon);
    Display_3_Daftar(Talas5, Display_polygon);

    glBindTexture(GL_TEXTURE_2D, Text_Dahan);
    Display_3_Daftar(DahanKelapa, Display_polygon);

    glBindTexture(GL_TEXTURE_2D, Text_Daun);
    Display_3_Daftar(DaunKelapa, Display_polygon);

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

Update 29 Des 2015

Setelah rekan-rekan bisa membuat objek 3D langkah selanjutnya rekan-rekan bisa belajar membuat program animasi 3D, seperti gambar dibawah ini.



Selamat Berkreasi rekan-rekan


Heriady
heriady.yoh@gmail.com




Artikel terkait

Program Animasi Game MoTer 3D dengan OpenGL

Membuat Terrain untuk Hely 3D

Membuat Animasi Hely 3D dengan OpenGL

Konsep face dan metode 3 daftar

Garden 3D yang dibuat dengan 3ds max

Membuat objek 3D dengan 3ds max