Glfw ile Fare Tekerleği Girdisi - Mustafa Sabri OĞUZ

Duyurular

4 Temmuz 2014 Cuma

Glfw ile Fare Tekerleği Girdisi

Glfw Mouse Wheel Input
Genellikle mmorpg türü oyunlarda kamerayı uzaklaştırma ve yakınlaştırmaya yarayan ve aynı zamanda internet tarayıcılarında ve ofis programlarında uzun makaleleri öteleme veya gerileme işlemleri ile rahatça gezinmemizi sağlayan fare tekerlek girdisini ele alacağım.

glfwSetScrollCallback Fonksiyonu Nedir?

// Prototip Tanımı
GLFWscrollfun glfwSetScrollCallback (GLFWwindow * window, GLFWscrollfun cbfun);

// Kullanımı
glfwSetScrollCallback(window, Fare_Tekerlek_Callback_Adı);

glfwSetScrollCallback: Fare tekerlek girdisini elde etmek ve girdileri isteğimize göre programlayabilmek için tasarladığımız geri çağırın (callback) fonksiyonumuzu kütüphaneye tanımlamaya yarar.
Fonksiyon Parametreleri;
  • GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi
  • GLFWscrollfun cbfun - GLFWscrollfun fonksiyon gösterici türünden bir geri çağırım fonksiyon ismi

Geri Çağırım Fonksiyonu

// Prototip
typedef void(* GLFWscrollfun)(GLFWwindow *, double, double)

// Kullanımı
static void mouseWheel_callback(GLFWwindow *window, double xoffset, double yoffset)
{

}

Mouse tekerlek (wheel)  girdilerinin bilgisini almak ve ihtiyacınıza göre programlayabilmek için oluşturmanız gereken geri çağırım fonksiyonu.
Fonksiyon Parametreleri ;
  • [in] GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi
  • [in] double xOffset -  x-axis, Yatay (Horizontal) tekerlek girdisi (Not: İki tekerleği olan özel farelerde bulunmaktadır.)
  • [in] double yOffset - y-axis, Dikey (Vertical) tekerlek girdisi

Örnek:

Bu örnek de, fare tekerlek girdisine (yOffset) göre kamerayı uzaklaştırma ve yakınlaştırma işlemlerini temsili olarak gerçekleştireceğiz.

// Zoom Faktörü
GLdouble dZoomFactor = 1.0;

İlk olarak global düzeyde bir zoom faktörü tanımlamamız gerekiyor. Ardından;

/* Render Alani */
float ratio;
int width, height;

// OpenGL içerik boyutu alınıyor. (Genişlik ve Yükseklik)
glfwGetFramebufferSize(window, &width, &height);
ratio = width / (float) height;

// OpenGL Komutları -- Örnek olması için koyuldu.
// OpenGL Derslerinde İşlenecek
glViewport(0, 0, width, height);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-ratio * dZoomFactor, ratio * dZoomFactor, 1 * dZoomFactor, -1 * dZoomFactor, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

Render alanında, glOrtho fonksiyonuna zoom faktörünü dahil edin. Burada yenilenen dZoomFactor değerine göre yakınlaşma ve uzaklaşma gerçekleşecek. Son olarak geri çağırım fonksiyonunu tanımlıyoruz.

// Fare Tekerleği Callback
static void mouseWheel_callback(GLFWwindow *window, double xoffset, double yoffset)
{
cout << "X offset : " << xoffset << endl;
cout << "Y offset : " << yoffset << endl;

if(yoffset > 0)
dZoomFactor -= 0.05;
else
dZoomFactor += 0.05;

cout << "Zoom Faktoru : " << dZoomFactor << endl;
}

Geri çağırım fonksiyonumuzda, yOffset değerini 'if' kontrolünden geçirerek, 0'dan büyük olması halinde zoom faktörünü %5 eksiltiyor yada %5 arttırma yapmasını istedik. Böylece yakınlaştırma veya uzaklaştırma işlemi ile OpenGL içeriğini yeniden ölçeklendirme yapmış olduk.

Sonuç


Bitbucket: main.cpp dosyasını indirmek için tıklayın.

Referans:
http://www.glfw.org/docs/latest/group__input.html

Hiç yorum yok:

Yorum Gönderme