Jumat, 12 Juni 2015

Konsep Face dan Metode 3 Daftar

Pagi semuanya...sudah beberapa hari ngak bisa ngeblog karena urusan ini-itu, sekarang sudah kembali lagi.

Kali ini aku tidak akan membahas tentang pemrograman, tetapi akan membahas konsep face, yaitu poligon (3 vertex) sederhana yang akan kita pakai untuk membuat objek 3D. Dengan menggunakan konsep ini maka rekan-rekan bisa menampilkan objek 3D apa saja yang kalian kehendaki (tank, pohon, mobil, pesawat, dll), untuk rekan-rekan yang baru bergabung silahkan terlebih dahulu membaca artikel sebelumnya yang berhubungan erat dengan artikel ini (membuat balok 3D wire dan balok 3D solid).

Ok kita lanjut saja...


Gambar di atas adalah gambar sebuah persegipanjang dengan dua face (poligon berbentuk segitiga yang membelah pesegipajang) yang mempunyai empat buah vertex dan empat buah tekstur koordinat(TK).
Jika vertex, TK, dan face pada gambar di atas dibuat daftarnya maka hasilnya seperti di bawah ini.


Ketiga daftar tersebut dapat disatukan dengan cara  memberi index sehingga menghasilkan daftar seperti berikut.


Daftar face berisi index yang menunjuk ke daftar vertex dan daftar TK. Cara inilah yang disebut dengan metode 3 Daftar yang berguna untuk menampilkan object 3D pada program grafik / game.

Berikut ini contoh objek balok 3D yang dibuat 3 daftarnya, dengan menggunakan cara ini maka rekan-rekan nantinya akan bisa membuat objek 3D bentuk apapun dengan bantuan tools 3ds max.


Berdasarkan gambar di atas maka objek balok 3D bisa dibuat 3 daftarnya seperti berikut ini.


Untuk mempermudah rekan-rekan memahami konsep ini ogut memakai 4 buah file text untuk menyimpan objek 3D balok, file ke-empat (Box01.TOTAL) berisi total banyaknya  index dari face, tekstur koordinat dan vertex yang harus di siapkan di program.



Pertama load objek 3D balok terlebih dahulu.

