Langsung ke konten utama

Event Handling Mouse dan Keyboard pada PyOpenGL

Hai teman-teman, kali ini saya akan memberi contoh penerapan
Event Handling pada Mouse dan Keyboard. Langsung simak saja ya.

OpenGL menyediakan fungsi yang didefinisikan oleh user dan dipanggil pada saat ada event yang bersesuaian. OpenGL memonitor peralatan input, ketika ada sesuatu yang terjadi,misalkan saat mouse down, key press, dan lain-lain.
Pada OpenGL terdapat fungsi Callback GLUT, yaitu fungsi yang berjalan saat ada kejadian (event-driven). Program-program yang menggunakan window untuk input/output,menunggu sampai ada kejadian dan kemudian mengeksekusi beberapa fungsi yang didefinisikan sebelumnya berdasarkan input dari user. Kejadian yang dimaksud : key press, mouse button press dan release, window resize, dan lain-lain. Program OpenGL yang dibuat akan berjalan tak terbatas (infinite loop).

EVENT KEYBOARD

glutKeyboardFunc(nama_fungsi)
def nama_fungsi(key, x, y)
Fungsi ini mencatat apa yang terjadi ketika sebuah tombol keyboard di tekan. Parameter key mengembalikan nilai karakter ascii dari tombol keyboard yang ditekan. Koordinat x,y adalah posisi pointer mouse saat keyboard ditekan,yang diukur dari pojok kiri atas window. x dan y menyatakan lokasi (di window : koordinat layar) dari pointer ketika kejadian key ditekan.
Fungsi ini mencatat apa yang terjadi ketika sebuah tombol keyboard selesai di tekan. Parameter key mengembalikan nilai karakter ascii dari tombol keyboard yang ditekan. Koordinat x,y adalah posisi pointer mouse saat keyboard ditekan,yang diukur dari pojok kiri atas window. x dan y menyatakan lokasi (di window : koordinat layar) dari pointer ketika kejadian key ditekan.
glutSpecialFunc(nama_fungsi)
def nama_fungsi(key, x, y)
Fungsi ini mencatat apa yang terjadi ketika sebuah tombol keyboard khusus di tekan. Parameter key mengembalikan nilai karakter ascii dari tombol keyboard yang ditekan. Koordinat x,y adalah posisi pointer mouse saat keyboard ditekan,yang diukur dari pojok kiri atas window. x dan y menyatakan lokasi (di window : koordinat layar) dari pointer ketika kejadian key ditekan.

EVENT MOUSE

glutMouseFunc(nama_fungsi)
def nama_fungsi(button, state, x, y)
Fungsi ini mencatat apa yang terjadi ketika sebuah tombol mouse di tekan. Parameter button mengembalikan nilai tombol mouse yang di tekan, nilai tersebut adalah (GLUT_LEFT_BUTTON,GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON)State mengembalikan nilai selesainya tombol mouse ditekan, nilai tersebut adalah (GLUT_UP, GLUT_DOWN). Variabel x,y adalah posisi pointer mouse saat tombol mouse ditekan, yang diukur dari pojok kiri atas window.
glutMotionFunc(nama_fungsi)
def nama_fungsi(x, y)
Fungsi ini mencatat apa yang terjadi ketika sebuah tombol mouse di tekan secara bertahan dan melakukan pergerakan (Drag). Variabel x,y adalah posisi pointer mouse saat tombol mouse ditekan, yang diukur dari pojok kiri atas window.
glutPassiveMotionFunc(nama_fungsi)
def nama_fungsi(x, y)
Fungsi ini mencatat apa yang terjadi ketika sebuah cursor mouse di digerakan di dalam area window. Variabel x,y adalah posisi pointer mouse saat tombol mouse ditekan, yang diukur dari pojok kiri atas window.
glutEntryFunc(nama_fungsi)
def nama_fungsi(State)
Fungsi ini mencatat apa yang terjadi ketika sebuah cursor mouse meninggalkan atau memasuki area window. Variabel State adalah kondisi ketika sudah meninggalkan atau memasuki area window, variabel tersebut memiliki nilai (GLUT_ENTERED, GLUT_LEFT).

