Иллюстрированный самоучитель по Visual Studio.Net


Управление изображением с помощью мыши - часть 3


Теперь вместо вращения мы должны сдвигать объект, то есть пропорционально изменять переменные m_xTrans и m_yTrans, которые затем подаются на вход функции glTranslate. Третья ветвь алгоритма обрабатывает движение указателя при нажатой правой кнопке. Здесь необходимо изменять значение переменной m_zTrans, обеспечивая сдвиг объекта вдоль оси Z. Числовые коэффициенты пропорциональности, которые вы видите в коде функции, влияют на чувствительность мыши и подбираются экспериментально. Вы можете изменить их на свой вкус так, чтобы добиться желаемой управляемости изображения:

void COGView::OnMouseMove(UINT nFlags, CPoint point)

{

if (m_bCaptured) // Если был захват,

{

// Вычисляем компоненты желаемой скорости вращения

m_dy = float (point .у - m_pt .у) /40 . f ;

m_dx = float (point .x - m_pt .x) /40. f ;

//====== Если одновременно была нажата Ctrl,

if (nFlags & MK_CONTROL)

{

//=== Изменяем коэффициенты сдвига изображения

m_xTrans += m_dx;

m_yTrans -= m_dy;

}

else

{

//====== Если была нажата правая кнопка

if (m_bRightButton)

//====== Усредняем величину сдвига

m_zTrans += (m_dx + m_dy)/2.f;

else

{

//====== Иначе, изменяем углы поворота

m_AngleX += m_dy;

m_AngleY += m_dx;

}

}

//=== В любом случае запоминаем новое положение мыши

m_pt = point; Invalidate (FALSE) ;

}

}

Запустите и проверьте управляемость объекта. Введите коррективы чувствительности на свой вкус. Попробуйте скорректировать эффект влияния поворота вокруг оси X на интерпретацию знака желаемого вращения вокруг оси Y. Здесь можно воспользоваться стеком матриц моделирования. Теперь добавим код в заготовку функции реакции на сообщения таймера с тем, чтобы ввести фиксацию состояния вращения.




Начало  Назад  Вперед