1

トラック ボールを使用して 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);
4

1 に答える 1

0

prevPoint と currentPoint を人為的に (0,0) (0,1) に設定し、(デバッガーまたは目で) コードをステップ実行して、各部分が意味をなしているかどうか、および回転角度と軸を確認することをお勧めします。ブロックの最後には、あなたが期待するものがあります。

それらが期待どおりであれば、エラーはその後に発生するロジックにあると推測しています。つまり、角度と軸を取り、それらを行列に変換します。この行列を乗算してモデルを移動します。このパイプラインでは、多くの規則の選択が行われます。交換すると、発生しているタイプのバグにつながる可能性があります。

  • 角度が軸を中心に左巻きまたは右巻きであると公式が仮定するかどうか。
  • 変換がワールド内のオブジェクトを回転させるためのものか、カメラを回転させるためのものか。
  • 行列が左または右の乗算によって操作されることを意味するかどうか。
  • 行列の行または列がメモリ内で連続しているかどうか。
于 2015-01-10T18:00:21.577 に答える