2013-05-18 1 views
0

모델을 그려 마우스를 사용하여 회전하는 데 문제가 있습니다. 수학에 문제가 있는지는 확실하지만 확실하지 않습니다. 개체가 이상한 방식으로 회전합니다. 때문에 개체가 현재 위치에서 각 클릭을 회전하기 시작하고 재설정되지 않도록하려면 벡터가 변경되고 계산이 다시 시작됩니다. opengl - 벡터를 사용하여 구 주위를 회전하고 글 루크 컷을 사용하지 않습니다.

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; 
     } 
    } 
} 

및 전류 벡터를 보유 마지막 다음 함수의 초기 벡터를 저장 마우스 함수이다. 는 sphereradius가

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)))); 
    } 
} 

70의 degress

의 구체 반경 O_O 모든 계산은 (초기 벡터 순간 마우스 위치는 어디에 마우스 로 클릭하고 CURR 벡터이고이다) 잘못된 ? 위선자가 문제를 찾은 것 같습니다 ... 감사합니다

답변

1

왜 그렇게 복잡합니까? 보기 행렬을 변경하거나 초점을 맞춘 객체의 모형 행렬을 변경하십시오. 모델 행렬을 변경하고 객체가 월드 좌표계의 중심에 있으면 (0,0,0), 구체 환상 주위의 회전 계산은 쉽지 않습니다. 반대 방향으로 회전하면됩니다. 카메라의 위치를 ​​변경할 때 실제로 수행되는 뷰 행렬을 변경하려면 선택한 영역의 표면 점을 근사해야합니다. 따라서 두 개의 각도를 지정하는 두 개의 매개 변수를 도입 할 수 있습니다. 마우스를 클릭 할 때마다 매개 변수를 업데이트하고 구의 새 위치를 계산합니다. [http://en.wikipedia.org/wiki/Sphere]에는 몇 가지 유용한 방정식이 있습니다.

1

코드를 사용하는 라이브러리 (또는 라이브러리)를 알지 못해 읽기가 어렵습니다. 카메라를 (0, 0, -250)으로 설정하고 원점을 바라본 다음 원점을 두 벡터, 즉 model->getCurrRotate()model->getBeginRotate() 사이의 각도로 회전하는 것 같습니다.

"mouse down"이벤트에서 BeginRotate를 마우스 아래 구의 점에 명시 적으로 설정 한 다음 "Mouse move"이벤트에서 CurrRotate를 마우스 아래 점으로 설정하면 문제가있는 것처럼 보입니다. 다른 곳을 클릭하면 BeginRotate 및 CurrRotate가 단순히 덮어 쓰기되기 때문에 이전 회전 상태를 잃게됩니다.

임의의 다른 축을 중심으로 여러 회전을 결합하는 것은 쉬운 일이 아닙니다. 올바른 방법은 쿼터니언을 사용하는 것입니다. this primer on quaternions and other 3D math concepts이 유용 할 수 있습니다.

화면 좌표를 구체의 모델 좌표로 변환하기위한보다 강력한 알고리즘이 필요할 수도 있습니다. 사용하고있는 것은 구가 스크린에서 반경 70 픽셀로 표시되고 투영 행렬이 직교임을 가정합니다.