2013-02-19 4 views
0

Я написал функцию мыши для камеры. Работает хорошо. Но единственная проблема заключается в начале, когда я сначала двигаюсь с помощью мыши, она прыгает вверх-налево, а затем она работает хорошо. Я не понимаю, почему это происходит.Движение мыши OpenGL GLUT

Здесь функция мыши.

float lastx = 0.0; 
float lasty = 0.0; 

void mouseMovement(int x, int y) 
{ 
    lastx = (float)x - lastx; 
    lasty = (float)y - lasty; 

    if((float)x > lastx) 
     Camera.RotateY((-lastx)*0.01); 
    else 
     Camera.RotateY(lastx*0.01); 
    if((float)y > lasty) 
     Camera.RotateX(lasty*0.01); 
    else 
     Camera.RotateX(-lasty*0.01); 
    lastx = (float)x; 
    lasty = (float)y; 
    Display(); 
} 
+1

Просто гадать ... lastx & lasty не инициализируются ничем значимым, поэтому первый вызов mouseMovement начинается с двух случайных вычитаний. –

ответ

1

Я предполагаю, что если вы отслеживаете движение мыши, вам нужно либо поймать, когда мышь входит или покидает окно, либо просто отбрасывает любые прыжки больше определенной суммы.

Предположим, что мышь покидает правый край окна и снова встает на левый край окна. Код, который вы показали, будет прыгать.

Если не причина не делать этого, я хотел бы сделать последние статические переменные и добавить, если заявление похожее на это (не проверял :)) ...

void mouseMovement(int x, int y) 
{ 
    static float lastx = 0.0; 
    static float lasty = 0.0; 

    lastx = (float)x - lastx; 
    lasty = (float)y - lasty; 

    if((abs((int)lastx)>10)||(abs((int)lasty)>10) 
    { 
     lastx = (float)x; 
     lasty = (float)y; 
     return; 
    } 

    //the rest remains the same 

Логика идет ... Любое событие, которое он видит, которое не находится вблизи последнего увиденного события, просто сбрасывает переменные и ждет другого события.

Это действительно не изящное решение для управления мышью, но на данный момент в вашей кодировке это, вероятно, понятно и будет делать то, что вы хотите.

+0

О, спасибо! – peaceman

+0

Работает, но я до сих пор не понимаю логики. В начале мой курсор не выходит из окна. Так почему он прыгает? – peaceman

+0

Потому что он еще не видел движения мыши, и у него есть запись, что последний раз его видели (0,0).С точки зрения диспетчеров он начинает думать, что мышь находится в верхнем левом углу окна. – BentFX

1

Переместите курсор в середину экрана перед тем вы начинаете принимать данные. И убедитесь, что lastx и lasty правильно инициализированы.

Я на 90% уверен, что это камера FPP, и вы перемещаете курсор в середину экрана вручную. Так оно и происходит, оно начинается в правом углу окна, а затем перемещается, что является дельта. Это также может быть тот факт, что lastx и lasty инициализируются при первом чтении, и до этого они содержат мусор.

+0

Я инициализировал их как 0.0. – peaceman

+0

Итак, что должно быть инициализировано lastx и lasy? – peaceman

+0

Если вы можете просто переместить курсор в середину экрана, прежде чем перемещать камеру, '0.0' должно быть в порядке –

Смежные вопросы