0

モデルの描画とマウスを使用した回転に問題があります。数学に問題があることは確かですが、よくわかりません。オブジェクトは奇妙な方法で回転します。ベクトルが変更され、計算が最初からやり直されるため、オブジェクトが現在の場所からクリックごとに回転を開始し、リセットされないようにしたいと考えています。

void DrawHandler::drawModel(Model * model){
unsigned int l_index;
glClear(GL_COLOR_BUFFER_BIT |  GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); // Modeling transformation
glLoadIdentity();
Point tempCross;
crossProduct(tempCross,model->getBeginRotate(),model->getCurrRotate());
float tempInner= innerProduct(model->getBeginRotate(),model->getCurrRotate());
float tempNormA =normProduct(model->getBeginRotate());
float tempNormB=normProduct(model->getCurrRotate());
glTranslatef(0.0,0.0,-250.0);
glRotatef(acos (tempInner/(tempNormA*tempNormB)) * 180.0 / M_PI,tempCross.getX(),tempCross.getY(),tempCross.getZ());
glColor3d(1,1,1);

glBegin(GL_TRIANGLES); 
for (l_index=0;l_index < model->getTrianglesDequeSize() ;l_index++)
{

    Triangle t = model->getTriangleByPosition(l_index);
    Vertex a1 = model->getVertexByPosition(t.getA());
    Vertex a2 = model->getVertexByPosition(t.getB());
    Vertex a3 = model->getVertexByPosition(t.getC());
    glVertex3f( a1.getX(),a1.getY(),a1.getZ()); 
    glVertex3f( a2.getX(),a2.getY(),a2.getZ());
    glVertex3f( a3.getX(),a3.getY(),a3.getZ());

}
glEnd();


}

これは、回転式の開始ベクトルを保存するマウス関数です。

    void Controller::mouse(int btn, int state, int x, int y)
{
    x=x-WINSIZEX/2;
    y=y-WINSIZEY/2;
    if (btn==GLUT_LEFT_BUTTON){
        switch(state){
        case(GLUT_DOWN):
            if(!_rotating){
                _model->setBeginRotate(Point(float(x),float(y),
                    (-float(x)*x - y*y + SPHERERADIUS*SPHERERADIUS < 0)? 0:float(sqrt(-float(x)*x - y*y + SPHERERADIUS*SPHERERADIUS))));
                _rotating=true;
            }
            break;
        case(GLUT_UP):
            _rotating=false;
            break;
        }
    }
}

最後に、現在のベクトルを保持する次の関数。(開始ベクトルはマウスがクリックされた場所で、現在のベクトルはその時点でのマウスの位置です)

void Controller::getMousePosition(int x,int y){
    x=x-WINSIZEX/2;
    y=y-WINSIZEY/2;
    if(_rotating){
        _model->setCurrRotate(Point(float(x),float(y),
            (-float(x)*x - y*y + SPHERERADIUS*SPHERERADIUS < 0)? 0:float(sqrt(-float(x)*x - y*y + SPHERERADIUS*SPHERERADIUS))));
    }
}

ここで、sphereradius は 70 度の球半径 O_O です。

計算が間違っていますか?問題が見つからないようです...ありがとう

4

2 に答える 2