Anda di halaman 1dari 11

MODEL 3D ‘Kipas Angin’ DENGAN

APLIKASI OpenGL

Disusun :

Febyola Noeraini (201810370311038)

Teknik Informatika
Fakultas Teknik
UNIVERSITAS MUHAMMADIYAH MALANG 2019
KATA PENGANTAR

Puji dan syukur saya panjatkan kehadirat Allah Yang Maha Kuasa, karena dengan
kehendak-Nya saya dapat menyelesaikan laporan tugas besar Grafika Komputer ini
dengan judul “Membuat Model 3D ‘Kipas Angin’ Dengan Aplikasi OpenGL”
sebagai salah satu syarat untuk memenuhi mata kuliah Grafika Komputer di
Universitas Muhammadiyah Malang.
Saya menyadari bahwa dalam penulisan laporan ini masih banyak terdapat
kekurangan yang harus disempurnakan, sehingga kritik dan saran sangat dibutuhkan
oleh penulis demi perbaikan di masa yang akan datang.

Malang, 28 November 2019

Febyola Noeraini
BAB I PENDAHULUAN

1.1LatarBelakang
Grafika computer adaah bagian dari ilmu komputer yang berkaitan dengan
pembuatan dan manipulasi gambar (visual) secara digital. Bentuk sederhana dari
grafika komputer adalah grafika komputer 2D yang kemudian berkembang
menjadi grafika komputer 3D. Pemrosesancitra (image processing), dan
pengenalan pola (pattern recognition). Dan di era globalisasi saat ini, grafika
komputer merupakan bagiani lmu teknologi yang sangat berkembang.
Seiring berkembangnya grafika komputer, banyak teknologi baru untuk
membuat objek 3D, diantaranya adalah OpenGL. OpenGL adalah suatu graphic
library yang sebagian bersifat open source, dipakai pada banyak platform
(windows, linux). OpenGL bukanlah bahasa pemrograman tetapi merupakan suatu
Application Programming Interface (API).
Berdasarkan penjelasan di atas, maka saya bermaksud untuk membuat ‘Kipas
Angin’ dengan model 3D untuk menerapkan computer grafika dengan teknologi
OpenGL, sehingga dapat menambah pemahaman saya tentang computer grafika dan
OpenGL. Pembuatan ‘Model 3D KIPAS ANGIN’ merupakan salah satu cara untuk
mempelajari tentang Grafik 3D menggunakan OpenGL dengan Bahasa java

1.2 RumusanMasalah
Berdasarkan pemaparan pada latar belakang, maka dapat disimpul kan beberapa
masalah, yaitu :
1. Bagaimana memahami dan menerapkan konsep computer grafika dalam
aplikasi 3D.
2. Bagaimana memahami dan menerapkan fungsi-fungsi OpenGL dalam aplikasi
3D.
1.3 Maksud dan Tujuan
Untuk mengimplementasikan konsep computer grafika dan fungsi OpenGL, maka
saya bermaksud untuk membuat model 3D ‘Kipas Angin’.
Tujuan dari aplikasi ini adalah untuk memahami Rumusan masalah yang ada.

BAB II

LANDASAN TEORI

2.1 OpenGL
OpenGL (Open Graphics Library) adalah spesifikasi standar yang
mendefinisikan sebuah lintas-bahasa, lintas platform API untuk mengembangkan
aplikasi yang menghasilkan grafis komputer 2D maupun3D. Antarmuka terdiri dari
lebih dari 250 panggilan fungsi yang berbeda yang dapat digunakan untuk
menggambar tiga dimensi yang adegan-adegan kompleks dari bentuk-bentuk primitif
sederhana.
Architecture dari OpenGL ada dua:
- OpenGL sebagai media
- OpenGL sebagaimesinaliran data.
Library dasar Dario penGL adalah GLUT. GLUT disini adalah fasilitas library yang
dapat dikembangkan.
Untuk system operasi Windows, library ini terdiri dari 3 file, yaitu :
- glut.h
- glut32.lib
- glut32.dll

Dalam dunia 3D terdiri dari 4 elemen, yaitu objek atau grup objek, material objek,
pencahayaan, dan camera,Objek 3D dari OpenGL terdiri dari beberapa proses sebelum
ditampilkan pada suatu window.Objek melewati modelview matrix -> clipping ->projection
matrix -> viewport matrix -> window sebuah matrik hanya merupakan operasi matematika
matrix sederhana. Matrix-matrix mentransformasikan objek menjadi tampilan sesuai yang
diinginkan.

2.2 primitive objek


