Animasi Grafik OPERASI STRING
2008 | Direktorat Pembinaan SMK
383 wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc; wc.cbClsExtra =
; wc.cbWndExtra =
; wc.hInstance = hInstance;
wc.hIcon = LoadIcon NULL, IDI_APPLICATION; wc.hCursor = LoadCursor NULL, IDC_ARROW;
wc.hbrBackground = HBRUSH GetStockObject BLACK_BRUSH; wc.lpszMenuName = NULL;
wc.lpszClassName =
GLSample ;
RegisterClass wc; create main window
hWnd = CreateWindow GLSample
, OpenGL
Sample ,
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, ,
, 256
, 256
, NULL, NULL, hInstance, NULL;
enable OpenGL for the window EnableOpenGL hWnd, hDC, hRC;
program main loop
while bQuit {
check for messages
if PeekMessage msg, NULL,
, ,
PM_REMOVE {
handle or dispatch messages
if msg.message == WM_QUIT {
bQuit = TRUE; }
else {
TranslateMessage msg; DispatchMessage msg;
} }
else {
OpenGL animation code goes here
384
Direktorat Pembinaan SMK | 2008
glClearColor 1.0f
, 1.0f
, 1.0f
, 0.0f
; glClear GL_COLOR_BUFFER_BIT;
glPushMatrix ; glRotatef theta,
0.0f ,
0.0f ,
1.0f ;
glBegin GL_QUADS; glColor3f
1.0f ,
0.0f ,
0.0f ;
glVertex2f ‐ 0.5f
, 0.5f
; glColor3f
0.0f ,
1.0f ,
0.0f ;
glVertex2f 0.5f
, 0.5f
; glColor3f
0.0f ,
0.0f ,
1.0f ;
glVertex2f 0.5f
, ‐
0.5f ;
glColor3f 0.0f
, 0.0f
, 0.0f
; glVertex2f ‐
0.5f ,
‐ 0.5f
; glEnd ;
glPopMatrix ; SwapBuffers hDC;
theta +=
1.0f ;
Sleep 1
; }
} shutdown OpenGL
DisableOpenGL hWnd, hDC, hRC; destroy the window explicitly
DestroyWindow hWnd; return msg.wParam;
}
Window Procedure LRESULT
CALLBACK WndProc HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
{
switch message {
case WM_CREATE: return
;
case WM_CLOSE: PostQuitMessage
;
2008 | Direktorat Pembinaan SMK
385
return
;
case WM_DESTROY: return
;
case WM_KEYDOWN: switch wParam
{ case VK_ESCAPE:
PostQuitMessage
;
return
; }
return
;
default: return DefWindowProc hWnd, message, wParam, lParam;
} }
Enable OpenGL
void
EnableOpenGL HWND hWnd, HDC hDC, HGLRC hRC {
PIXELFORMATDESCRIPTOR pfd; int iFormat;
get the device context DC hDC = GetDC hWnd;
set the pixel format for the DC
ZeroMemory pfd, sizeof pfd; pfd.nSize = sizeof pfd;
pfd.nVersion = 1
; pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits =
24 ;
pfd.cDepthBits = 16
; pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat hDC, pfd; SetPixelFormat hDC, iFormat, pfd;
386
Direktorat Pembinaan SMK | 2008
create and enable the render context RC hRC = wglCreateContext hDC ;
wglMakeCurrent hDC, hRC ; }
Disable OpenGL
void
DisableOpenGL HWND hWnd, HDC hDC, HGLRC hRC {
wglMakeCurrent NULL, NULL; wglDeleteContext hRC;
ReleaseDC hWnd, hDC; }
Keluaran program di atas akan menganimasikan kotak dengan
warna-warni yang menarik dan berputar berlawanan arah jarum jam.
Gambar kotak yang terjadi seperti berikut:
Gambar 11.4. Grafik berwarna warni Jika diperhatikan atau dipelajari
pasti akan Menarik bukan? Warna- warna tersebut dimunculkan dengan
mengkombinasikan argumen- argumen pada perintah glColor3f,
cermati dalam listing program. Dalam program yang sesungguhnya kotak
tersebut selain berwarna-warni juga berputar berlawanan arah putaran
jarum jam counter clockwise. Perintah apa yang membuat kotak ini
berputar ? Kita lihat program di atas: glRotatef
theta, 0.0f, 0.0f, 1.0f; sesuai namanya perintah di ataslah
yang menyebabkan kotak ini berputar. Format perintah ini secara
lengkapnya sebagai berikut : Argumen pertama theta untuk
mengatur kecepatan putar makin besar angkanya makin cepat
putaran yang terjadi Argumen kedua jika diisi 1 1.0
maka kotak akan berputar dengan sumbu garis horizontal mendatar
ke arah tertentu. Untuk memutar ke arah yang berlawanan dari
2008 | Direktorat Pembinaan SMK
387 contoh, argumen diisi angka -1 -
1.0 Argumen ketiga juga mirip dengan
argumen kedua namun berputarnya terhadap sumbu
vertical tegak lurus Argumen keempat untuk memutar
kotak flat dengan sumbu titik nol diagram cartesius. Jika diisi angka
1 1.0 maka akan berputar berlawanan arah putaran jarum
jam counter clockwise, sedangkan untuk berputar searah
dengan arah putaran jarum jam clockwise diisi angka -1 -1.0.
Hal yang menarik jika argumen ini diisi angka 0 0.0 maka kotak
akan zoom in dan zoom out bergantian.
Kombinasi dari argumen-argumen yang ada akan membuat variasi
pergerakan yang sangat menarik Untuk mengatur laju perputaran
animasi yang terjadi bisa dengan memodifikasi theta, atau dengan
perintah sleepargumen. Laju kecepatan putar tergantung pada
nilai argumen pada sleep, makin besar angkanya makin lambat bukan
makin cepat. Lebih lanjut dengan grafik, jika akan membuat segi enam
maka perubahan yang terjadi seperti berikut:
Program 11.5 OpenGL animation code goes here
glClearColor 0.0f
, 0.0f
, 0.0f
, 1.0f
; glClear
GL_COLOR_BUFFER_BIT; glPushMatrix
; glRotatef
theta, 0.0f
, 0.0f
, ‐
1.0f ;
glBegin GL_POLYGON;
glColor3f 1.0f
, 0.0f
, 0.0f
; glVertex2f ‐
0.3f ,
0.54f ;
glColor3f 0.0f
, 1.0f
, 0.0f
; glVertex2f
0.3f ,
0.54f ;
glColor3f 0.0f
, 0.0f
, 1.0f
; glVertex2f
0.61f ,
0.0f ;
glColor3f 0.0f
, 1.0f
, 1.0f
; glVertex2f
0.3f ,
‐ 0.54f
; glColor3f
1.0f ,
1.0f ,
0.0f ;
glVertex2f ‐ 0.3f
, ‐
0.54f ;
glColor3f 1.0f
, 1.0f
, 1.0f
; glVertex2f ‐
0.61f ,
0.0f ;
glEnd ;
glPopMatrix ;
SwapBuffers hDC;
theta +=
2.0f ;
Sleep 1
;
388
Direktorat Pembinaan SMK | 2008
Tentu saja vertex berubah bertambah banyak, banyaknya vertex
sesuai dengan jumlah sudut yang dibentuk. Jangan lupa argumen pada
glBegin diisi dengan GL_POLYGON sehingga bisa menciptakan segi
banyak seperti yang dikehendaki. Selain glRotatef pengaturan
animasi dapat juga dengan glTranslatef. Dengan perintah ini
kita dapat menggerakkan obyek kekiri, kekanan, ke atas, maupun ke
bawah. Contoh program sebagai berikut:
Program 11.6 include
windows.h include
glgl.h Function Declarations
LRESULT CALLBACK WndProc HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam;
void
EnableOpenGL HWND hWnd, HDC hDC, HGLRC hRC;
void
DisableOpenGL HWND hWnd, HDC hDC, HGLRC hRC;
WinMain
int
WINAPI WinMain HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int iCmdShow
{
WNDCLASS wc; HWND hWnd;
HDC hDC; HGLRC hRC;
MSG msg; BOOL bQuit = FALSE;
float theta = ‐
1.0f ;
float alpha = ‐
1.0f ;
register window class wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc; wc.cbClsExtra =
;
2008 | Direktorat Pembinaan SMK
389 wc.cbWndExtra =
; wc.hInstance = hInstance;
wc.hIcon = LoadIcon NULL, IDI_APPLICATION; wc.hCursor = LoadCursor NULL, IDC_ARROW;
wc.hbrBackground = HBRUSH GetStockObject BLACK_BRUSH; wc.lpszMenuName = NULL;
wc.lpszClassName =
GraphGL ;
RegisterClass wc; create main window
hWnd = CreateWindow GraphGL
, OpenGL
Graphics Animation ,
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, ,
, 512
, 512
, NULL, NULL, hInstance, NULL;
enable OpenGL for the window EnableOpenGL hWnd, hDC, hRC;
program main loop
while bQuit {
check for messages
if PeekMessage msg, NULL,
, ,
PM_REMOVE {
handle or dispatch messages
if msg.message == WM_QUIT {
bQuit = TRUE; }
else {
TranslateMessage msg; DispatchMessage msg;
} }
else {
OpenGL animation code goes here glClearColor
1.0f ,
1.0f ,
1.0f ,
1.0f ;
glClear GL_COLOR_BUFFER_BIT;
390
Direktorat Pembinaan SMK | 2008
glPushMatrix ; glTranslatef theta, alpha,
0.0f ;
glColor3f 1.0f
, 0.0f
, 1.0f
; glRectf‐
0.2 ,
0.2 ,
0.2 ,
‐ 0.2
; glPopMatrix ;
SwapBuffers hDC; if theta =
1.0 {
theta = ‐ 1.0f
; alpha = ‐
1.0f ;
} else if theta =
1.0 {
theta += 0.01f
; alpha +=
0.01f ;
} Sleep
10 ;
} }
shutdown OpenGL DisableOpenGL hWnd, hDC, hRC;
destroy the window explicitly DestroyWindow hWnd;
return msg.wParam; }
Window Procedure LRESULT
CALLBACK WndProc HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
{
switch message {
2008 | Direktorat Pembinaan SMK
391
case WM_CREATE: return
;
case WM_CLOSE: PostQuitMessage
;
return
;
case WM_DESTROY: return
;
case WM_KEYDOWN: switch wParam
{ case VK_ESCAPE:
PostQuitMessage
;
return
; }
return
;
default: return DefWindowProc hWnd, message, wParam, lParam;
} }
Enable OpenGL
void
EnableOpenGL HWND hWnd, HDC hDC, HGLRC hRC {
PIXELFORMATDESCRIPTOR pfd; int iFormat;
get the device context DC hDC = GetDC hWnd;
set the pixel format for the DC
ZeroMemory pfd, sizeof pfd; pfd.nSize = sizeof pfd;
pfd.nVersion = 1
; pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits =
24 ;
pfd.cDepthBits = 16
;
392
Direktorat Pembinaan SMK | 2008
pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat hDC, pfd;
SetPixelFormat hDC, iFormat, pfd;
create and enable the render context RC hRC = wglCreateContext hDC ;
wglMakeCurrent hDC, hRC ; }
Disable OpenGL
void
DisableOpenGL HWND hWnd, HDC hDC, HGLRC hRC {
wglMakeCurrent NULL, NULL; wglDeleteContext hRC;
ReleaseDC hWnd, hDC; }
Hasil eksekusi program di atas akan menggerakkan sebuah kotak
berjalan secara diagonal dari pojok kiri bawah ke kanan atas secara
terus menerus. Akan tetapi jika ada penekanan mouse di taskbar maka
kotak berhenti, jika penekanan dilepas kotak jalan lagi. Untuk selesai
bisa menggunakan tombol ESCape.