Senin, 25 Mei 2015

Membuat Objek Balok 3D Wire / Kawat

Pagi yang cerah tidak ada mendung, setelah habis weekend nge-blog lagi...



Pagi Rekan-rekan sekalian...salam sukses selalu

Kali ini aku akan memperkenalkan objek 3D yang sangat sederhana tapi banyak gunanya di pemrograman grafik  / game 3D. Objek 3D yang akan kita buat berbentuk balok seperti gambar di bawah ini.


Untuk membuat program seperti ini rekan-rekan yang baru bergabung atau baru pertama  kali membaca artikel di blog ini sebaiknya membaca dahulu tentang cara membuat Empty Project dan cara membuat program OpenGL 3D yang berbasis Empty Project.

Ok kita langsung saja masuk dalam materi.


Perhatikan gambar di atas, balok ternyata mempunyai 6(enam) polygon dan masing-masing polygon berbentuk persegipanjang, untuk membuat balok rekan-rekan memerlukan 8(delapan) buah vertex (titik koordinat) , vertex-vertex tersebut dapat rekan-rekan simpan pada sebuah array.

Perhatikan tabel berikut ini.


Kolom ‘Vertex’ merupakan bagian terpenting pada tabel tersebut, rekan-rekan harus dapat mengerti isi dari kolom tersebut, karena merupakan dasar untuk membuat objek 3D balok dan dasar untuk membuat objek 3D lainnya.

Sekarang aku akan menjelaskan cara untuk membuat polygon bagian muka/depan dari balok, sedangkan cara untuk membuat kelima polygon lainnya tidak akan dibahas karena cara pembuatannya sama dengan polygon muka balok.

Perhatikan kolom ‘Vertex’ pada polygon muka balok, disitu tertera empat buah vertex dengan urutan sebagai berikut: (-1/2p, -1/2t, 1/2l), (-1/2p, 1/2t, 1/2l), (1/2p, 1/2t, 1/2l), (1/2p, -1/2t, 1/2l). Vertex pertama (-1/2p, -1/2t, 1/2l), adalah vertex untuk sudut kiri bawah dari polygon muka balok, p, t, dan l adalah variable untuk panjang, tinggi, dan lebar balok, kegunaan p, t, dan l adalah agar balok dapat dibuat fleksibel sesuai dengan kebutuhan, sebagai contoh jika Anda ingin membuat sebuah balok dengan ukuran panjang=1, tinggi=2, dan lebar=0.5 maka vertex untuk polygon muka balok tersebut akan menjadi sebagai berikut: : (-1/2p, -1/2t, 1/2l) dengan p=1.0, t= 2.0, l=0.5 maka (-1/2x1.0, -1/2x2.0, 1/2x0.5) hasil akhir (-0.5, -1.0, 0.25). Cara yang sama juga diterapkan pada vertex-vertex lain, juga untuk vertex pada polygon-polygon yang lain.

Sekarang pertanyaan yang timbul pada para rekan-rekan adalah bagaimana mendapatkan rumus untuk vertex-vertex tersebut. Coba perhatikan gambar 1 pada gambar tersebut terlihat jelas bahwa balok terletak ditengah-tengah pusat sumbu X, Y, Z. Panjang sejajar dengan sumbu X, tinggi sejajar dengan sumbu Y, sedangkan lebar/tebal sejajar dengan sumbu Z. Karena balok diletakkan ditengah-tengah pusat sumbu maka Anda tinggal membagi dua tiap varibel panjang, tinggi, dan lebar untuk menentukan delapan vertex balok tersebut, kedelapan vertex balok dapat Anda lihat pada tabel 1 pada kolom ‘Vertex’.

Setelah Anda dapat membuat vertex balok langkah berikutnya adalah menggambar enam polygon balok, perhatikan gambar 2.


