трекбол opengl - PullRequest
       32

трекбол opengl

1 голос
/ 14 ноября 2011

Я пытаюсь вращать сцену 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);

1 Ответ

0 голосов
/ 10 января 2015

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

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

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