2011-05-09 27 views
5

üzerinde OpenGL'de çalışan bir fare görünümlü fotoğraf makinesi almaya çalışırken OpenGL'de bir demo üzerinde çalışıyorum ve fps benzeri bir fare görünümlü kamera uygulamaya çalışıyorum. Max OSX Leopard kullanıyorum, bu yüzden ekran koordinatlarını almak ve fareyi ekranın ortasına döndürmek için Karbon'u kullanmak zorunda kaldım, bu da çoğu zaman iyi çalışıyor. Aşağıda benim fare yönteminden ilgili kodudur:Mac OSX

CGPoint pnt; 
pnt.x = glutGet(GLUT_WINDOW_WIDTH)/2 + glutGet(GLUT_WINDOW_X); 
pnt.y = glutGet(GLUT_WINDOW_HEIGHT)/2 + glutGet(GLUT_WINDOW_Y); 

int diffX; 
int diffY; 
CGGetLastMouseDelta(&diffX, &diffY); 

if (diffX == 0 && diffY == 0) return; 

if ((diffX) > 0) 
    angle += (diffX)/5; 
else if ((diffX) < 0) 
    angle += (diffX)/5; 

if ((diffY) > 0 && pitch < 90) 
    pitch += (diffY)/5; 
else if ((diffY) < 0 && pitch > -70) 
    pitch += (diffY)/5; 

CGDisplayMoveCursorToPoint(0, pnt); 

sorun rahatsız edici basittir: Program başladı ve pencerenin merkezi önce CGGetLastMouseDelta denir ilk kez, fare konumu arasındaki farkı döndürür. Bu, program başladığında, kameranın olması gerektiği gibi doğru yöne baktığı anlamına gelir, ancak fareye dokunduğum anda farklı bir pozisyona atlar.

CGPoint pnt; 
pnt.x = glutGet(GLUT_WINDOW_WIDTH)/2 + glutGet(GLUT_WINDOW_X); 
pnt.y = glutGet(GLUT_WINDOW_HEIGHT)/2 + glutGet(GLUT_WINDOW_Y); 
CGDisplayMoveCursorToPoint(0, pnt); 

Ben Carbon hakkında çok az şey biliyor ve bir cevap bulmak için deli gibi arama edilmiştir, ama:

Her şeyi başlatmak için bir işlev içinde imleci ortalamak için başka bir çağrı var, aşağıda gösterilen boşuna. Bu atlamadan kaçınmak için yapmam gereken başka bir şey var mı?

cevap

3

CoreGraphics bir Karbon API'sı değil, bu yüzden yanlış yere bakmanızın iyi bir şansı var. CGAssociateMouseAndMouseCursorPosition kullanmayı deneyin.

+0

Başlatma yöntemimin başlangıcında 'CGAssociateMouseAndMouseCursorPosition (false)' yazmayı denedim, hiçbir şey değişmiyor gibi görünüyor. CoreGraphics hakkında pek bir şey bilmiyorum ve aradığım şeyle ilgili çok fazla dokümantasyon yok gibi görünüyor. –

+0

Unutmayın, 'CGDisplayMoveCursorToPoint'den kurtulmadım, bu şimdi mükemmel çalışıyor, çok teşekkürler :) –