Laporan Modul Iv Grafika
Laporan Modul Iv Grafika
OLEH:
Putri Rizky Rahmania
130533608286
S1 PTI 2013 OFF A
tombol
yang
ditekan
}
void mySpecialKeyboard(int key, int x, int y){ switch(key){
???
case GLUT_KEY_
}
}
: ; break;
Agar fungsi keyboard ini dapat dideteksi terus maka fungsi untuk
animasi (update) harus telah disertakan.
Untuk fungsi callback yang memanggil tombol keyboard normal/biasa adalah
glutKeyboardFunc(myKeyboard);
//hanya
memanggil
fungsi
myKeyboard
//hanya
mySpecialKeyboard
memanggil
fungsi
INTERAKSI MOUSE
Paramater func adalah fungsi yang akan ditangani dengan event klik mouse.
GLUTAPI void APIENTRY glutMotionFunc(void *func(int x, int y));
Fungsi di atas adalah fungsi pelengkap dari fungsi interaksi mouse untuk
mendeteksi gerakan mouse.
2. Inisialisasi dalam penggunaan MouseFunction
void mouse(int button, int state, int x,int y){
if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) drawDot(x,480y);
if(button==GLUT_RIGHT_BUTTON
&&
state==GLUT_DOWN)
&&
state==GLUT_DOWN)
drawDot2(x,480-y);
if(button==GLUT_MIDDLE_BUTTON
drawDot3(x,480-y);
}
void motion(int x,int y){
}
C. LATIHAN PRAKTIKUM
INTERAKSI KEYBOARD
Berikut adalah script dasar untuk kegiatan praktikum interaksi keyboard
dan
glutTimerFunc(50,timer,0);
glutDisplayFunc(display);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
1. Buatlah project baru pada Visual Studio dengan nama prak4-keyboard1. Berikut
adalah fungsi-fungsi yang harus ditambahkan. Sediakan fungsi drawQuad(); untuk
menggambar sebuah kotak. Fungsi myKeyboard adalah callback function yang
akan dipanggil oleh glutKeyboardFunc(myKeyboard);
tersebut berada di dalam fungsi main.
#include <stdlib.h>
#include <glut.h>
int x , y;
void drawQuad(){
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0,100);
glVertex2f(100,100);
glVertex2f(100,0);
glEnd();
glFlush();
}
void renderScene(){
glClear(GL_COLOR_BUFFER_BIT);
drawQuad();
}
void myKeyboard(unsigned char key, int x, int y){
if(key == 'a') glTranslatef(-4,0,0);
else if(key == 'd') glTranslatef(4,0,0);
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50,update,0);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,1);
glPushMatrix();
glTranslatef(x,0,0);
drawQuad();
dan fungsi
glPopMatrix();
glFlush();
}
void main (int argc, char **argv){
glutCreateWindow("Putri Rizky Rahmania");
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
gluOrtho2D(-320.,320.,-320.,320.);
glutDisplayFunc(renderScene);
glutTimerFunc(50,update,0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
}
Output Program :
Penjelasan :
Terdapat fungsi
void drawQuad()
void myKeyboard
digunakan untuk
pendeklarasian tombol pada keyboard yang dapat mengubah posisi objek segi
empat tersebut. Terdapat 2 macam tombol yang digunakan untuk mengubah
posisi objek, yaitu a untuk mengubah posisi segi empat geser ke kiri dengan
koordinat
glTranslatef(-4,0,0);.
Output :
Penjelasan :
Pada praktikum di atas merupakan penyempurnaan dari praktikum sebelumnya
dengan keyboard l arah kiri, r arah kanan, lalu dengan menambahkan arah
perpindahan atau translasi ke atas dan kebawah menggunakan tombol keyboard u
dan d.
3. Buatlah project baru pada Visual Studio dengan nama prak4-keyboard2. Berikut
adalah cara untuk mendeteksi tombol-tombol keyboard yang memiliki fungsi
spesial.
#include <stdlib.h>
#include <glut.h>
int a,d,w,x;
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glVertex2f (0, 0);
glVertex2f (0,200 );
glVertex2f (200, 200);
glVertex2f (200, 0);
glEnd();
glFlush();
}
void myKeyboard(unsigned char key, int x, int y){ /*Fungsi myKeyboard untuk memberikan
fungsi pada keyboard untuk menjalankan objek*/
if(key=='a') glTranslatef(-4,0,0); /*Fungsi untuk Translasi objek menggunakan kondisi if
(kiri)*/
else if (key=='d') glTranslatef(4,0,0);/*kanan*/
else if (key=='w') glTranslatef(0,4,0);/*atas*/
else if (key=='x') glTranslatef(0,-4,0);/*bawah*/
}
void mySpecialKeyboard(int key, int x, int y){/*Deklarasi method myspecialKeyboard beserta
variable -variabel*/
switch(key){ /*Menggunakan operator kondisi switch case . Case dideklarasikan
dengan tombol kiri, jika tombol arah kiri pada keyboard di tekan maka akan berotasi
berlawanan dengan arah jarum jam*/
case GLUT_KEY_LEFT:
glRotatef(4,0,0,1);
break;}}
void update (int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main(int argc, char **argv){
glutCreateWindow("PUTRI RR");
glutInitWindowPosition(100,100);
glutInitWindowSize(480,480);
gluOrtho2D(-320.,320.,-320.,320.);
glutDisplayFunc(renderScene);
glutTimerFunc(50,update,0);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutMainLoop();
}
Output :
Penjelasan :
Program di atas menjalankan fungsi keyboard a,d,w,x yaitu objek akan bergeser
dan untuk
case GLUT_KEY_LEFT:
glutInitWindowPosition(100,100);
glutInitWindowSize(240,240);
glutCreateWindow("Putri Rizky Rahmania");
gluOrtho2D(-320.,320.,-320.,320.);
glutDisplayFunc(display);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(50,update,0);
glutMainLoop();
Output :
Penjelasan :
Program di atas sama dengan program sebelumnya, disini menambahkan fungsi
keyboard void mySpecialKeyboard(int key, int x, int y){
Dimana terdapat 4 case yaitu salah satunya
case GLUT_KEY_LEFT:
glRotatef(4,0,0,1);
Fungsi di atas bidang akan berotasi/berputar berlawanan dengan arah jarum jam
yang sama dengan
case GLUT_KEY_UP:
case GLUT_KEY_DOWN:
selanjutnya
glRotatef(-4,0,0,1);
break;
case GLUT_KEY_UP:
glRotatef(4,0,0,1);
break;
case GLUT_KEY_DOWN:
glRotatef(-4,0,0,1);
break;
break;
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50,update,0);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(x,0,0);
drawQuad();
glPopMatrix();
glFlush();
}
void main (int argc, char **argv){
Output :
glutInitWindowPosition(100,100);
glutInitWindowSize(240,240);
glutCreateWindow("Putri Rizky Rahmania");
gluOrtho2D(-320.,320.,-320.,320.);
glutDisplayFunc(display);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(50,update,0);
glutMainLoop();
Penjelasan :
Pada program di atas hanya menambhakan fungsi mengganti warna bidang yang
sesuai dengan keyboard yang dideklarasikan yaitu angka 1, 2, 3, 4,dan 5. Salah
satunya yaitu
INTERAKSI MOUSE
Berikut adalah script dasar untuk kegiatan praktikum interaksi mouse.
int w = 480, h = 480; //variabel global
glutInitWindowSize(w,h);
gluOrtho2D(-w/2,w/2,-h/2,h/2);
y = (h/2)-ymouse;
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main(int argc,char **argv){
glutInit(&argc,argv);
glutInitWindowPosition(240,200);
glutInitWindowSize(w,h);
glutCreateWindow("PUTRI RIZKY R");
gluOrtho2D(-w/2, w/2, -h/2, h/2);
glutTimerFunc(50, update, 0);
glutDisplayFunc(myDisplay);
glutMouseFunc(mouse);
glutMainLoop();
}
Output :
Penjelasan :
Program di atas menunjukkan fungsi mouse yang dapat mengubah posisi
kotak sesuai perpindahan mouse.
variable global
Mendeklarasikan
float
x=0,y=0,z=0;
glPushMatrix();.Untuk
glPopMatrix();.
Mendeklarasikan
glTranslatef(x, y, z);.
glutMouseFunc(mouse);
Output :
Penejelasan :
Pada program di atas untuk menjalankan kotak agar saat klik kanan maka kotak
ukurannya akan memperbesar kotak, dan klik kiri memperkecil ukuran.
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
x = xmouse-(w/2);
y = (h/2)-ymouse;
glScalef(0.5, 0.5, 0.5);}
3. Ubahlah program sehingga tombol kiri ditekan skala membesar (2) dan ketika
tombol kanan dilepaskan (UP) skala mengecil (0.5))
#include <stdlib.h>
#include <glut.h>
int w = 240, h = 240; //variabel global
void drawQuad(void){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glVertex2f (0, 0);
glVertex2f (0,100 );
glVertex2f (100, 100);
glVertex2f (100, 0);
glEnd();
glFlush();
}
float x=0,y=0,z=0;
void myDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(x, y, z);
drawQuad();
glPopMatrix();
glFlush();
}
void mouse(int button, int state, int xmouse, int ymouse){
if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
x = xmouse-(w/2);
y = (h/2)-ymouse;
glScalef(0.5, 0.5, 0.5);
}
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
x = xmouse-(w/2);
y = (h/2)-ymouse;
glScalef(2,2,2);
}
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main(int argc, char **argv){
glutInit(&argc,argv);
glutInitWindowPosition(240,240);
glutInitWindowSize(w,h);
glutCreateWindow("Putri RR");
gluOrtho2D(-w/2, w/2, -h/2, h/2);
glutTimerFunc(50, update, 0);
glutDisplayFunc(myDisplay);
glutMouseFunc(mouse);
glutMainLoop();
}
Output :
Penjelasan :
Pada program ini sama dengan sebelumnya hanya saja klik kiri digunakan untuk
memperbesar objek dengan skala 2 dan tombol kanan mouse digunakan untuk
memperkecil objek dengan skala 0.5.
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(x, y, z);
drawQuad();
glPopMatrix();
glFlush();
}
void mouse(int button, int state, int xmouse, int ymouse){
if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
x = xmouse-(w/2);
y = (h/2)-ymouse;
glScalef(0.5, 0.5, 0.5);
}
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
x = xmouse-(w/2);
y = (h/2)-ymouse;
glScalef(2,2,2);
}
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main(int argc, char **argv){
glutInit(&argc,argv);
glutInitWindowPosition(240,240);
glutInitWindowSize(w,h);
glutCreateWindow("Putri RR");
gluOrtho2D(-100,100,-100,100);
glutTimerFunc(50, update, 0);
glutDisplayFunc(myDisplay);
glutMouseFunc(mouse);
glutMainLoop();
}
Output :
Penjelasan :
Mengubah parameter pada fungsi gludOrtho2D dari yang sebelumnya
dideklarasikan dengan variable menjadi (-100,100,-100,100). Sehingga output
yang ditampilkan pada saat awal eksekusi terlihat agak besar.
Output :
Penjelasan :
Pada program ini perpindahan objek dengan menggunakan motion,jadi dengan
klik tahan dan menggerakkan mouse maka objek akan berpindah mengikutinya.
Didalam fungsi motion terdapat rumus yang dapat memindahkan posisi objek,
yaitu x = xmouse-(w/2); dan y = (h/2)-ymouse;.
TUGAS ASISTENSI
1. Buatlah sebuah kompas yang bisa perputar secara clockwise dan unclockwise yang
pusatnya berada pada pusat koordinat. Dengan kontrol dari tombol k dan l.
#include<stdlib.h>
#include<glut.h>
float x =0 ;
int k;
int l;
void Triangle (){
glBegin(GL_TRIANGLES);
glColor3f(1,0,0);
glVertex2f(-50,0.0);
glVertex2f(0.0,100.0);
glVertex2f(50.0,0.0);
glColor3f(1,1,1);
glVertex2f(-50,0.0);
glVertex2f(0.0,-100.0);
glVertex2f(50.0,0.0);
glEnd();
}
void display (){
glClear(GL_COLOR_BUFFER_BIT);
Triangle();
glFlush();
}
void myKeyboard(unsigned char key, int x, int y){
if(key=='l')
glRotatef(-10,0,0,1);
else if(key=='k')
glRotatef(10,0,0,1);
}
void timer(int value){
glutPostRedisplay();
glutTimerFunc(50, timer,0);
}
void update (int value){
glutPostRedisplay();
glutTimerFunc(50, update,0);
}
void main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DEPTH|GLUT_SINGLE|GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(240,240);
glutCreateWindow("PUTRI RR");
gluOrtho2D(-320.,320.,-320.,320.);
glutTimerFunc(50,timer,0);
glutDisplayFunc(display);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
}
Output :
Penjelasan :
Program di atas menampilkan 2 buah segitiga yang letak koordinatnya di atur dengan:
glVertex2f(-50,0.0);
glVertex2f(0.0,100.0);
glVertex2f(50.0,0.0);
Memberikan fungsi untu melakukan rotasi dengan menekan tombol key board yang
dideklarasikan yaitu :
void myKeyboard(unsigned char key, int x, int y){
if(key=='l')
glRotatef(-10,0,0,1);
else if(key=='k')
glRotatef(10,0,0,1);}
Menekan huruf k maka objek akan berputar berlawanan arah jarum jam sedangkan
l objek berputar searah jarum jam
2. Buatlah 2 benda (kotak dan segitiga) yang dapat dikendalikan secara individual,
dengan memanfaatkan tombol untuk tangan kanan dan tombol untuk tangan kiri. (a,
s, d, w untuk kotak dan tombol panah atas, bawah, kiri, kanan untuk segitiga)
#include <stdlib.h>
#include <glut.h>
int
int
int
int
int
a=0;
b=0;
c=0;
d=0;
w, x;
void Quads() {
glBegin(GL_QUADS);/*Membuat kotak*/
glColor3f(1,1,0);
glVertex2f(100,100);
glColor3f(1,1,1);
glVertex2f(150,100);
glColor3f(1,1,1);
glVertex2f(150,150);
glColor3f(1,1,1);
glVertex2f(100,150);
glEnd();
}
void Triangle() {
glBegin(GL_TRIANGLES); /*Segitiga*/
glVertex2i(-100,-50);
glVertex2i(-50, -50);
glColor3f(0.1,1,0.5);
glVertex2i(-75, -100);
glEnd();
}
void renderScene(){
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(b,c,0); /*Deklarasi translasi untuk objek persegi*/
Quads();
glPopMatrix(); /*Untuk meload yaitu kembali ke koordinat sebelum di push.*/
glPushMatrix(); /*Menyimpan nilai matrik*/
glTranslatef(a,d,0); /*Deklarasi translasi untuk objek segitiga*/
Triangle();
glPopMatrix();
glFlush();
}
void myKeyboard (unsigned char key, int x, int y) {
if(key == 'a') { /*persegi bergerak ke kiri*/
b+=-10;
c+=0;
}
Output :
Penjelasan :
Program di atas menampilkan dua buah bangun yaitu persegi dan segitiga. Kedua
bangun tersebut diberi perlakuan yaitu dengan berpindah yang dipanggil dengan
fungsi : glTranslatef(b,c,0); /*Deklarasi translasi untuk objek persegi*/
Quads();
glTranslatef(a,d,0); /*Deklarasi translasi untuk objek segitiga*/
Triangle();
glVertex2i(a, -b);
glVertex2i(-a, -b);
glVertex2i(-a, b);
glEnd();
}
void motion(int xmouse, int ymouse){ /*untuk menunjukkan posisi pointer mouse berada*/
x=xmouse-(w/2);
y=(h/2)-ymouse;
a=x/k;
b=y/l;
printf("posisi pointer mouse (%d, %d)\n", x, y); /*Untuk mengubah skala secara
interaktif pada fungsi motion perintah untuk menampilkan hasil */
}
void mouse(int button, int state, int xmouse, int ymouse){
if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
x = xmouse-(w/2);
y = (h/2)-ymouse;
k=x;
l=y;
printf("koordinat %d, %d\n", xmouse-(xmouse/2), ymouse-(ymouse/2));
/*Menunjukkan hasil dari klik kanan dan pergerakan mouse*/
}
}
void mydisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.5, 0, 1);
glPushMatrix();
glScalef(a, b, 1);
drawQuad(6,6);
glPopMatrix();
glFlush();
}
void timerku(int value){
glutPostRedisplay();
glutTimerFunc(10, timerku, 0);
}
void main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(480, 480);
glutCreateWindow("PUTRI RR");
gluOrtho2D(-60,60,-60,60);
glutDisplayFunc(mydisplay);
glutTimerFunc(10, timerku, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
Output :
Penjelasan :
Pada program di atas jika objek persegi di klik kanan dan ditahan serta digeser maka
ukuran objek akan mengikuti seberapa besar posisi yang digeser dengan mouse. Jika
digeser keluar maka objek semakin besar dan jika di geser ke dalam maka objek akan
semakin kecil. Untuk mengubah skala secara interaktif pada fungsi motion perintah
untuk menampilkan hasil diberi
(%d, %d)\n
berada. Pada fungsi mouse juga terdapat perintah untuk menampilkan hasil diberi
koordinat %d, %d\n", xmouse-(xmouse/2), ymouse-(ymouse/2)
mouse berada.
4. Buatlah program untuk deteksi DOUBLE CLICK, ketika DOUBLE CLICK object
yang dipilih skalanya menjadi 1.5, sedangkan untuk DOUBLE CLICK berikutnya
Ukuran object tersebut kembali seperti semula.
#include<stdlib.h>
#include<stdio.h>
#include<glut.h>
int w=240, h=240, p=-1;
float x=0, y=0, x1=1, y1= 1;
bool kondisi=true; /*Merupakan deklarasi operasi boolean untuk kondisi bernilai benar.*/
void drawQuad(int x, int y){
glBegin(GL_QUADS);
glColor3f(1.5,0.25,0);
glVertex2i(x,y);
glVertex2i(-x,y);
glVertex2i(-x,-y);
glVertex2i(x,-y);
glEnd();
}
void doubleClick(){ /*Deklarasi method doubleclick*/
if(kondisi){
x1 = 1.5;
y1 = 1.5;
kondisi = false;
}else{
x1 = 1;
y1 = 1;
kondisi = true;
}
}
void mouse(int button, int state, int xmouse, int ymouse){
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
if(p == -1){
p += 1;
}
void timer(int value){
if(p != -1)
{
p += 100;
}
if(p > 500){
p = -1;
}
glutPostRedisplay();
glutTimerFunc(50, timer, 0);
}
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glScalef(x1, y1, 1);
drawQuad(30,30);
glPopMatrix();
glFlush();
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(w,h);
glutCreateWindow("PUTRI RR");
glutDisplayFunc(renderScene);
glutTimerFunc(50,timer,0);
glutMouseFunc(mouse);
gluOrtho2D(-w/2, w/2, -h/2, h/2);
glutMainLoop();
}
Output :
Penjelasan :
Pada program di atas jika objek diklik double maka objek akan berubah menjadi besar
dengan ukuran scala 1.5 dan jika di klik double kembali maka objek akan kembali
pada ukuran standart yaitu dengan scala 1
Pada fungsi Double Click terdapat 2 kondisi, kondisi pertama
kondisi = false;
x1 = 1.5; y1 = 1.5;
x1 = 1; y1 = 1; kondisi = true;
pergerakan
mouse.
Dalam
penggunaan
glutKeyboardFunc
dimungkinkan untuk mendeteksi input dari keyboard. Fungsi ini diletakkan pada
fungsi main dari program, dan parameternya adalah callback function
E. DAFTAR RUJUKAN
Tim Dosen. 2015. Modul 4 Interaksi dengan Keyboard dan Mouse. Malang:
Universitas Negeri Malang.