Contoh Source Code :
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

# Koordinat x dan y untuk posisi kotak
pos_x = 0
pos_y = 0

# Warna otak
merah = 0
hijau = 0
biru = 0


def init():
    glClearColor(0.0, 0.0, 0.0, 1.0)
    gluOrtho2D(-500.0, 500.0, -500.0, 500.0)

# Membuat bentuk kotak
def kotak():
    global pos_x, pos_y
    glColor3f(merah,hijau,biru)
    
    glBegin(GL_POLYGON)
    # Kiri Atas
    glVertex2f(-50 + pos_x,-50 + pos_y)
    # Kanan Atas
    glVertex2f(50 + pos_x,-50 + pos_y)
    # Kanan Bawah
    glVertex2f(50 + pos_x,50 + pos_y)
    # Kiri Bawah
    glVertex2f(-50 + pos_x,50 + pos_y)
    glEnd()
#Mengimplementasikan bentuk kotak ke layar
def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(1.0,1.0,1.0) 
    glBegin(GL_LINES)
    glVertex2f(-500.0, 0.0)
    glVertex2f(500.0, 0.0)
    glVertex2f(0.0, 500.0)
    glVertex2f(0.0, -500.0)
    glEnd()

    glPushMatrix()
    kotak()
    glPopMatrix()

    glFlush()
#Mengatur perubahan yang terjadi pada mouse
def input_mouse(button, state, x, y):
    global merah, hijau, biru
    #Saat klik kanan, warna kotak akan berubah menjadi warna hijau dan biru
    if button == GLUT_RIGHT_BUTTON and state == GLUT_DOWN:
        if hijau < 1:
            merah = 0
            hijau = 1
            biru = 0
        elif biru < 1:
            merah = 0
            hijau = 0
            biru = 1
        print("Klik Kanan ditekan ", "(", x, ",", y, ")")
     #Saat klik kiri, warna kotak akan berubah menjadi warna merah dan hitam
    elif button == GLUT_LEFT_BUTTON and state == GLUT_DOWN:
        if merah < 1:
            merah = 1
            hijau = 0
            biru = 0
        else:
            merah = 0
            hijau = 0
            biru = 0
        print("Klik Kiri ditekan ", "(", x, ",", y, ")")
#Mengatur pergerakan pada kotak menggunakan keyboard
def input_keyboard(key,x,y):
    global pos_x, pos_y

    #Untuk mengubah posisi kotak
    if key == GLUT_KEY_UP:
        pos_y += 5
        print("Tombol Atas ditekan ", "x : ", pos_x, " y : ", pos_y)
    elif key == GLUT_KEY_DOWN:
        pos_y -= 5
        print("Tombol Bawah ditekan ", "x : ", pos_x, " y : ", pos_y)
    elif key == GLUT_KEY_RIGHT:
        pos_x += 5
        print("Tombol Kanan ditekan ", "x : ", pos_x, " y : ", pos_y)
    elif key == GLUT_KEY_LEFT:
        pos_x -= 5
        print("Tombol Kiri ditekan ", "x : ", pos_x, " y : ", pos_y)

    # Untuk Mengubah Warna backgorund window,
    # Background Kiri Atas berubah warna menjadi Merah
    if pos_x < 0 and pos_y > 0:
        glClearColor(1.0, 0.0, 0.0, 1.0)
    # Background Kanan Atas berubah warna menjadi Hijau
    if pos_x > 0 and pos_y > 0:
        glClearColor(0.0, 1.0, 0.0, 1.0)
    # Background Kanan Bawah berubah warna menjadi Biru
    if pos_x > 0 and pos_y < 0:
        glClearColor(0.0,0.0,1.0,1.0)
    # Background Kiri Bawah berubah warna menjadi Hitam
    if pos_x < 0 and pos_y < 0:
        glClearColor(0.0,0.0,0.0,1.0)
    