Angka-angka 0 sampai dengan 7 adalah urutan dari variabel array tempat menyimpan vertex polygon-polygon balok. Jadi vertex sudut kiri bawah dari polygon muka balok akan disimpan pada array ke-0 (array pada C++ di mulai dari 0), demikian seterusnya, Rekan-rekan dapat melihat urutan penyimpanan vertex pada variabel array di tabel 1 kolom ‘Array’. Tanda * pada tabel 1 menunjukan bahwa vertex tersebut telah ada(pengulangan).

Berdasarkan tabel 1 rekan-rekan dapat membuat 6 polygon untuk balok, sehingga sub program untuk membuat polygon muka balok akan menjadi seperti di bawah ini.

void balok_wire(Vertex read_Balok[8])
{
        //sisi depan
glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[0].VX, read_Balok[0].VY, read_Balok[0].VZ);
glVertex3f(read_Balok[1].VX, read_Balok[1].VY, read_Balok[1].VZ);
glVertex3f(read_Balok[2].VX, read_Balok[2].VY, read_Balok[2].VZ);
glVertex3f(read_Balok[3].VX, read_Balok[3].VY, read_Balok[3].VZ);
glEnd();
     
        ...
        ...
        ...
}

Sekarang coba perhatikan kembali tabel 1 kolom ‘Vertex Textfile’, kolom ini berisi nilai sama dengan kolom ‘Vertex’ tetapi variabel p, t, dan l dihilangkan. Kegunaan kolom ‘Vertex Textfile’ ini untuk mengisi variabel array yang akan digunakan untuk menggambar balok. Perhatikan tabel 2, tabel ini adalah isi dari sebuah textfile yang bernama balok_vertex.txt dan isi dari textfile tersebut sama dengan isi tabel 1 kolom ‘Vertex Textfile’.


Sekarang aku akan menjelaskan bagaimana cara membuat objek 3D balok pada OpenGL.

Langkah pertama yang harus diambil adalah membuat array yang diperlukan untuk menampung 8 buah vertex balok, untuk itu rekan-rekan memerlukan sebuah array yang dapat menampung vertex x, vertex y, dan vertex z dengan deklarasi sebagai berikut.

/////////////////Struct
typedef struct
{
float VX, VY, VZ;
}Vertex;

Vertex balok1_vertex[8];
Vertex balok2_vertex[8];

Langkah selanjutnya mengisi array tersebut dengan nilai yang diambil dari textfile’balok_vertex.txt’, lalu meng-update nilai array tersebut dengan panjang, tinggi dan lebar balok.

void loadBalok(float panjang, float tinggi, float lebar, Vertex read_Balok[8])
{
cek_error_load = true;

int i = 0;

ifstream balokDat;

balokDat.open("TXT_files/balok_vertex.txt");

if (!balokDat)
{
cek_error_load = false;
exit(0);
}

while (!balokDat.eof())
{
balokDat >> read_Balok[i].VX >> read_Balok[i].VY >> read_Balok[i].VZ;
i++;
}

for (i = 0; i < 8; i++)
{
read_Balok[i].VX = read_Balok[i].VX * panjang;
read_Balok[i].VY = read_Balok[i].VY * tinggi;
read_Balok[i].VZ = read_Balok[i].VZ * lebar;
}
}

Setelah langkah di atas selesai rekan-rekan tinggal menggambar keenam polygon balok tersebut. 

void balok_wire(Vertex read_Balok[8])
{
        //sisi depan
glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[0].VX, read_Balok[0].VY, read_Balok[0].VZ);
glVertex3f(read_Balok[1].VX, read_Balok[1].VY, read_Balok[1].VZ);
glVertex3f(read_Balok[2].VX, read_Balok[2].VY, read_Balok[2].VZ);
glVertex3f(read_Balok[3].VX, read_Balok[3].VY, read_Balok[3].VZ);
glEnd();
   
        //sisi kanan
glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[2].VX, read_Balok[2].VY, read_Balok[2].VZ);
glVertex3f(read_Balok[3].VX, read_Balok[3].VY, read_Balok[3].VZ);
glVertex3f(read_Balok[4].VX, read_Balok[4].VY, read_Balok[4].VZ);
glVertex3f(read_Balok[5].VX, read_Balok[5].VY, read_Balok[5].VZ);
glEnd();

        //sisi belakang
glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[4].VX, read_Balok[4].VY, read_Balok[4].VZ);
glVertex3f(read_Balok[5].VX, read_Balok[5].VY, read_Balok[5].VZ);
glVertex3f(read_Balok[6].VX, read_Balok[6].VY, read_Balok[6].VZ);
glVertex3f(read_Balok[7].VX, read_Balok[7].VY, read_Balok[7].VZ);
glEnd();

        //sisi kiri
glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[6].VX, read_Balok[6].VY, read_Balok[6].VZ);
glVertex3f(read_Balok[7].VX, read_Balok[7].VY, read_Balok[7].VZ);
glVertex3f(read_Balok[0].VX, read_Balok[0].VY, read_Balok[0].VZ);
glVertex3f(read_Balok[1].VX, read_Balok[1].VY, read_Balok[1].VZ);
glEnd();

        //sisi atas
glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[1].VX, read_Balok[1].VY, read_Balok[1].VZ);
glVertex3f(read_Balok[2].VX, read_Balok[2].VY, read_Balok[2].VZ);
glVertex3f(read_Balok[5].VX, read_Balok[5].VY, read_Balok[5].VZ);
glVertex3f(read_Balok[6].VX, read_Balok[6].VY, read_Balok[6].VZ);
glEnd();

        //sisi bawah
glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[0].VX, read_Balok[0].VY, read_Balok[0].VZ);
glVertex3f(read_Balok[3].VX, read_Balok[3].VY, read_Balok[3].VZ);
glVertex3f(read_Balok[4].VX, read_Balok[4].VY, read_Balok[4].VZ);
glVertex3f(read_Balok[7].VX, read_Balok[7].VY, read_Balok[7].VZ);
glEnd();
}

Jadi dah objek balok 3D wire / kawat, selesai dah tugas ogut memperkenalkan objek 3D yang sederhana ini. Objek balok 3D amat simple dan bagus untuk dijadikan bahan bagi rekan-rekan yang baru terjun ke dunia grafik 3D. Pada artikel berikutnya ogut akan mengajarkan cara memberikan tekstur pada balok 3D, jadi sabar ya...utak-atik aja dulu ini program untuk memperdalam ilmu grafik 3D rekan-rekan. Dan berikut ini ogut sertakan kode program secara lengkap silahkan di copy paste, author programmer dapat rekan-rekan sertakan ato tidak itu terserah rekan-rekan ngak ada paksaan...hehehe.

//berguna untuk memangkas library
//yang tidak terpakai
#define WIN32_LEAN_AND_MEAN  
#define VC_LEANMEAN  
#define VC_EXTRALEAN      

//include yang harus disertakan
#include<windows.h>
#include<stdio.h>        
#include<stdlib.h>
#include<mmsystem.h>
#include <fstream>            

using std::ifstream;

//include khusus OpenGL
#include<gl/gl.h>              
#include<gl/glu.h>
#include "glaux/glaux.h" //header ini ada di dalam folder GLAUX

//library untuk OpenGL
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "GLAUX/glaux.lib") //library ini ada di dalam folder GLAUX

//Variable global yang dipakai untuk program ini
HDC My_HDC_Global;

//set tinggi dan lebar untuk window screen
unsigned int tinggi_window_Screen = 600;
unsigned int lebar_window_Screen = 800;

//penempatan posisi window screen di monitor
unsigned int X_window_Screen = 150;
unsigned int Y_window_Screen = 50;


float Sudut_Putar = 0.0f;
bool cek_error_load;

/////////////////Struct
typedef struct
{
float VX, VY, VZ;
}Vertex;

Vertex balok1_vertex[8];
Vertex balok2_vertex[8];

bool Load_All_Data();
void loadBalok(float panjang, float tinggi, float lebar, Vertex read_Balok[8]);
void balok_wire(Vertex read_Balok[8]);

