Modul OpenGL PDF
Modul OpenGL PDF
BAB I
PENDAHULUAN
Grafika computer adalah gambar atau grafik yang dihasilkan oleh komputer. Teknik-
teknik yang dipelajari dalam grafika computer adalah teknik-teknik bagaimana membuat
atau menciptakan gambar dengan menggunakan komputer. Ada perbedaan antara photo
dan gambar, dimana pada photo semua detail objek terlihat sedangkan gambar tidak dapat
memperlihatkan semua detail yang ada tetapi hanya detail yang dianggap penting dalam
menunjukkan pola suatu gambar.
Adapun beberapa program sederhana sampai program yang sangat kompleks guna
membuat gambar computer seperti Paint, Microsoft Photo Editor, Adobe Photoshop, Maya,
Autocad, 3D Studio max, dan lain-lain.
Untuk membuat program-program diatas dapat digunakan berbagai macam bahasa
pemrograman dengan library grafis yang sesuai. Dalam modul ini digunakan bahasa
pemrograman C++. Bila menggunakan system operasi windows maka menggunakan bahasa
pemrograman C++ dan bila menggunakan system operasi Linux maka menggunakan gcc
atau g++. Sedangkan library grafik yang digunakan dalam modul ini adalah OpenGL.
1. Polylines
Adalah deretan garis lurus yang berhubungan. Polyline ini merupakan dasar dari
pembuatan grafik.
2. Text
Menunjukkan pola-pola huruf pada computer yang menyebabkan layout dari hasil
editing dapat menghasilkan banyak variasi tulisan.
3. Filled Region
Adalah bagaimana member warna atau pattern pada sebuah luasan.
4. Raster Image
Adalah penyajian gambar menggunakan matriks dari setiap sel gambar, dimana sebuah
gambar didefinisikan sebagai array dari besar-besaran numeric. Model data ini banyak
digunakan untuk keperluan pengolahan citra.
BAB II
PRIMITIVE DRAWING
2.1 Materi
gluOrtho2D(0.,640.,-240.,500.);
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Pada program utama diatas dapat dijelaskan fungsi dari perintah – perintah yang
ada dengan penjelasan sebagai berikut :
Membuat windows dengan ukuran (640,480) dengan titik kiri atas jendela diletakkan
pada posisi (100,100) di layar komputer. Penentuan ukuran layar tidak harus sama
dengan di atas tetapi bisa disesuaikan dengan ukuran resolusi monitor anda masing–
masing.
Mendefinisikan warna dari windows yang dibuat dengan warna (1,1,1) yaitu warna
putih. ( Penkodean warna dapat anda lihat pada halaman tentang warna)
Direktori
tempat
mengcopy
file glut.h
Direktori
tempat
mengcopy
file
glut32.lib
Direktori
tempat
mengcopy
file
glut32.dll
3. Setelah ketiga file di atas dicopykan maka silahkan membuka program Visual C++
GAMBAR 2.6 Pilih Tab File dan Pilih C++ Source File
Prosedur untuk membuat titik, namun pada pembuatan objek primitive prosedur ini
tidak perlu diikutsertakan.
Untuk menggambar titik diposisi (x,y) dimanax dan y didefinisikan sebagai bilangan
bulat (integer).
Untuk menggambar titik diposisi (x,y) dimanax dan y didefinisikan sebagai bilangan
pecahan (float/double).
void userdraw()
{
static int tick=0;
glColor3f(0.,0.,0.);
glPointSize(3);
glBegin(GL_POINTS);
glVertex2f(125,150);
glEnd();
glColor3f(0.,1.,0.);
glPointSize(10);
glBegin(GL_POINTS);
glVertex2f(160,150);
glEnd();
glColor3f(0.,0.,1.);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2f(195,150);
glEnd();
glColor3f(1.,0.,1.);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2f(245,150);
glEnd();
}
Hasilnya :
Untuk membuat garis diperlukan library GL_LINES dengan menyatukan titik awal dan titik
akhir dari garis. Untuk mengubah ukuran garis dapat menggunakan perintah
glLineWidth(TEBALGARIS); Bila ditulis glLineWidth(4) maka tebalnya garis adalah 4X4
PIXEL. Bila tidak digunakan maka ukuran titiknya adalah 1 PIXEL.
Menggambar efek hujan, sama seperti menggambar bintang dengan titik acak,
tetapi yang obyeknya berupa garis diagonal. Program untuk menggambar efek hujan
ini adalah:
void userdraw(void)
{
float xp,yp;
for(int i=0;i<300;i++)
{
xp=640*(float)rand()/RAND_MAX;
yp=480*(float)rand()/RAND_MAX;
glColor3f(1,1,1);
glBegin(GL_LINES);
glVertex2f(xp,yp);
glVertex2f(xp+8,yp-8);
glEnd();
}
}
if(tick==0){
for(i=0;i<300;i++){
hujan[i].x=rand()%140-0;//pengaruhi daerah yg hujan
hujan[i].y=rand()%100-0;
}
}
if(toc==0){
for(i=0;i<700;i++){
hujan[i].x-=1;
hujan[i].y-=1;
if (((hujan[i].x<640)||(hujan[i].y<300)))
{
hujan[i].x=rand()%335-0;//pengaruhi t4 keluar air hujan
hujan[i].y=rand()%276-0;
}
}
}
glColor3f(1,1,1);
for(i=0;i<200;i++){
gambarGaris(hujan[i].x,hujan[i].y,hujan[i].x-3,hujan[i].y-3);
}
tick++;
toc=tick%100;
Derasnya hujan dapat diatur dengan memperbanyak jumlah garis yang digambar
atau membuat garisnya lebih panjang. Sedangkan arah gerakan air hujan dapat
diatur dengan operasi penjumlahan atau pengurangan dari masing-masing nilai x
dan nilai y pada setiap garis. Permainan sudut akan menjadi lebih baik karena bisa
mengubah arah hujan menjadi lebih realistik dengan memberikan afek angin.
void userdraw()
{
static int tick=0;
glColor3f(0.,0.,0.);
glLineWidth(1);
glBegin(GL_LINES);
glVertex2f(125,150);
glVertex2f(125,450);
glEnd();
glColor3f(0.,1.,0.);
glLineWidth(3);
glBegin(GL_LINES);
glVertex2f(160,150);
glVertex2f(160,450);
glEnd();
glColor3f(0.,0.,1.);
glLineWidth(8);
glBegin(GL_LINES);
glVertex2f(195,150);
glVertex2f(195,450);
glEnd();
glColor3f(1.,0.,1.);
glLineWidth(100);
glBegin(GL_LINES);
glVertex2f(245,150);
glVertex2f(245,450);
glEnd();
}
Polyline adalah sekumpulan garis yang terhubung satu dengan yang lainnya hingga
membentuk sebuah obyek gambar.
Contoh input :
Output Program :
Polygon adalah sekumpulan garis yang terhubung satu dengan yang lainnya dan
berbentuk kurva tertutup hingga membentuk sebuah obyek gambar.
Contoh input :
Output program :
Pemberian warna :
BAB III
3.1 Materi
a. Definisi Obyek Grafik 2-D
b. Polyline
c. Mewarnai Area ( Fill Polygon )
d. Membangun obyek Grafik 2-D
e. Animasi 2-D
Adalah sekumpulan titik-titik 2-D yang dihubungkan dengan garis lurus baik berupa
polyline, polygon, atau kurva, yang secara komputasi dinyatakan sebagai array 1-D atau
linked-list.
3.2.4 Polyline
3.2.5 Polygon
void userdraw()
{
Catatan : Masih banyak variasi fungsi yang lain yang dapat dibangun dengan
menggunakan koordinat polar ini.
Berikut kode program untuk membangun obyek grafik 2-D dengan menggunakan
koordinat polar.
BAB IV
TRANSFORMASI 2 DIMENSI
4.1 Materi
1. Struktur titik dan vektor
2. Perubahan struktur titik ke vektor
3. Perubahan struktur vektor ke titik
4. Tranformasi 2-D
5. Perkalian Matriks
6. Komposisi Transformasi
Fungsi ini digunakan untuk memindahkan tipe data titik menjadi tipe data
vektor. Hal ini sangat berguna untuk operasional matrik yang digunakan dalam
melakukan transformasi dan pengolahan matrik pada grafika komputer.
Fungsi ini digunakan untuk memindahkan tipe data vektor menjadi tipe data
titik. Hal ini sangat berguna untuk penyajian grafis setelah proses pengolahan matrik
yang dikenakan pada obyek 2-D.
Matrik transformasi 2-D adalah matrik yang membuat sebuah obyek mengalami
perubahan baik berupa perubahan posisi, maupun perubahan ukuran. Matrik 2-D
dinyatakan dalam ukuran 3x3, dimana kolom ke-3 digunakan untuk menyediakan
tempat untuk proses translasi.
4.5.1 Translasi
Matrik Identitas
Adalah matrik yang nilai diagonal utamanya adalah 1 dan yang lain bernilai nol.
4.5.2 Scalling
Scaling m adalah perpindahan obyek dari titik P ke titik P’, dimana jarak titik P’ adalah m kali
titik p.
4.5.3 Rotasi
Adalah perpindahan obyek dari titik P ke P’ yang berupa pemindahan berputar
sebesar sudut θ.
Catatan :
1. Perkalian matrik dengan matrik menghasilkan matrik
2. Perkalian matrik denga vektor menghasilkan vektor
3. Perkalian matrik ini digunakan untuk operasional transformasi dari obyek 2D dan untuk
komposisi (menggabungkan) transformasi.
Perumusan perkalian matrik dengan matrik, dimana untuk nilai i dan j bernilai 0 s/d 2
Perumusan perkalian matrik dengan vektor, dimana untuk nilai i dan j bernilai 0 s/d 2
BAB V
GRAFIK 3 DIMENSI
5.1 Materi
1. Sistem Koordinat 3 Dimensi
2. Definisi obyek 3 Dimensi
3. Cara menggambar Obyek 3 Dimensi
4. Konversi vektor 3D menjadi titik 2D
5. Konversi titik 2D menjadi vektor 3D
6. Visible dan Invisible
Adalah sekumpulan titik 3-D (x,y,z) yang membentuk luasan – luasan (face) yang
digabungkan menjadi satu kesatuan. Face adalah gabungan titik – titik yang
membentuk luasan tertentu atau sering dinamakan dengan sisi.
Ditulis pada userdraw sebagai nilai dari obyek 3-D yang akan digambarkan.
1. Untuk mengambar obyek 3D, untuk setiap face perlu dilakukan pengubahan titik
3D menjadi vektor 3D.
2. Setelah proses pengolahan vektor, maka bentuk vektor 3D menjadi 2D.
3. Sumbu Z adalah sumbu yang searah dengan garis mata, sehingga perlu
transformasi untuk menampilkan sumbu ini. Untuk hal ini perlu dilakukan rotasi
sumbu.
4. Dalam konversi arah Z tidak diambil.
Vektor 3 D :
Deklarasi mat sebagai matrik tilting menyatakan bahwa obyek yang digambar mengikuti
pergerakan sumbu koordinat ( tilting ).
Setiap titik diubah menjadi vektor dengan memperhatikan matrik transformasi yang
dinyatakan dalam mat.
Implementasi Tilting
Tilting adalah matrik rotasi dari sumbu koordinat dan semua obyek yang
digambar didalamnya.
Dalam deklarasi ini, matrik tilting adalah rotasi terhadap sumbu y sebesar -0.5 rad dan
rotasi terhadap sumbu x sebesar 0.5 rad.
1. Visible dan Invisible menyatakan apakah suatu face terlihat (visible) atau tidak
terlihat (invisible).
2. Pada obyek 3D tidak semua face terlihat, karena terdapat face-face yang berada
di bagian belakang dan terhalang oleh face yang lain.
3. Untuk menyatakan face visible dan invisible digunakan vektor normal pada face
tersebut.
4. Suatu face visible bila arah z pada vektor normal positif, dan invisible bila arah z
pada vektor normalnya negatif.
MENGGAMBAR PRISMA
#include <glut.h>
#include <math.h>
struct point
{
float x,y,z;
};
struct face
{
int jumtitikons;
int indextitik[40];
};
struct o3d
{
int jumtitik;
point titik[100];
int jumsisi;
face sisi[100];
};
for(i=0;i<obj.jumsisi;i++)
{
glBegin(GL_LINE_LOOP);
glColor3f(1.0f,0.0f,0.0f);
for(j=0;j<obj.sisi[i].jumtitikons;j++)
{
glVertex3f(obj.titik[obj.sisi[i].indextitik[j]].x,
obj.titik[obj.sisi[i].indextitik[j]].y,
obj.titik[obj.sisi[i].indextitik[j]].z);
}
glEnd();
}
}
void Prisma()
{
o3d
prisma6={12,{{5,10,30},{15,20,30},{25,20,30},{35,10,30},{25,0,30},{15,0,30},{5,10,10},{15,20,10},{25,20,1
0},{35,10,10},{25,0,10},{15,0,10}},8,{{6,{0,1,2,3,4,5}},
{6,{6,7,8,9,10,11}},{4,{0,6,7,1}},{4,{1,7,8,2}},{4,{2,8,9,3}},{4,{3,9,10,4}},{4,{4,10,11,5}},{4,{5,11,6,0}
}}};
DrawLineLoop(prisma6);
}
void UserDraw()
{
glClearColor(1.0f,1.0f,1.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glRotatef(30.1f,1.0f,1.0f,1.0f);
Prisma();
glutSwapBuffers();
}
#include <glut.h>
#include <math.h>
struct point
{
float x,y,z;
};
struct face
{
int jumtitikons;
int indextitik[40];
};
struct o3d
{
int jumtitik;
point titik[100];
int jumsisi;
face sisi[100];
};
void UserDraw()
{
glClearColor(1.0f,1.0f,1.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT);
Limas4();
glutSwapBuffers();
}
#include <glut.h>
typedef struct {
float x,y;
} point2D_t;
typedef struct {
float r,g,b;
} color_t;
typedef struct
{
float r, g, b;
}color;
}
glEnd();
}
void userdraw()
{
static int tick=0;
point2D_t kotak1[4]={{100,100},{300,100},{300,200},{100,200}}; // input penggambaran objek
color AREA[2]={{0.5,0,1},{0.5,0.5,0.2}}; //Input 2 warna untuk pewarnaan gradasi
gradatePolygon(kotak1,4,AREA); //Pemanggilan objek yang akan ditampilkan
setColor(1,1,1); //Pemberian warna garis tepi
drawPolygon(kotak1,4); //Pemanggilan objek untuk garis tepi
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
userdraw();
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowPosition(100,100);//meletakkan pada posisi (100,100) di layar komputer
glutInitWindowSize(640,480);//membuat ukuran window (640,480)
glutCreateWindow("Tampilan Windows Open GL");//pemberian judul pada window
glClearColor(0.0,0.0,0.0,0.0);//pemberian warna pada window dengan format RGB
gluOrtho2D(-50.,840.,-140.,840.);
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
#include <math.h>
#include <glut.h>
typedef struct
{
float x, y;
}point2D_t;
typedef struct
{
float r, g, b;
}color;
typedef struct
{
float r, g, b;
}color_t;
}
glEnd();
}
for(int i=0;i<10;i++)
{
sudut=(float)i*teta/57.3;
if (r==2)r=10;else r=2;
p[i].x=p1.x+r*cos(sudut+a);
p[i].y=p1.y+r*sin(sudut+a);
}
}
void userdraw()
{
point2D_t batas[4] = {{36,20},{988,20},{988,583},{36,583}};
color wlangit[4]={{0.3,0.0,0.3},{0.3,0.0,0.3},{0.9,1,0.5},{0.9,0.8,0.5}};
gradatePolygon(batas,4,wlangit);
static float a=0;
color warna={1,1,0};
point2D_t c10[10],p10={530,121};
createStar(c10,a,p10);
point2D_t c1[10],p1={500,321};
createStar(c1,a,p1);
point2D_t c2[10],p2={433,247};
createStar(c2,a,p2);
point2D_t c3[10],p3={286,125};
createStar(c3,a,p3);
point2D_t c4[10],p4={553,150};
createStar(c4,a,p4);
point2D_t c5[10],p5={232,350};
createStar(c5,a,p5);
point2D_t c6[10],p6={643,123};
createStar(c6,a,p6);
point2D_t c7[10],p7={200,250};
createStar(c7,a,p7);
point2D_t c8[10],p8={433,247};
createStar(c8,a,p8);
point2D_t c9[10],p9={334,350};
createStar(c9,a,p9);
fillPolygon(c1,10,warna);
fillPolygon(c2,10,warna);
fillPolygon(c3,10,warna);
fillPolygon(c4,10,warna);
fillPolygon(c5,10,warna);
fillPolygon(c6,10,warna);
fillPolygon(c7,10,warna);
fillPolygon(c8,10,warna);
fillPolygon(c9,10,warna);
fillPolygon(c10,10,warna);
a+=0.005; // Mengatur efek bintang berputar
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
userdraw();
glutSwapBuffers();
}