2010-12-14 2 views
1

アークボールインターフェイスを実装しようとしていますが、モデルが90度回転した後、モデルがその特定の方向に回転を停止するように見えます。アークボールには問題がありますが、間違った数学や間違った変換の蓄積である可能性があります。助けがあれば分かります。ここでは問題の関連コードがあります。ベクトルで操作するときには^演算子はクロス積を表し、*演算子は内積を表します。OpenGLでのアークボールの正しいマッピングの取得

void mouseButton(int button,int state,int x,int y){ 
      if(state==GLUT_DOWN){ 
      GLdouble xx,yy,zz; 
      GLdouble modelMatrix[16]; 
      glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix); 
      GLdouble projMatrix[16]; 
      glGetDoublev(GL_PROJECTION_MATRIX,projMatrix); 
      int viewport[4]; 
      glGetIntegerv(GL_VIEWPORT,viewport); 
      gluUnProject(x,height-y-1,0.755 
       ,modelMatrix,projMatrix,viewport,&xx,&yy,&zz); 
      arcBall_begin(xx,yy); 
      } 

     } 

     void mouseMotion(int x,int y){ 
      GLdouble xx,yy,zz; 
      GLdouble modelMatrix[16]; 
      glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix); 
      GLdouble projMatrix[16]; 
      glGetDoublev(GL_PROJECTION_MATRIX,projMatrix); 
      int viewport[4]; 
      glGetIntegerv(GL_VIEWPORT,viewport); 
      gluUnProject(x,height-y-1,0.755 
        ,modelMatrix,projMatrix,viewport,&xx,&yy,&zz); 

      arcBall_drag(xx,yy); 

    } 

void arcBall_begin(GLdouble x,GLdouble y){ 
    if(sqrt((x*x)+(y*y))>radius) 
    begin = vec(x,y,0); 
    else 
    begin = vec(x,y,sqrt((radius*radius)-(x*x)-(y*y))); 
    begin = begin.unit(); 
glGetDoublev(GL_MODELVIEW_MATRIX,mm);  
} 


void arcBall_drag(GLdouble x,GLdouble y){ 
    if(sqrt((x*x)+(y*y))>radius) 
    end = vec(x,y,0); 
    else 
    end = vec(x,y,sqrt((radius*radius)-(x*x)-(y*y))); 
    end = end.unit(); 

    rotationAxis = begin^end; 
    rotationAxis = rotationAxis.unit(); 

    angle = -2*acos(begin*end); 
    angle = angle * (float(180)/float(PI)); 
} 

float arcBall_rotate(){ 

    if(angle!=0.0){ 
    glLoadMatrixd(mm); 
    glRotatef(angle,rotationAxis.x,rotationAxis.y,rotationAxis.z); 
    angle = 0.0; 
    } 
    return angle;  
} 
+0

あなたの 'gluUnProject()'呼び出しではどこで '0.755'を取得しましたか? – genpfault

+0

その1つは私が試した値ですが、間違っているかもしれませんが、コードがどこに間違っているのかまだ分かりません。 – Jim

+0

私はgluUnproject()に与える値が問題であるとは思っていません(問題は他の値を使用しても問題ありません)、変換の間違った蓄積(arcball rotationがここで使用される唯一の変換です)交差点の光線は間違っています。この時点で私は正確に何が間違っているのか分かりません。 – Jim

答えて

0

OpenGLのピクセル座標は画面の左上隅にあるので、マップする場合は座標をマッピングするためにy軸を逆にする必要があることに注意してください球に

+0

それ以外の場合は何を得る?逆さまになっている球?この回答は短すぎて役に立たない。 –

関連する問題