//+++++++++++++++++++++++++++++++++++++++++++
//untuk membuat program grafik dengan OpenGL
//hanya dibutuhkan empat buah fungsi, dengan
//WinMain sebagai fungsi utama (WinMain 1 fungsi tambah 3 fungsi dibawah ini jadi 4 semuanya)
LRESULT CALLBACK My_WindowProc(HWND hwnd_p, UINT message_p, WPARAM wparam_p, LPARAM lparam_p);
void Window_Pixel_Format(HDC hdc_GPF_p);
void Display_Grafik();

//+++++++++++++++++++++++++++++++++++++++++++

//fungsi yang dipanggil pertama kali
//oleh Operating system Windows, pada
//saat program dijalankan
int WINAPI WinMain(HINSTANCE hinstance_p, HINSTANCE hprevinstance_p, LPSTR lpcmdline_p, int nshowcmd_p)
{
MSG My_MSG;
WNDCLASSEX My_WNDCLASSEX;
HWND My_HWND;
bool My_MainLoop = false;

//deklarasi variable untuk membuat window
My_WNDCLASSEX.cbSize = sizeof(WNDCLASSEX);
My_WNDCLASSEX.style = CS_HREDRAW | CS_VREDRAW;

//My_WindowProc adalah fungsi yang kita buat
//untuk memproses message-message,
//fungsi ini yang terus menerus akan dipanggil
//oleh fungsi WinMain, sehingga harus kita
//daftarkan di bawah ini
My_WNDCLASSEX.lpfnWndProc = My_WindowProc;

My_WNDCLASSEX.cbClsExtra = 0;
My_WNDCLASSEX.cbWndExtra = 0;
My_WNDCLASSEX.hInstance = hinstance_p;
My_WNDCLASSEX.hIcon = LoadIcon(NULL, IDI_WINLOGO);
My_WNDCLASSEX.hCursor = LoadCursor(NULL, IDC_WAIT);
My_WNDCLASSEX.hbrBackground = NULL;
My_WNDCLASSEX.lpszMenuName = NULL;
My_WNDCLASSEX.lpszClassName = "MyOpenGL";
My_WNDCLASSEX.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

//register window Class
//jika terjadi error program dihentikan
if (!RegisterClassEx(&My_WNDCLASSEX))
{
MessageBox(NULL,
"Register Window Class Failed", "Window Error", MB_OK);
return 0;
}

//jika register window class berhasil
//lanjutkan dengan create window
My_HWND = CreateWindowEx(
NULL,
"MyOpenGL",
"Heriady Blog heriadyblog.blogspot.com (Esc to quit)",
NULL,
X_window_Screen,
Y_window_Screen,
lebar_window_Screen,
tinggi_window_Screen,
NULL,
NULL,
hinstance_p,
NULL);

//jika window tidak bisa di-create
//program dihentikan
if (!My_HWND)
{
MessageBox(NULL,
"Failed to Create Window", "Window Error", MB_OK);
return 0;
}

///////////LOAD Vertex
if (!Load_All_Data())
return 0;

//jika window bisa di-create
//tampilkan window ke monitor
ShowWindow(My_HWND, SW_SHOW);
UpdateWindow(My_HWND);

//Looping utama
while (!My_MainLoop)
{
//proses message dari antrian
PeekMessage(&My_MSG, 0, 0, 0, PM_REMOVE);

//selama tidak ada message 'Quit'
//looping akan terus berjalan
if (My_MSG.message != WM_QUIT)
{
//panggil fungsi untuk render window
//disini
Display_Grafik();

//translate Virtual key message,
//menjadi chararcter message dan
//buang message yang sudah diproses
TranslateMessage(&My_MSG);
DispatchMessage(&My_MSG);
}
else
//jika message = 'Quit'
//keluar dari looping
My_MainLoop = true;


} //while (!My_MainLoop)

//unregister window class
UnregisterClass("MyOpenGL", My_WNDCLASSEX.hInstance);

//akhiri program
return (int)My_MSG.wParam;
}

