2015-12-20 8 views
2

Я понимаю, что этот вопрос был задан раньше в stackoverflow, но мне еще предстоит найти ответ, который я полностью понимаю, поэтому я подумал, что получаю некоторую помощь, специфичную для моей ситуации.Как перемещаться по камере с помощью мыши в OpenGL?

В основном я хочу, чтобы мы могли использовать мышь для поворота вокруг оси y. Ниже приведена функция, которую я использую для фактического вращения (углы находятся в градусах).

void CCamera::RotateY (GLfloat Angle) 
{ 
    RotatedY += Angle; 

    //Rotate viewdir around the up vector: 
    ViewDir = Normalize3dVector(ViewDir*cos(Angle*PIdiv180) 
        - RightVector*sin(Angle*PIdiv180)); 

    //now compute the new RightVector (by cross product) 
    RightVector = CrossProduct(&ViewDir, &UpVector); 
} 

Поскольку я использую GLUT, я использую пассивную функцию для получения координат x, y курсора. И тогда в моем дисплее я имею следующее:

void display(void) { 
    ... 
    mouseDisplacement = mouseX - oldMouseX; 

    if (mouseDisplacement > 0) Camera.RotateY(-1.0*abs(mouseDisplacement)); 
    else if (mouseDisplacement < 0) Camera.RotateY(1.0*abs(mouseDisplacement)); 

    oldMouseX = mouseX; 
    glutWarpPointer(centerWindowX, centerWindowY); // move the cursor to center of window 
    ...  
} 

Теперь проблема довольно очевидна, так как функция дисплей работает в 60 раз в секунду, курсор мыши просто застревает в середине, когда я пытаюсь переместить его. Если у меня нет цикла функции отображения, вращение действительно лаги и прочее. Итак, каков правильный способ сделать это?

Обратите внимание, что я только ищу, чтобы камера двигалась вправо/влево с помощью мыши. Хотя было бы здорово, если бы я мог заставить его работать как правильный fps, это не очень важно.

Любая помощь очень ценится.

ответ

0

Вы можете использовать glutPassiveMotionFunc с обратным вызовом для обработки позиции мыши дельт:

void handlerFunc(int x, int y) 
{ 
    /* code to handle mouse position deltas */ 
} 

int main() 
{ 
    /* [...] */ 

    glutPassiveMotionFunc(handlerFunc); // before glutMainLoop. 

    /* [...] */ 

    return 0; 
} 

Документация: glutPassiveMotionFunc

-

Кроме того, я считаю, что что-то не так с вашей дельтой расчет. Вы должны рассчитать разницу между текущей позицией курсора и центром окна (где курсор будет установлен после каждого кадра).

mouseDisplacement = mouseX - centerWindowX;

Вот код, который я использую в моем двигателе, чтобы получить камеру FPS (не стесняйтесь адаптировать соответственно):

void update(float delta) // delta is usually 1.0/60.0 
{ 
    // Mouse. 
    MouseState mouse = InputDevices.get_mouse_state(); 

    // - Movement 
    camera->yaw += camera->speed * mouse.dx * delta; 
    camera->pitch -= camera->speed * mouse.dy * delta; 

    // Regular FPS camera. 
    // TODO(Clem): Move this to a class. 

    // Clamp. 
    if (camera->pitch > math::PI_OVER_TWO) { 
     camera->pitch = math::PI_OVER_TWO - 0.0001f; 
    } 
    else if (camera->pitch < -math::PI_OVER_TWO) { 
     camera->pitch = -math::PI_OVER_TWO + 0.0001f; 
    } 

    float pitch = camera->pitch; 
    float yaw = camera->yaw; 

    // Spherical coordinates (r=1). 
    camera->forward.x = -sin(yaw) * cos(pitch); 
    camera->forward.y = -sin(pitch); 
    camera->forward.z = -cos(yaw) * cos(pitch); 

    camera->right.x = -cos(yaw); 
    camera->right.y = 0.0; 
    camera->right.z = sin(yaw); 

    camera->up = cross(camera->forward, camera->right); 

    camera->forward = normalize(camera->forward); 
    camera->right = normalize(camera->right); 
    camera->up = normalize(camera->up); 
} 
+0

Мой плохо за не ясно. Я уже использую glutPassiveMotionFunc (...) для обновления глобальной переменной, которая является 'mouseX'. Проблема возникает, когда я хочу перемещаться по камере, удерживая мышь в центре. – Bazinga

+0

Ok gotcha. Я считаю, что проблема исходит из вашего расчета дельты. Вы должны рассчитать разницу между текущей позицией курсора и центром окна (где курсор будет установлен после каждого кадра). –

+0

Спасибо, что нашли время, чтобы помочь мне. Я также пробовал то, что вы сказали выше, принимая смещение относительно центральной координаты. Однако, поскольку я обновляю курсор, чтобы оставаться посередине, смещение становится всегда 0 или очень близко к 0. Таким образом, не перемещайте камеру так, как должно быть. – Bazinga

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

  • Нет связанных вопросов^_^