Glfw ile Fare Koordinatları - Mustafa Sabri OĞUZ

Duyurular

17 Ağustos 2018 Cuma

Glfw ile Fare Koordinatları

Bazen geliştirdiğimiz oyun ve uygulamalarda farenin uygulama üzerinde ki konum bilgisine ihtiyaç duyabiliriz. Glfw kütüphanesi, sağladığı diğer fonksiyonlar gibi 2 farklı yöntem ile farenin 2 boyutlu düzlem koordinatlarını elde edebiliriz.

1.Yöntem: glfwSetCursorPosCallback Fonksiyonu Nedir?

// Prototip Tanımı
GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow *window, GLFWcursorposfun cbfun)

// Kullanımı
glfwSetCursorPosCallback(window, Fare_Koordinat_Callback_Adı);

glfwSetCursorPosCallback: Glfw ile oluşturulan pencerenin üzerinde, fare hareketi oluştuğu anda çağrılacak fonksiyonu belirlemeye yarar.
Fonksiyon Parametreleri;
  • GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi
  • GLFWcursorposfun cbfun -  GLFWcursorposfun fonksiyon gösterici türünden bir geri çağırım fonksiyon ismi

Geri Çağırım Fonksiyonu

// Prototip Tanımı
typedef void(* GLFWcursorposfun)(GLFWwindow *, double, double)

// Kullanımı
static void mousePos_callback(GLFWwindow *window, double xPos, double yPos)

Bu fonksiyon sayesinde fare koordinat (x ve y) girdilerini sürekli elde edebilir ve elde edilen koordinat bilgisi ile gerekli kontrol ve işlemleri sağlayabilirsiniz.
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önder