Primitive object 2D adalah suatu model pembuatan gambar yang mengacu
kepada prespektif 2 titik. Umumnya object 2D ini merupakan suatu object yang
terdiri dari sekumpulan titik-titik yang menyambung (dihubungkan) menjadi satu
dengan perantara garis lurus berupa polyline, polygon maupun kurva.
Primitive object 2D adalah suatu model pembuatan gambar yang mengacu
kepada prespektif 2 titik. Umumnya object 2D ini merupakan suatu object yang
terdiri dari sekumpulan titik-titik yang menyambung (dihubungkan) menjadi satu
dengan perantara garis lurus berupa polyline, polygon maupun kurva.
Primitif objek merupakan salah satu subbab dari grafika komputer yang terdiri dari
titik, garis dan bangun dua dimensi. Contoh primitive grafika dasar antara lain : titik,
garis, kurva, fill area dan text. Objek kompleks dapat dibuat dengan kombinasi dari
primitive ini.
Fungsi dasar menggambar titik.

BAB III
IMPLEMENTASI
3.1 Tampilan

3.2 Source Code

#include <windows.h>
#include <GL/glut.h>

//buat 3 buah method


void cylinder(float rbase,float rtop,float height);
void blok(float tebal,int ratiol,int ratiop);
void bilah (float r_inner,float r_outer,float tebal,int batang);
//atur layar
int screen_width=500;//mengatur lebar screen
int screen_height=600;//mengatur tinggi screen
int button_up=0,button_down=0;
int Turn=0;
//atur variabel awal untuk pergerakan
double rotation_y=0,rotation_y_plus=-15,direction;// mengatur rotasi agar searah jarum jam
double Rhead=0,Rheadplus=0;
double rotate_All=0,All_plus=0;
double Angguk=0,Anggukplus=0;
double press=0,pressplus,pressplus1=180,pressplus2=0,pressplus3=0,pressplus4=0,pressplus5=0;

bool Toleh=true,Tolehpress=true;
bool RightTurn=true;
bool speed1=true,speed2=false,speed3=false,speed4=false,speed5=false;

//seting pencahayaan

//GLfloat ambient_light[]={0.3,0.3,0.45,1.0};
GLfloat ambient_light[]={0.0,0.0,0.45,1.0};//GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHT3
//GLfloat source_light[]={0.9,0.8,0.8,1.0};
GLfloat source_light[]={0.8,0.8,0.8,1.0};
//GLfloat light_pos[]={7.0,0.0,1.0,1.0};
GLfloat light_pos[]={5.0,0.0,6.0,1.0};

void init(void)
{

glShadeModel(GL_SMOOTH);
glViewport(0,0,screen_width,screen_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,1.0f,1000.0f);

glEnable (GL_DEPTH_TEST);
glPolygonMode (GL_FRONT_AND_BACK,GL_FILL);
glEnable (GL_LIGHTING); // pemanggilan parameter lihghting
glLightModelfv (GL_LIGHT_MODEL_AMBIENT,ambient_light);
glLightfv (GL_LIGHT0,GL_DIFFUSE,source_light);
glLightfv (GL_LIGHT0,GL_POSITION,light_pos);
glEnable (GL_LIGHT0);
glEnable (GL_COLOR_MATERIAL);
glColorMaterial (GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
}

//membuat method risize agar saat layar di maxzimize gambar mengikuti layar sehingga tidak merubah ukuran dari kipasnya
void resize(int width,int height)
{
screen_width=width;
screen_height=height;

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glViewport(0,0,screen_width,screen_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,1.0f,1000.0f);

glutPostRedisplay();
}

//buat method display(method penampilan gambar


void display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //membersihkan layar latar belakang
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0.0,-15,-70);
glPushMatrix();
glRotatef(270,1.0,0.0,0.0);
rotate_All+=All_plus;
glRotatef(rotate_All,0.0,0.0,1.0);
cylinder(2.5,1.5,16); // cilinder btang bawah2
cylinder(2.5,2.5,6); // cilinder batang bawah1
glPushMatrix();
glTranslatef(0.0,0.0,14);
glRotatef(90,0.0,1.0,0.0);
Angguk+=Anggukplus; // page up page down
glRotatef(Angguk,0.0,0.0,1.0);
Anggukplus=0;
glPushMatrix();
glRotatef(270,0.0,1.0,0.0);
glTranslatef(0.0,0.0,1);
cylinder(0.5,1,4);// cilinder batang atas
glPopMatrix();
glutSolidTorus(1.5,2,6,16);
glTranslatef(0.0,0.0,-2);
cylinder(1,1,4.3);//silinder penghubung batang atas dan batang bawah
glTranslatef(0.0,0.0,2);
glRotatef(270,0.0,1.0,0.0);
glPushMatrix();
glTranslatef(0.0,0.0,10);
glRotatef(90,1.0,0.0,0.0);
//turn left-right for fan head 10/9/2003