def update(value):
    glutPostRedisplay()
    glutTimerFunc(10,update,0)

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB)
    glutInitWindowSize(500,500)
    glutInitWindowPosition(100,100)
    glutCreateWindow("Event handling Mouse & Keyboard")
    glutDisplayFunc(display)

    glutSpecialFunc(input_keyboard)
    glutMouseFunc(input_mouse)

    glutTimerFunc(50, update, 0)

    

    init()
    glutMainLoop()
    
main()

Saat program dijalankan, maka kotak bisa digerakan dengan mengunakan tombol pada keyboard (keyup, keydown, keyleft, dan keyright). Jika kotak digerakan ke-arah kanan atas, maka background akan berubah warna menjadi hijau. Jika ke-arah kiri atas, background akan berubah menjadi merah. Jika ke-kiri bawah, background akan berubah menjadi hitam, dan jika ke kanan bawah, bakground akan menjadi biru.
Saat menekan klik kanan pada mouse, warna kotak akan berubah menjadi warna hijau dan biru. Sedangkan, jika menekan klik kiri, maka warna kotak akan berubah menjadi warna merah dan hitam.
Output :







Sekian pembahasan kali ini, terima kasih dan sampai jumpa.

Komentar

Postingan populer dari blog ini

Membuat Piramida 3D Menggunakan PyOpenGL

Bagaimana sih cara membuat piramida 3 dimensi? Langsung saja ya kita bahas. Sebuah piramida terdiri dari :  1 alas,  4 sisi, dan  5 sudut. Berikut langkah-langkahnya : 1. B uat fungsi rgb() untuk memudahkan konversi format dari warna rgb ke format warna PyOpenGL . # Fungsi konversi rgb def rgb(n): return n / 255.0 2.  Buat fungsi pivot() untuk tampilan garis pivot x,y,z untuk mempermudah dalam membuat bentuk 3D. # Fungsi Pivot def pivot(): glBegin(GL_LINES) glColor3f(1,0,0) #merah x glVertex3f(10,0,0) glVertex3f(-10,0,0) glColor3f(0,1,0) #hijau y glVertex3f(0,10,0) glVertex3f(0,-10,0) glColor3f(0,0,1) #biru x glVertex3f(0,0,10) glVertex3f(0,-0,-10) glEnd() 3. B uat fungsi piramida() untuk membuat bentuk piramida 3D. # Bentuk Piramida 3D def piramida(): # Depan glBegin(GL_LINE_STRIP) glColor3f(rgb(231),rgb(1),rgb(10)) glVertex3f(-1.0, -1.0, 1.0) glVertex3f(1.0, -1.0, 1.0) glV...

Membuat Gambar Objek Berbentuk Hati Menggunakan PyOpenGL

Halo semua, balik lagi nih dengan saya. Kali ini saya akan memberikan contoh source code untuk pembuatan gambar objek berbentuk hati, yaitu sebagai berikut : Source Code : from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * import numpy as np def init(): glClearColor(0.0, 0.0, 0.0, 0.0) gluOrtho2D(-2.0, 2.0, -2.0, 2.0) def plotpoints(): glClear(GL_COLOR_BUFFER_BIT) glColor3f(0.0, 1.0, 0.0) glPointSize(13) glBegin(GL_LINES) glVertex2f(-500, 0) glVertex2f(500, 0) #glColor3f digunakan sebagai warna garis horizontal dan vertical yang tertera pada screen capture glVertex2f(0, -500) glVertex2f(0, 500) glEnd() heart_shape() glFlush() def heart_shape(): glBegin(GL_LINE_STRIP) glColor3f(0.0, 1.0, 0.0) x = -1.139 #digunakan untuk fill gambar, disini saya memakai warna hijau while(x <= 1.139): delta = np.cbrt(x*x) * np.sqrt(x*x) - 4*x*x + 4 y1 = (np.cbrt(x*x) + np.sqrt(delta...