opengl轨迹球

opengl轨迹球,opengl,trackball,Opengl,Trackball,我正在尝试使用轨迹球旋转opengl场景。我遇到的问题是,我的旋转方向与我在屏幕上的滑动方向相反。下面是代码片段 prevPoint.y = viewPortHeight - prevPoint.y; currentPoint.y = viewPortHeight - currentPoint.y; prevPoint.x = prevPoint.x - centerx; prevPoint.y = prevPoint.y -

我正在尝试使用轨迹球旋转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);
prevPoint.y=视口高度-prevPoint.y;
currentPoint.y=视口高度-currentPoint.y;
prevPoint.x=prevPoint.x-centerx;
prevPoint.y=prevPoint.y-中心;
currentPoint.x=currentPoint.x-centerx;
currentPoint.y=currentPoint.y-centery;
双角度=0;
if(prevPoint.x==currentPoint.x&&prevPoint.y==currentPoint.y){
返回;
}
双d,z,半径=视口高度*0.5;
如果(视口宽度>视口高度){
半径=视口高度*0.5f;
}否则{
半径=视口宽度*0.5f;
}
d=(prevPoint.x*prevPoint.x+prevPoint.y*prevPoint.y);

如果(d我建议人为地将prevPoint和currentPoint设置为(0,0)(0,1),然后(用调试器或眼睛)逐步查看代码中的每个部分是否对您有意义,并且块末端的旋转角度和轴是您所期望的

如果它们是你所期望的,那么我猜错误就在之后发生的逻辑中。也就是说,你把角度和轴转换成一个矩阵,然后乘以矩阵来移动模型。在这个管道中有很多约定选择——如果交换,可能会导致你所遇到的错误类型:

  • 公式是否假定角度是绕轴左右旋转
  • 变换是要旋转世界中的对象还是要旋转摄影机
  • 矩阵是通过左边还是右边的乘法运算
  • 矩阵的行或列在内存中是否连续

为什么不反转方向?是的,我可以简单地反转叉积或取角度值的负数。但其他轨迹球的实现方式不这样做。这取决于什么因素?也许轨迹球的设置方式可以反转方向?它移动光标的方式是否与鼠标移动光标的方式相同?