INTERAKSI OBJEK 2D
(MOUSE FUNCTION)
A. KOMPETENSI DASAR
B. ALOKASI WAKTU
4 JS (4x50 menit)
C. PETUNJUK
Awali setiap aktivitas dengan doa, semoga berkah dan mendapat kemudahan.
Pahami Tujuan, dasar teori, dan latihan-latihan praktikum dengan baik dan benar.
Kerjakan tugas-tugas dengan baik, sabar, dan jujur.
Tanyakan kepada asisten/dosen apabila ada hal-hal yang kurang jelas.
D. DASAR TEORI
1. Fungsi dasar pembuatan interaksi dengan menggunakan MouseFunction
GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int
button, int state, int x, int y));
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,480-y);
if(button==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
drawDot2(x,480-y);
if(button==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN)
drawDot3(x,480-y);
}
void motion(int x,int y){
}
Screenshot Normal
#include <stdio.h>
#include <glut.h>
int w=480,h=480;
float x=0,y=0,z=0;
void drawKoordinat(){
glBegin(GL_LINES);
glColor3f(0,0,0);
glVertex2f(-240.,0.);
glVertex2f(240.,0.);
glVertex2f(0.,-240.);
glVertex2f(0.,240.);
glEnd();
}
void drawQuad(int t, int l){
glBegin(GL_QUADS);
glColor3f(1.,0.0,0.4);
glVertex2i(l-3*t,t-3*l);
glVertex2i(l-3*t,2*t);
glVertex2f(2*l,2*t);
glVertex2f(2*l,t-3*l);
glEnd();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawKoordinat();
glPushMatrix();
glTranslatef(x,y,z);
drawQuad(2,2);
glPopMatrix();
glFlush();
}
2. Sempurnakan program di atas sehingga tombol tengah ditekan akan menyebabkan objek
memiliki skala yang membesar (1.1) dan tombol kanan ditekan akan menyebabkan skala
mengecil (0.9). Berikan source code program.
Screenshot Normal
Screenshot klik kiri
#include <stdio.h>
#include <glut.h>
int w=480,h=480;
float x=0,y=0,z=0;
float s1=1,s2=1,s3=1;
void drawKoordinat(){
glBegin(GL_LINES);
glColor3f(0,0,0);
glVertex2f(-240.,0.);
glVertex2f(240.,0.);
glVertex2f(0.,-240.);
glVertex2f(0.,240.);
glEnd();
}
void drawQuad(int l, int t){
glBegin(GL_QUADS);
glColor3f(1.,0.0,0.4);
glVertex2i(l-3*t,t-3*l);
glVertex2i(l-3*t,2*t);
glVertex2f(2*l,2*t);
glVertex2f(2*l,t-3*l);
glEnd();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawKoordinat();
glPushMatrix();
glTranslatef(x,y,z);
glScalef(s1,s2,s3);
drawQuad(5,5);
glPopMatrix();
glFlush();
}
3. Ubahlah program sehingga tombol kanan ditekan skala membesar (2.0) dan ketika tombol kanan
dilepaskan (UP) skala mengecil (0.5). Berikan source code program.
Screenshot normal
Screenshot klik kanan (tekan)
#include <stdio.h>
#include <glut.h>
int w=480,h=480;
float x=0,y=0,z=0;
float s1=1,s2=1,s3=1;
void drawKoordinat(){
glBegin(GL_LINES);
glColor3f(0,0,0);
glVertex2f(-240.,0.);
glVertex2f(240.,0.);
glVertex2f(0.,-240.);
glVertex2f(0.,240.);
glEnd();
}
void drawQuad(int l, int t){
glBegin(GL_QUADS);
glColor3f(1.,0.0,0.4);
glVertex2i(l-3*t,t-3*l);
glVertex2i(l-3*t,2*t);
glVertex2f(2*l,2*t);
glVertex2f(2*l,t-3*l);
glEnd();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawKoordinat();
glPushMatrix();
glTranslatef(x,y,z);
glScalef(s1,s2,s3);
drawQuad(5,5);
glPopMatrix();
glFlush();
}
Pada latihan ini intinya adalah penggunaan satu jenis button yang
menghasilkan dua kondisi.
Ketika if(button==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN)
dijalankan maka akan dieksekusi 3 baris berikut
s1=2.;
s2=2.;
s3=2.;
Ketiga baris diatas akan dikirim sebagai nilai variabel umum
yang akan digunakan dalam melakukan perubahan skala.Perubahan
terjadi karena nilai dipakai untuk parameter glScalef().
Keadaan riil; objek akan mengalami pembesaran sebesar 2 kali
dari ukuran sebelumnya ketika keadaan mouse masih dalam
keadaan klik button mouse kanan (menekan).
Ketika if(button==GLUT_MIDDLE_BUTTON && state==GLUT_UP)
dijalankan maka akan dieksekusi 3 baris berikut
s1=0.5;
s2=0.5;
s3=0.5;
Ketiga baris diatas akan dikirim sebagai nilai variabel umum
yang akan digunakan dalam melakukan perubahan skala.Perubahan
terjadi karena nilai dipakai untuk parameter glScalef().
Keadaan riil; objek akan mengalami pembesaran sebesar 1/2
kali dari ukuran awal ketika klik mouse button kanan
dilepaskan.
gluOrtho2D(-100,100,-100,100);
Jelaskan apa yang terjadi dan beri kesimpulan (gambar sistem koordinat) hubungan antara
sistem koordinat openGL dan sistem koordinat yang gunakan oleh mouse pointer.
Screenshot normal
Screenshot klik kiri (kacau)
#include <stdio.h>
#include <glut.h>
int w=480,h=480;
float x=0,y=0,z=0;
float s1=1,s2=1,s3=1;
void drawKoordinat(){
glBegin(GL_LINES);
glColor3f(0,0,0);
glVertex2f(-240.,0.);
glVertex2f(240.,0.);
glVertex2f(0.,-240.);
glVertex2f(0.,240.);
glEnd();
}
void drawQuad(int l, int t){
glBegin(GL_QUADS);
glColor3f(1.,0.0,0.4);
glVertex2i(l-3*t,t-3*l);
glVertex2i(l-3*t,2*t);
glVertex2f(2*l,2*t);
glVertex2f(2*l,t-3*l);
glEnd();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawKoordinat();
glPushMatrix();
glTranslatef(x,y,z);
glScalef(s1,s2,s3);
drawQuad(5,5);
glPopMatrix();
glFlush();
}
5. Buatlah project baru pada Visual Studio dengan nama prak7-mouseMotion1. Gunakan fungsi
yang sama dengan no 1 dan lengkapi dengan fungsi Motion. Buatlah fungsi untuk deteksi
motion. Berikan kesimpulan!
Screenshot Normal
#include <stdio.h>
#include <glut.h>
int w=480,h=480;
float x=0,y=0,z=0;
void drawKoordinat(){
glBegin(GL_LINES);
glColor3f(0,0,0);
glVertex2f(-240.,0.);
glVertex2f(240.,0.);
glVertex2f(0.,-240.);
glVertex2f(0.,240.);
glEnd();
}
void drawQuad(int l, int t){
glBegin(GL_QUADS);
glColor3f(1.,0.0,0.4);
glVertex2i(l-3*t,t-3*l);
glVertex2i(l-3*t,2*t);
glVertex2f(2*l,2*t);
glVertex2f(2*l,t-3*l);
glEnd();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawKoordinat();
glPushMatrix();
glTranslatef(x,y,z);
drawQuad(5,5);
glPopMatrix();
glFlush();
}
F.
Screenshot normal
#include <stdio.h>
#include <glut.h>
int w=480,h=480;
float x=0,y=0,z=0;
int l=5, t=5;
int s1=0, s2=0;
void drawKoordinat(){
glBegin(GL_LINES);
glColor3f(0,0,0);
glVertex2f(-240.,0.);
glVertex2f(240.,0.);
glVertex2f(0.,-240.);
glVertex2f(0.,240.);
glEnd();
}
void drawQuad(){
glBegin(GL_QUADS);
glColor3f(1.,0.0,0.4);
glVertex2i(x+l-3*t-s1,y+t-3*l-s1);
glVertex2i(x+l-3*t-s1,y+2*t+s1);
glVertex2f(x+2*l+s1,y+2*t+s1);
glVertex2f(x+2*l+s1,y+t-3*l-s1);
glEnd();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawKoordinat();
glPushMatrix();
drawQuad();
glPopMatrix();
glFlush();
}
2. 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. Buatlah Kesimpulan dan Algoritmanya.
#include<stdlib.h>
#include<gl/glut.h>
int w = 480, h = 480;
float x = 0, y = 0, z = 0;
float sx = 1, sy = 1, sz = 1;
bool normal = true;
int time = REGULER;
#define DELAY 50
#define TIME_LIMIT 500
#define REGULER -1
void drawKoordinat(){
glBegin(GL_LINES);
glColor3f(0,0,0);
glVertex2f(-240.,0.);
glVertex2f(240.,0.);
glVertex2f(0.,-240.);
glVertex2f(0.,240.);
glEnd();
}
void drawQuad(float p, float l){
glBegin(GL_QUADS);
glVertex2f(-p/2, -l/2);
glVertex2f(p/2, -l/2);
glVertex2f(p/2, l/2);
glVertex2f(-p/2, l/2);
glEnd();
}
void doubleClick(){
if(normal){
sx = sy = 1.5;
normal = false;}
else{ sx = sy = 1;
normal = true;
}
}
ALGORITMA PROGRAM
Lakukan pendedfinisian waktu DELAY untuk melakukan
update
Definisikan batas waktu (TIME_LIMIT) antara klik pertama
dengan klik kedua sehingga kedua klik tersebut dianggap
sebagai double klik
Definisikan nilai REGULER untuk klik biasa.
Set nilai time sama dengan REGULER.
Jika button mouse kiri di-release dan time sama dengan
REGULER, set nilai time sama dengan time + 1
Jika time tidak sama dengan REGULER, increment nilai
time dengan menggunakan nilai DELAY
Jika time lebih besar dari TIME_LIMIT, kembalikan nilai
time ke REGULER
Jika time kurang dari atau sama dengan TIME_LIMIT, maka
dianggap double klik dan jalankan fungsi doubleClick
Jika kondisi objek normal, set faktor skala sx dan sy
dengan 1.5 dan set normal = false.
Jika kondisi objek tidak normal, set faktor skala sx dan
sy dengan 1 dan set normal = true
Kesimpulan :
Pada penggunaan double klik memanfaatkan pengaturan waktu,
Dalam hal ini delay yang terlalu cepat akan berakibat
gagalnya proses double klik
Sedangkan untuk regular klik bisa diatur ke delay normal.