// definisikan kondisi pergerakan penolehan


if ( Toleh==true)
{
if(Turn >= 60) // max degrees right
RightTurn =false;
if(Turn <=-60) // max degrees left
RightTurn =true;
if(RightTurn == true )
{
Rheadplus++;
Turn++;
}
else
{
Rheadplus--;
Turn--;
}
}
Rhead=Rhead+Rheadplus;
glRotatef(Rhead,0.0,1.0,0.0);
Rheadplus=0;
// end turn left-right for fan head

glTranslatef(0.0,0.0,-3.0);
cylinder(4,4,6);// silinder belakang kipas
cylinder(1,0.5,15);//silinder tonjolan di depan kipas
glRotatef(270,1.0,0.0,0.0);
if(Tolehpress==true) // press down turn left-right head button
cylinder(0.3,0.5,6);
else // pull up turn left-right head button
cylinder(0.3,0.5,7);
glRotatef(90,1.0,0.0,0.0);
glPushMatrix();
glTranslatef(0.0,0.0,11);
glutWireTorus(5,7,10,64);
glutSolidTorus(0.5,12,10,64);
rotation_y+=rotation_y_plus;
if(rotation_y>359)rotation_y=0;
glRotatef(rotation_y,0.0,0.0,1.0);
bilah(3,10,3,5); // bilah(inner radius, outer radius, thickness, qty bilah)
glPopMatrix();
glPopMatrix();
glPopMatrix();
glRotatef(90,1.0,0.0,0.0);
glTranslatef(0.0,-1.0,-4);
blok(2,7,10);// blok bawah(papan kontrol)

// speed selection 11/9/2003


glTranslatef(-6,1,14);
glRotatef(270,1.0,0.0,0.0);
glTranslatef(2.0,0.0,0.0);
glPushMatrix();
glRotatef(pressplus5,1.0,0.0,0.0);
blok(0.5,2,2); // untuk blok tombol off
glPopMatrix();
glTranslatef(2.0,0.0,0.0);
glPushMatrix();
glRotatef(pressplus1,1.0,0.0,0.0);
blok(0.5,2,2);// untuk blok tombil f1
glPopMatrix();
glTranslatef(2.0,0.0,0.0);
glPushMatrix();
glRotatef(pressplus2,1.0,0.0,0.0);
blok(0.5,2,2);//untuk blok tombol f2
glPopMatrix();
glTranslatef(2.0,0.0,0.0);
glPushMatrix();
glRotatef(pressplus3,1.0,0.0,0.0);
blok(0.5,2,2);// untuk blok tombol f3
glPopMatrix();
glTranslatef(2.0,0.0,0.0);
glPushMatrix();
glRotatef(pressplus4,1.0,0.0,0.0);
blok(0.5,2,2);//untuk blok tombolf4
glPopMatrix();
pressplus5=0;
//end of speed selection
glPopMatrix();

glFlush();
glutSwapBuffers();
}

void cylinder(float rbase,float rtop,float height)


{
float i;
glPushMatrix();
glTranslatef(0.0,0.0,-rbase/4);
glutSolidCone(rbase,0,32,4);//membuat objek kerucut
for(i=0;i<=height;i+=rbase/8)
{
glTranslatef(0.0,0.0,rbase/8);
glutSolidTorus(rbase/4,rbase-((i*(rbase-rtop))/height),16,16); //donat
}
glTranslatef(0.0,0.0,rbase/4);
glutSolidCone(rtop,0,32,4);
glPopMatrix();
}

void bilah (float r_inner,float r_outer,float tebal,int batang)


{
float i;
glPushMatrix();
glTranslatef(0.0,0.0,-tebal/4);
cylinder(r_inner,r_inner,tebal);
glTranslatef(0.0,0.0,tebal/2);
glRotatef(90,0.0,1.0,0.0);
for(i=0;i<batang;i++)
{
glTranslatef(0.0,0.0,r_inner);
glRotatef(315,0.0,0.0,1.0);
blok(0.5,r_inner*4.5,(r_outer-r_inner+(r_inner/4))*2);
glRotatef(45,0.0,0.0,1.0);
glTranslatef(0.0,0.0,-r_inner);
glRotatef(360/batang,1.0,0.0,0.0);
}
glPopMatrix();
}

void blok(float tebal,int ratiol,int ratiop)


{
float i,j;
glPushMatrix();
for(i=0;i<ratiop;i++)
{
glTranslatef(-(ratiol+1)*tebal/2,0.0,0.0);
for(j=0;j<ratiol;j++)
{
glTranslatef(tebal,0.0,0.0);
glutSolidCube(tebal); // membuat kubus
}
glTranslatef(-(ratiol-1)*tebal/2,0.0,tebal);
}
glPopMatrix();
}