bool Load_3_Daftar(float skala, Mesh3D_Struct& Object_Mesh3D)
{
    FILE *file;
    errno_t err;
    int i;

    if ((err = fopen_s(&file, "box_Mesh/box01.total", "r")) != 0)
    {
        MessageBox(NULL, _T("Mesh3D load error"), _T(" .TOTAL File tidak ditemukan!"), MB_OK);
        return false;
    }

    fscanf_s(file, "%d", &Object_Mesh3D.TotalF_Mesh3D);
    fscanf_s(file, "%d", &Object_Mesh3D.TotalTK_Mesh3D);
    fscanf_s(file, "%d", &Object_Mesh3D.TotalV_Mesh3D);
   

    fclose(file);

    //siapkan tempat untuk data mesh
    Object_Mesh3D.Face_Mesh3D = new Face[Object_Mesh3D.TotalF_Mesh3D];
    Object_Mesh3D.TK_Mesh3D = new TK[Object_Mesh3D.TotalTK_Mesh3D];
    Object_Mesh3D.V_Mesh3D = new Vertex[Object_Mesh3D.TotalV_Mesh3D];

    if ((err = fopen_s(&file, "box_Mesh/box01.face", "r")) != 0)
    {
        MessageBox(NULL, _T("Mesh3D load error"), _T(" .FACE File tidak ditemukan!"), MB_OK);
        return false;
    }

    //load Face
    for (i = 0; i < Object_Mesh3D.TotalF_Mesh3D; i++)
    {
        fscanf_s(file, "%d", &Object_Mesh3D.Face_Mesh3D[i].indexV1);
        fscanf_s(file, "%d", &Object_Mesh3D.Face_Mesh3D[i].indexV2);
        fscanf_s(file, "%d", &Object_Mesh3D.Face_Mesh3D[i].indexV3);

        fscanf_s(file, "%d", &Object_Mesh3D.Face_Mesh3D[i].indexTK1);
        fscanf_s(file, "%d", &Object_Mesh3D.Face_Mesh3D[i].indexTK2);
        fscanf_s(file, "%d", &Object_Mesh3D.Face_Mesh3D[i].indexTK3);

        Object_Mesh3D.Face_Mesh3D[i].indexV1--;
        Object_Mesh3D.Face_Mesh3D[i].indexV2--;
        Object_Mesh3D.Face_Mesh3D[i].indexV3--;

        Object_Mesh3D.Face_Mesh3D[i].indexTK1--;
        Object_Mesh3D.Face_Mesh3D[i].indexTK2--;
        Object_Mesh3D.Face_Mesh3D[i].indexTK3--;
    }
   
    fclose(file);

    if ((err = fopen_s(&file, "box_Mesh/box01.tk", "r")) != 0)
    {
        MessageBox(NULL, _T("Mesh3D load error"), _T(" .TK File tidak ditemukan!"), MB_OK);
        return false;
    }

    //load TK
    for (i = 0; i < Object_Mesh3D.TotalTK_Mesh3D; i++)
    {
        fscanf_s(file, "%f", &Object_Mesh3D.TK_Mesh3D[i].s);
        fscanf_s(file, "%f", &Object_Mesh3D.TK_Mesh3D[i].t);
    }

    fclose(file);

    if ((err = fopen_s(&file, "box_Mesh/box01.vertex", "r")) != 0)
    {
        MessageBox(NULL, _T("Mesh3D load error"), _T(" .VERTEX File tidak ditemukan!"), MB_OK);
        return false;
    }

    //load Vertex
    for (i = 0; i < Object_Mesh3D.TotalV_Mesh3D; i++)
    {
        fscanf_s(file, "%f", &Object_Mesh3D.V_Mesh3D[i].X);
        fscanf_s(file, "%f", &Object_Mesh3D.V_Mesh3D[i].Y);
        fscanf_s(file, "%f", &Object_Mesh3D.V_Mesh3D[i].Z);

        //skala Mesh3D
        Object_Mesh3D.V_Mesh3D[i].X = Object_Mesh3D.V_Mesh3D[i].X * skala;
        Object_Mesh3D.V_Mesh3D[i].Y = Object_Mesh3D.V_Mesh3D[i].Y * skala;
        Object_Mesh3D.V_Mesh3D[i].Z = Object_Mesh3D.V_Mesh3D[i].Z * skala;

        RotasiX(-180.0, Object_Mesh3D.V_Mesh3D[i].X, Object_Mesh3D.V_Mesh3D[i].Y, Object_Mesh3D.V_Mesh3D[i].Z);
    }

    fclose(file);

    return true;
}

Lalu tampilkan semua face objek 3D balok.

void Display_3_Daftar(Mesh3D_Struct Object_Mesh3D, int iDisplay_Polygon)
{
    int i;

    for (i = 0; i < Object_Mesh3D.TotalF_Mesh3D; i++)
    {
        if (iDisplay_Polygon == 1)
            glBegin(GL_TRIANGLES);
        else
            glBegin(GL_LINE_LOOP);

        glTexCoord2d(Object_Mesh3D.TK_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexTK1].s,
                             Object_Mesh3D.TK_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexTK1].t);
        glVertex3d(Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV1].X,
                           Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV1].Y,
                           Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV1].Z);

        glTexCoord2d(Object_Mesh3D.TK_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexTK2].s,
                             Object_Mesh3D.TK_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexTK2].t);
        glVertex3d(Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV2].X,
                           Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV2].Y,
                           Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV2].Z);

        glTexCoord2d(Object_Mesh3D.TK_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexTK3].s,
                             Object_Mesh3D.TK_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexTK3].t);
        glVertex3d(Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV3].X,
                           Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV3].Y,
                           Object_Mesh3D.V_Mesh3D[Object_Mesh3D.Face_Mesh3D[i].indexV3].Z);
        glEnd();
    }

    return;
}

Selesai sudah pembahasan teori face, mudah bukan...pahami konsep ini dengan baik karena berhubungan dengan artikel lain yang akan diterangkan di artikel berikutnya.

Salam Hangat


Heriady
heriady.yoh@gmail.com


Download objek 3D dengan metode 3 daftar disini.


Artikel terkait
Program balok 3D wire
Program balok 3D solid

Program objek 3D garden dengan 3ds max
Membuat objek 3D dengan 3ds max