трекбол opengl

#opengl #trackball

#opengl #трекбол #версия OpenGL

Вопрос:

Я пытаюсь повернуть сцену opengl с помощью track ball. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю вращения, противоположные направлению моего свайпа по экрану. Вот фрагмент кода.

          prevPoint.y = viewPortHeight - prevPoint.y;
        currentPoint.y = viewPortHeight - currentPoint.y;

        prevPoint.x = prevPoint.x - centerx;
        prevPoint.y = prevPoint.y - centery;
        currentPoint.x = currentPoint.x - centerx;
        currentPoint.y = currentPoint.y - centery;

        double angle=0;
        if (prevPoint.x == currentPoint.x amp;amp; prevPoint.y == currentPoint.y) {
            return;
        }
         double d, z, radius = viewPortHeight * 0.5;
        if(viewPortWidth > viewPortHeight) {
            radius = viewPortHeight * 0.5f;
        } else {
            radius = viewPortWidth * 0.5f;
        }

         d = (prevPoint.x * prevPoint.x   prevPoint.y * prevPoint.y);
         if (d <= radius * radius * 0.5 ) {    /* Inside sphere */
             z = sqrt(radius*radius - d);
         } else {           /* On hyperbola */
             z = (radius * radius * 0.5) / sqrt(d);
         }
        Vector refVector1(prevPoint.x,prevPoint.y,z);
        refVector1.normalize();
        d = (currentPoint.x * currentPoint.x   currentPoint.y * currentPoint.y);
        if (d <= radius * radius * 0.5 ) {    /* Inside sphere */
            z = sqrt(radius*radius - d);
        } else {           /* On hyperbola */
             z = (radius * radius * 0.5) / sqrt(d);
        }
        Vector refVector2(currentPoint.x,currentPoint.y,z);
        refVector2.normalize();
        Vector axisOfRotation = refVector1.cross(refVector2);
        axisOfRotation.normalize();
        angle = acos(refVector1*refVector2);
  

Комментарии:

1. Почему бы вам просто не изменить направление?

2. да, я мог бы просто отменить перекрестное произведение или принять отрицательное значение угла. но другие реализации trackball этого не делают. от каких факторов это зависит?

3. Возможно, трекбол настроен таким образом, чтобы инвертировать направления? Перемещает ли он курсор так же, как это делает мышь?

Ответ №1:

Я рекомендую искусственно установить prevPoint и currentPoint равными (0,0) (0,1), а затем пошагово просмотреть код (с помощью отладчика или своими глазами), чтобы убедиться, что каждая часть имеет для вас смысл, а угол поворота и ось в конце блока соответствуют вашим ожиданиям.

Если они соответствуют вашим ожиданиям, то я предполагаю, что ошибка заключается в логике, которая возникает после этого. т. Е. Затем вы берете угол и ось и преобразуете их в матрицу, которая умножается для перемещения модели. В этом конвейере происходит ряд вариантов соглашения, которые при замене местами могут привести к ошибке того типа, с которым вы столкнулись:

  • Предполагает ли формула, что угол поворачивается влево или вправо вокруг оси.
  • Предназначено ли преобразование для поворота объекта в окружающем мире или для поворота камеры.
  • Предназначена ли матрица для работы путем умножения слева или справа.
  • Являются ли строки или столбцы матриц непрерывными в памяти.