//efek keyboard
void keyboard_s(int key,int x,int y)
{
if (rotation_y_plus !=0)
direction=(rotation_y_plus/abs(rotation_y_plus));
else
direction=-1;
switch(key)
{
case GLUT_KEY_UP:// menaikan kipas
rotation_y_plus++;
break;
case GLUT_KEY_DOWN:// menurunkan kipas
rotation_y_plus--;
break;
case GLUT_KEY_END:// stop kipas
rotation_y_plus=0;
speed1=false;
pressplus1=0;
speed2=false;
pressplus2=0;
speed3=false;
pressplus3=0;
speed4=false;
pressplus4=0;
pressplus5=180;
Toleh=false;
break;
case GLUT_KEY_F1: //speed yang pertama
if(speed1 == false)
{
rotation_y_plus=15*direction;
speed1=true;
pressplus1=180;
speed2=false;
pressplus2=0;
speed3=false;
pressplus3=0;
speed4=false;
pressplus4=0;
if(Tolehpress == true)
Toleh=true;
}
else
{
speed1=false;
pressplus1=0;
rotation_y_plus=0;
Toleh=false;
}
break;
case GLUT_KEY_F2://speed ke-2
if(speed2 == false)
{
rotation_y_plus=30*direction;
speed1=false;
pressplus1=0;
speed2=true;
pressplus2=180;
speed3=false;
pressplus3=0;
speed4=false;
pressplus4=0;
if(Tolehpress == true)
Toleh=true;
}
else
{
speed2=false;
pressplus2=0;
rotation_y_plus=0;
Toleh=false;
}
break;
case GLUT_KEY_F3://speed ke-3
if(speed3 == false)
{
rotation_y_plus=45*direction;
speed1=false;
pressplus1=0;
speed2=false;
pressplus2=0;
speed3=true;
pressplus3=180;
speed4=false;
pressplus4=0;
if(Tolehpress == true)
Toleh=true;
}
else
{
speed3=false;
pressplus3=0;
rotation_y_plus=0;
Toleh=false;
}
break;
case GLUT_KEY_F4://speed ke-4
if(speed4 == false)
{
rotation_y_plus=60*direction;
speed1=false;
pressplus1=0;
speed2=false;
pressplus2=0;
speed3=false;
pressplus3=0;
speed4=true;
pressplus4=180;

if(Tolehpress == true)
Toleh=true;
}
else
{
speed4=false;
pressplus4=0;
rotation_y_plus=0;
Toleh=false;
}
break;
case GLUT_KEY_F5: //menghentikan pergerakan menoleh kiri dan kanan
if(Tolehpress == false)
{
if(speed1==true||speed2==true||speed3==true||speed4==true)
Toleh=true;
Tolehpress=true;
}
else
{
if(speed1==true||speed2==true||speed3==true||speed4==true)
Toleh=false;
Tolehpress=false;
}
break;
case GLUT_KEY_RIGHT://mengatur tolehan kipas ke kanan secara bertahap
Rheadplus++;
Turn++;
break;
case GLUT_KEY_LEFT://mengatur tolehan kipas ke kiri secara bertahap
Rheadplus--;
Turn--;
break;
case GLUT_KEY_PAGE_UP:// mengatur kipas ke posisi atas
Anggukplus--;
break;
case GLUT_KEY_PAGE_DOWN: // mengatur kipas ke posisi bawah
Anggukplus++;
break;
}
}

// interaksi melalui mouse


void Mouse_s(int button, int state, int x, int y)
{
if (state==0 && button==0)
All_plus--;
if (state==0 && button==2)
All_plus++;
}

int main(int argc,char **argv)


{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(screen_width,screen_height);
glutInitWindowPosition(0,0);
glutCreateWindow("TUBES GRAFKOM");
glutDisplayFunc(display);
glutIdleFunc(display);
glutReshapeFunc(resize);
glutSpecialFunc(keyboard_s);
glutMouseFunc(Mouse_s);
init();
glutMainLoop();
return(0);
}
BAB IV
PENUTUP
4.1 Kesimpulan
Setelah melakukan perancangan Obejk 3D yaitu, model 3D Kipas Angin, saya
mengambil kesimpulan sebagai berikut :
1. Penulis membuat Kipas Angin 3D dengan OpenGL menggunakan bahasa
pemrograman C++
2. Objek berawal dari sebuah titik yang dikembang kanmenjadi garis, bangun ruang
dan bahkan dapat dikembangkan lagi dengan cara menggabungkan semuanya.

Anda mungkin juga menyukai