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
Tidak ada komentar:
Posting Komentar