//fungsi yang dipanggil oleh WinMain
//untuk memproses message-message
LRESULT CALLBACK My_WindowProc(HWND hwnd_p, UINT message_p, WPARAM wparam_p, LPARAM lparam_p)
{
static HGLRC My_HGLRC;
static HDC My_HDC;

//pada saat window dibuat pertama kali
//kondisi if di bawah memenuhi
if (message_p == WM_CREATE)
{
My_HDC = GetDC(hwnd_p);
My_HDC_Global = My_HDC;

//pada saat pertama kali dibuat
//window screen harus di setup pixel
//agar bisa dibuat untuk tampilan grafik
Window_Pixel_Format(My_HDC);

My_HGLRC = wglCreateContext(My_HDC);
wglMakeCurrent(My_HDC, My_HGLRC);

return 0;
}

//pada saat program hendak keluar
//kondisi if di bawah memenuhi
if (message_p == WM_DESTROY)
{
wglMakeCurrent(My_HDC, NULL);
wglDeleteContext(My_HGLRC);
PostQuitMessage(0);

return 0;
}

//untuk saat window dibuat pertama kali atau
//window diubah ukurannya.
//pada program ini ukuran window
//tidak bisa diubah, tetapi kondisi if
//di bawah harus tetap di pasang
if (message_p == WM_SIZE)
{
//fungsi OpenGL untuk set
//tinggi dan lebar window screen
glViewport(0, 0, lebar_window_Screen, tinggi_window_Screen);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

//memakai pandangan 3D perspektif
gluPerspective(45.0, (GLfloat)lebar_window_Screen / (GLfloat)tinggi_window_Screen, 1.0, 1000.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//warna latar belakang hitam
glClearColor(0.0, 0.0, 0.0, 0.0);

//perhitungan depth buffer diaktifkan
glEnable(GL_DEPTH_TEST);

return 0;
}

//tombol ESC ditekan
//untuk keluar dari program
if ((message_p == WM_KEYDOWN) && (wparam_p == VK_ESCAPE))
{
//fungsi untuk mengirimkan
//message WM_QUIT
PostQuitMessage(0);

return 0;
}

//return kembali nilai LRESULT
return (DefWindowProc(hwnd_p, message_p, wparam_p, lparam_p));
}

//fungsi untuk setup pixel, yang
//dipakai untuk program grafik,
//fungsi ini harus ada jika hendak membuat
//program grafik
void Window_Pixel_Format(HDC hdc_GPF_p)
{
int My_Pixel_Format;

static PIXELFORMATDESCRIPTOR My_PFD =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
16,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
16,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};

My_Pixel_Format = ChoosePixelFormat(hdc_GPF_p, &My_PFD);

SetPixelFormat(hdc_GPF_p, My_Pixel_Format, &My_PFD);
}

bool Load_All_Data()
{
loadBalok(0.7f, 0.7f, 0.7f, balok1_vertex); //kubus
if (cek_error_load == false)
return false;

loadBalok(0.3f, 0.9f, 0.9f, balok2_vertex); //balok
if (cek_error_load == false)
return false;

return true;
}


void loadBalok(float panjang, float tinggi, float lebar, Vertex read_Balok[8])
{

cek_error_load = true;


int i = 0;

ifstream balokDat;

balokDat.open("TXT_files/balok_vertex.txt");

if (!balokDat)
{
cek_error_load = false;
exit(0);
}

while (!balokDat.eof())
{
balokDat >> read_Balok[i].VX >> read_Balok[i].VY >> read_Balok[i].VZ;
i++;
}

for (i = 0; i < 8; i++)
{
read_Balok[i].VX = read_Balok[i].VX * panjang;
read_Balok[i].VY = read_Balok[i].VY * tinggi;
read_Balok[i].VZ = read_Balok[i].VZ * lebar;
}
}


