Komputer Grafis adalah cabang dari Ilmu
Komputer dan berkaitan dengan manipulasi visual content dan proses sistesisnya
secara digital. Walaupun istilah ini sering mengacu kepada komputer grafik 3
dimensi, tetapi sebenarnya juga mencakup grafik 2 dimensi dan pengolahan citra.
Grafik meliputi gambar dan pencitraan
lain yang dihasilkan oleh komputer berbentuk garis, lengkungan, kurva dan
sebagainya. Komputer dapat menghasilkan pencitraan dalam sejumlah pixel, dan
printer dot matrix akan mencetak citra/gambar tersebut dalam sejumlah titik.
Perkembangan grafika komputer menuntut para pengembang sistem
aplikasi grafika komputer untuk dapat mengembangkan suatu informasi yang
dilengkapi dengan visualisasi dan animasi, agar dapat lebih mudah dipahami oleh
pihak yang menggunakan sistem tersebut. Grafika komputer telah menunjukkan
kemajuan yang pesat dalam pengembangan berbagai aplikasi untuk
menghasilkan gambar.
Grafika komputer digunakan untuk menunjang berbagai bidang dengan
teknologi grafika berbasis komputer. Penggunaan grafika komputer telah lama
digunakan dalam beberapa macam aplikasi, diantaranya pendidikan, kedokteran,
fisika, matematika, multimedia, dan lain-lain. Pada saat ini grafika komputer
sudah digunakan pada bidang sains, engineering, kedokteran, bisnis, industri,
pemerintahan, seni, hiburan, iklan, pendidikan, dan lain-lain. Oleh karena itu,
sudah semakin banyak pula bahasa pemrograman yang dilengkapi dengan
tools/library pembuatan grafik Salah satu tools/library pembuatan aplikasi
grafik adalah OpenGL (Open Graphics Library). OpenGL (Open Graphics Library)
adalah suatu spefikasi grafik yang low-level yang menyediakan fungsi untuk
pembuatan grafik primitif termasuk titik, garis, dan lingkaran. OpenGL
digunakan untuk mendefinisikan suatu objek, baik objek 2 dimensi maupun objek 3
dimensi.
OpenGL juga merupakan suatu antarmuka pemrograman aplikasi
(applicationprogramming interface (API) yang tidak tergantung pada piranti dan
platform yangdigunakan, sehingga OpenGL dapat berjalan pada sistem operasi
Windows, UNIX dansistem operasi lainnya.
OpenGL pada awalnya didesain untuk digunakan pada bahasapemrograman
C/C++, namun dalam perkembangannya OpenGL dapat juga digunakandalam bahasa
pemrograman yang lain seperti Java, Tcl, Ada, Visual Basic, Delphi,maupun Fortran. Namun OpenGL di-package secara berbeda-beda sesuai dengan bahasapemrograman yang digunakan.
Grafika komputer pada dasarnya adalah suatu bidang ilmu komputer yang
mempelajaricara-cara untuk meningkatkan dan memudahkan komunikasi antara
manusia denganmesin (komputer) dengan jalan membangkitkan, menyimpan, dan
memanipulasi gambar model suatu objek menggunakan komputer. Grafika komputer
memungkinkan kita untuk berkomunikasi lewat gambar-gambar, bagan-bagan,
dan diagram-diagram. Grafikakomputer dikembangkan melalui suatu sistem
operasi yang berbasis GUI (Graphical UserInterface). Graphical User
Interface (GUI), dalam hubungannya dengan sains komputer,adalah suatu antarmuka
berbentuk tampilan yang memungkinkan seorang user untuk memilih perintah,
menjalankan program, melihat serangkaian file dan memilih opsi laindengan
menunjukkan representasi gambar (icon) ataupun melalui sejumlah menu padalayar
komputer. Beberapa kemajuan utama dalam computer grafik 3D:
1.
Flat shading à suatu teknik shades masing-masing polygon dari
suatu objek berdasarkan pada polygon “normal” dan posisi serta intensitas
sumber cahaya.
2.
Gouraud shading à ditemukan oleh Henri Gouraud pada tahun 1971
dengan teknik resource-conscious yang digunakan untuk menirukan shade
dengan permukaanlembut dan penyisipan warna puncak antarpermukaan polygon.
3.
Texture mapping à suatu teknik untuk menirukan detail permukaan denganpemetaan
gambar (tekstur) menjadi polygons.
4.
Phong shading à ditemukan oleh Bui Tuong Phong; suatu teknik
shading yanglembut penyisipan yang puncak mendekati normal pencahayaan dari
polygoncurved-surface dengan antarpermukaan; model pencahayaan meliputi
glossyreflection dengan suatu tingkatan permukaan yang halus.
5.
Bump mapping à ditemukan oleh Jim Blinn, suatu teknik
normal-perturbationyang digunakan untuk menirukan permukaan yang tidak rata
atau mengerut.
6.
Ray Tracing à suatu metode berdasarkan pada prinsip fisik
dari ilmu opticgeometris yang bisa menirukan pantulan berulang dan
transparan.
7.
Radiosity à suatu teknik untuk global illumination yang
menggunakan teoriperpindahan radiatif untuk menirukan iluminasi secara tidak
langsung (yangdicerminkan)
Disini, saya akan memberikan sebuah contoh program berbahasa C menggunakan OpenGL.
Kebutuhan
|
Keterangan
|
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdlib.h>
|
Include yang digunakan ini adalah yang
digunakan untuk MAC OS, yang berbeda dengan OS Windows, sehingga ada beberapa
perbedaan pada include seperti yang digunakan di OS Windows.
|
int x1=0, y1=0, sudut=0,
z1=0,z=0;
float x=0.0f, y=0.0f,
angle=180;
GLfloat xP = 0.0f;
GLfloat yP = 0.0f;
|
Parameter-parameter komponen yang
digunakan.
|
static void display(void)
{
GLdouble eqn[4] = {0.0, -1.0, 0.0, 0.0};
GLdouble eqn2[4] = {0.0, 0.0, 0.0, 1.0};
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.0f, 10.0f, 0.0f);
glRotatef(xP, 1.0f, 0.0f, 0.0f);
glRotatef(yP, 0.0f, 1.0f, 0.0f);
glRotatef(x, 1.0f, 0.0f, 0.0f);
glRotatef(y, 0.0f, 1.0f, 0.0f);
glColor3d(1,0,0);
//Bagian Bawah
glClipPlane (GL_CLIP_PLANE0, eqn);
glEnable (GL_CLIP_PLANE0);
glClipPlane (GL_CLIP_PLANE1, eqn2);
glEnable (GL_CLIP_PLANE1);
glPushMatrix();
glTranslatef(-50,-150,1);
glScalef(1,1,1);
glRotatef(90,0,1,0);
//glRotated(sudut,x1,y1,z1);
glutSolidTorus(50,100,50,50);
glPopMatrix();
glPushMatrix();
glTranslatef(50,-150,1);
glScalef(1,1,1);
glRotatef(90,0,1,0);
//glRotated(sudut,x1,y1,z1);
glutSolidTorus(50,100,50,50);
glPopMatrix();
glDisable(GL_CLIP_PLANE0);
glDisable(GL_CLIP_PLANE1);
………….
glPopMatrix();
angle+=1;
rads = angle*3.14/180;
x = 2*cos((double) rads);
glutSwapBuffers();
glutPostRedisplay();
}
|
Penggambaran Kursi dimulai dengan void
dasar ini.
|
angle+=0.5;
rads = angle*3.14/180;
x = 5*cos((double) rads);
glutPostRedisplay();
|
Rumus yang digunakan untuk
menggerakkan kursi goyang, di ambil dari referensi gerakan pendulum/bandul di
internet
|
const GLfloat
light_ambient[] = { 0.0f, 0.0f, 0.0f,
1.0f };
const GLfloat
light_diffuse[] = { 1.0f, 1.0f, 1.0f,
1.0f };
const GLfloat light_specular[] =
{ 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] =
{ 1.0f, 2.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] =
{ 100.0f };
Dalam Fungsi Main:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0,
GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR,
light_specular);
glLightfv(GL_LIGHT0, GL_POSITION,
light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS,
high_shininess);
|
Untuk permainan pencahayaan pada objek
|
void CameraView(unsigned char
key, int x, int y){ //arah lihat dr kamera
if(key == 'a')
xP-= 5.0f;
if(key == 'b')
xP += 5.0f;
if(key == 'c')
yP -= 5.0f;
if(key == 'd')
yP += 5.0f;
if(key > 356.0f)
xP = 0.0f;
if(key < -1.0f)
xP = 355.0f;
if(key > 356.0f)
yP = 0.0f;
if(key < -1.0f)
yP = 355.0f;
}
|
Untuk melihat dari sisi kamera.dengan
menekan tombol, a,b,c ,dan d
|
void reshape(GLsizei width,
GLsizei height) {
if (height == 0) height = 1;
GLfloat aspect = (GLfloat)width /
(GLfloat)height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (width >= height) {
glOrtho(-200.0 * aspect, 200.0 *
aspect, -200.0, 300.0, 900.0, -10000.0);
}else{
glOrtho(-300.0, 300.0, -300.0 /
aspect, 300.0 / aspect, 1000.0, -10000.0);
}
}
|
Menyesuaikan
ukuran objek saat ukuran tampilan windows di ubah
|
Ini dia source code nya.
/*Daniar Dwi Pratiwi
118101093
IK 34 03
Kursi Goyang Futuristik
tekan a,b,c,atau d untuk memutar
*/
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#include <GL/glu.h>
#include<math.h>
#include<iostream>
#endif
#include <stdlib.h>
float x=0.0f, y=0.0f, angle=180;
double rads=0;
GLfloat xP = 0.0f;
GLfloat yP = 0.0f;
void reshape(GLsizei width, GLsizei height) {
if (height
== 0) height = 1;
GLfloat
aspect = (GLfloat)width / (GLfloat)height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if
(width >= height) {
glOrtho(-200.0 * aspect, 200.0 * aspect, -200.0, 300.0, 900.0,
-10000.0);
}else{
glOrtho(-300.0, 300.0, -300.0 / aspect, 300.0 / aspect, 1000.0,
-10000.0);
}
}
static void display(void)
{
GLdouble
eqn[4] = {0.0, -1.0, 0.0, 0.0};
GLdouble
eqn2[4] = {0.0, 0.0, 0.0, 1.0};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.0f,
10.0f, 0.0f);
glRotatef(xP, 1.0f, 0.0f, 0.0f);
glRotatef(yP,
0.0f, 1.0f, 0.0f);
glRotatef(x,
1.0f, 0.0f, 0.0f);
glRotatef(y,
0.0f, 1.0f, 0.0f);
glColor3d(1,0,0);
//Bagian Bawah
glClipPlane (GL_CLIP_PLANE0, eqn);
glEnable
(GL_CLIP_PLANE0);
glClipPlane (GL_CLIP_PLANE1, eqn2);
glEnable
(GL_CLIP_PLANE1);
glPushMatrix();
glTranslatef(-50,-150,1);
glScalef(1,1,1);
glRotatef(90,0,1,0);
//glRotated(sudut,x1,y1,z1);
glutSolidTorus(50,100,50,50);
glPopMatrix();
glPushMatrix();
glTranslatef(50,-150,1);
glScalef(1,1,1);
glRotatef(90,0,1,0);
//glRotated(sudut,x1,y1,z1);
glutSolidTorus(50,100,50,50);
glPopMatrix();
glDisable(GL_CLIP_PLANE0);
glDisable(GL_CLIP_PLANE1);
//Bagai Sandaran
glPushMatrix();
glTranslated(0.0,1.2,-70);
glRotated(-29,0,0,2);
glutSolidTorus(10,90,10,3);
glPopMatrix();
glPushMatrix();
glTranslated(2,-5.5,-70);
glRotated(0,1,0,2);
glutSolidCube(66);
glPopMatrix();
glPushMatrix();
glTranslated(2,-80,-70);
glRotated(0,1,0,2);
glScalef(2.5,1,1);
glutSolidCube(66);
glPopMatrix();
//Bagian Alas
glPushMatrix();
glTranslated(2,-116,0);
glRotated(0,1,0,2);
glScalef(10,0.1,10);
glutSolidCube(20);
glPopMatrix();
//Bagian Kaki
glPushMatrix();
glTranslated(-50,-160,-1);
glRotated(0,1,0,2);
glutSolidSphere(50,20,10);
glPopMatrix();
glPushMatrix();
glColor3d(0.0,1.0,0.0);
glTranslated(50,-160,-1);
glRotated(0,1,0,2);
//glScalef(2.5,0.1,40);
glutSolidSphere(50,20,10);
glPopMatrix();
glPopMatrix();
angle+=1;
rads
= angle*3.14/180;
x =
2*cos((double) rads);
glutSwapBuffers();
glutPostRedisplay();
}
void CameraView(unsigned char key, int x, int y){
//arah lihat dr kamera
if(key ==
'a')
xP-=
5.0f;
if(key ==
'b')
xP +=
5.0f;
if(key ==
'c')
yP -=
5.0f;
if(key ==
'd')
yP +=
5.0f;
if(key
> 356.0f)
xP =
0.0f;
if(key
< -1.0f)
xP =
355.0f;
if(key
> 356.0f)
yP =
0.0f;
if(key
< -1.0f)
yP =
355.0f;
}
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f,
1.0f };
const GLfloat light_position[] = { 1.0f, 2.0f, 5.0f,
0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/* Program entry point */
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Kursi Goyang");
glutReshapeFunc(reshape);
glutKeyboardFunc(CameraView);
glutDisplayFunc(display);
glClearColor(1,1,1,1);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,
GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE,
light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);