平行移動

translation.png

glTranslatef(x,y,z);

(1)
\begin{align} \left[ \begin{array}{cc} 1 & 0 & 0 & x \\ 0 & 1 & 0 & y \\ 0 & 0 & 1 & z \\ 0 & 0 & 0 & 1\\ \end{array} \right] \end{align}

理論

4D(同次座標のこと)空間をせん断すると、3D空間で平行移動することになる。

実装

マウス上でひっかいた距離を平行移動に換算するには
gluUnProject(winX,winY,winZ,モデルビュー行列,投影行列,ビューポート行列,objX,objY,objZ);
という関数を使うと便利。だけど、使えない場合は?

mouse関数

void mouse(int button ,int touch_state, int x, int y){
    if(button == GLUT_RIGHT_BUTTON){//平行移動
            quaternionflag=false;
            if(state==GLUT_DOWN){
                mouse_down[0]=x;
                mouse_down[1]=y;
            }else if(state==GLUT_UP){
                trans[0]+=translate_speed*(x-mouse_down[0]);
                trans[1]+=-translate_speed*(y-mouse_down[1]);//yは上下逆
            }
        }else{
        quaternionflag=true;
        //回転
        }

move関数

void move(int _x,int _y){
        if(quaternionflag){
        //クオータニオンによる回転処理
    }else{//平行移動
            mTranslationMatrix[12]+=translate_speed*(_x-previous_x);
            mTranslationMatrix[13]+=-translate_speed*(_y-previous_y);//yは上下逆
            previous_x=_x;
            previous_y=_y;
        }
        glutPostRedisplay();
 
}

display関数

void display(void ){
 
    glClearColor(.0f, .0f, .0f, 0.f);
    glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
 
    gModelView.LoadIdentity();
    gModelView.gluLookAt(0,0,mZoom, 0,0,0, 0,1,0);    
    gModelView.MultMatrix(mTranslationMatrix);//平行移動
    gModelView.MultMatrix(&rotation);//回転
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glMultMatrixf(gModelView.mMatrix);
//描画
glutSwapBuffers();
}

サポートサイト Wikidot.com