opengl трекбол

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

         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 && 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);

person ajay    schedule 14.11.2011    source источник
comment
Почему бы тебе просто не изменить направление?   -  person Kromster    schedule 14.11.2011
comment
да, я мог бы просто обратить перекрестное произведение или взять отрицательное значение угла. но другие реализации трекбола этого не делают. от каких факторов это зависит?   -  person ajay    schedule 14.11.2011
comment
Возможно, трекбол настроен таким образом, чтобы инвертировать направление? Он перемещает курсор так же, как мышь?   -  person Kromster    schedule 14.11.2011


Ответы (1)


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

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

  • Предполагает ли формула, что угол закручивается влево или вправо вокруг оси.
  • Предназначено ли преобразование для вращения объекта в мире или для вращения камеры.
  • Предназначена ли матрица для работы путем умножения слева или справа.
  • Смежны ли строки или столбцы матриц в памяти.
person 2-complex    schedule 10.01.2015