アークボールインターフェイスを実装しようとしていますが、モデルが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;
}
あなたの 'gluUnProject()'呼び出しではどこで '0.755'を取得しましたか? – genpfault
その1つは私が試した値ですが、間違っているかもしれませんが、コードがどこに間違っているのかまだ分かりません。 – Jim
私はgluUnproject()に与える値が問題であるとは思っていません(問題は他の値を使用しても問題ありません)、変換の間違った蓄積(arcball rotationがここで使用される唯一の変換です)交差点の光線は間違っています。この時点で私は正確に何が間違っているのか分かりません。 – Jim