void balok_wire(Vertex read_Balok[8])
{
glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[0].VX, read_Balok[0].VY, read_Balok[0].VZ);
glVertex3f(read_Balok[1].VX, read_Balok[1].VY, read_Balok[1].VZ);
glVertex3f(read_Balok[2].VX, read_Balok[2].VY, read_Balok[2].VZ);
glVertex3f(read_Balok[3].VX, read_Balok[3].VY, read_Balok[3].VZ);
glEnd();

glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[2].VX, read_Balok[2].VY, read_Balok[2].VZ);
glVertex3f(read_Balok[3].VX, read_Balok[3].VY, read_Balok[3].VZ);
glVertex3f(read_Balok[4].VX, read_Balok[4].VY, read_Balok[4].VZ);
glVertex3f(read_Balok[5].VX, read_Balok[5].VY, read_Balok[5].VZ);
glEnd();

glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[4].VX, read_Balok[4].VY, read_Balok[4].VZ);
glVertex3f(read_Balok[5].VX, read_Balok[5].VY, read_Balok[5].VZ);
glVertex3f(read_Balok[6].VX, read_Balok[6].VY, read_Balok[6].VZ);
glVertex3f(read_Balok[7].VX, read_Balok[7].VY, read_Balok[7].VZ);
glEnd();

glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[6].VX, read_Balok[6].VY, read_Balok[6].VZ);
glVertex3f(read_Balok[7].VX, read_Balok[7].VY, read_Balok[7].VZ);
glVertex3f(read_Balok[0].VX, read_Balok[0].VY, read_Balok[0].VZ);
glVertex3f(read_Balok[1].VX, read_Balok[1].VY, read_Balok[1].VZ);
glEnd();

glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[1].VX, read_Balok[1].VY, read_Balok[1].VZ);
glVertex3f(read_Balok[2].VX, read_Balok[2].VY, read_Balok[2].VZ);
glVertex3f(read_Balok[5].VX, read_Balok[5].VY, read_Balok[5].VZ);
glVertex3f(read_Balok[6].VX, read_Balok[6].VY, read_Balok[6].VZ);
glEnd();

glBegin(GL_LINE_LOOP);
glVertex3f(read_Balok[0].VX, read_Balok[0].VY, read_Balok[0].VZ);
glVertex3f(read_Balok[3].VX, read_Balok[3].VY, read_Balok[3].VZ);
glVertex3f(read_Balok[4].VX, read_Balok[4].VY, read_Balok[4].VZ);
glVertex3f(read_Balok[7].VX, read_Balok[7].VY, read_Balok[7].VZ);
glEnd();
}

//fungsi yang dipakai untuk menampilkan
//semua object(Polygon) yang akan kita buat
//pada window screen
void Display_Grafik()
{
//clear buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

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

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


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

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

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


glTranslatef(-1.0f, 0.0f, -1.0f);
balok_wire(balok1_vertex); //kubus
glTranslatef(2.0f, 0.0f, 0.0f);
balok_wire(balok2_vertex); //balok
glTranslatef(0.0f, 0.0f, 2.0f);

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

Update 30 Des 2015

Program membuat balok 3D ini sangat sederhana, tetapi merupakan dasar bagi  rekan-rekan untuk memahami proses pembuatan objek 3D, setelah rekan-rekan memahami proses pembuatan balok 3D rekan-rekan nanti akan bisa membuat objek 3D lainnya yang lebih rumit seperti tangki air 3D di bawah ini.


Dan setelah itu rekan-rekan bisa membuat objek 3D apa saja seperti contoh gambar di bawah ini (klik di sini untuk menuju ke artikel).


Selamat Belajar rekan-rekan, kita akan bertemu dan belajar lagi lebih dalam di artikel berikutnya.

Salam Grafik 3D


Heriady
heriady.yoh@gmail.com


Download untuk program ini tersedia, rekan-rekan tinggal download aja, ngak usah capek-capek ngetik.


Sumber
Artikel ini bersumber dari buku Pemrograman Grafik 3D menggunakan C & OpenGL, dikarang oleh Heriady (halaman 44 s/d 56)












Artikel terkait
Program objek 3D dengan OpenGL