2012-11-21 5 views
1

저는 OpenGL에서 일련의 gluLookAt 호출을 사용하여 롤러 코스터에 카메라를 타게하는 롤러 코스터 시뮬레이터를 만들려고했습니다. 코스터 자체는 coords 배열에 제어점이있는 b- 스플라인 곡선을 기반으로합니다. b0 (u), b1 (u) 등은 b- 스플라인 곡선의 블렌딩 함수이며 bprime0 (u) 등은 파생됩니다. 여기에 내 코드의 관련 부분 :gluLookAt Issues

for (int i = 0; i <= 10; i++){ 
     for (float u = 0; u <= 1.1; u+=0.1){ 

      x = (b0(u)*coords[(i)%10].x + b1(u)*coords[(i+1)%10].x 
       + b2(u)*coords[(i+2)%10].x + b3(u)*coords[(i+3)%10].x)*2.0f; 
      y = (b0(u)*coords[(i)%10].y + b1(u)*coords[(i+1)%10].y 
       + b2(u)*coords[(i+2)%10].y + b3(u)*coords[(i+3)%10].y)*2.0f; 
      z = (b0(u)*coords[(i)%10].z + b1(u)*coords[(i+1)%10].z 
       + b2(u)*coords[(i+2)%10].z + b3(u)*coords[(i+3)%10].z)*2.0f; 

      xprime = (bprime0(u)*coords[(i)%10].x + bprime1(u)*coords[(i+1)%10].x 
        + bprime2(u)*coords[(i+2)%10].x + bprime3(u)*coords[(i+3)%10].x)*-2.0f; 
      yprime = (b0(u)*coords[(i)%10].y + bprime1(u)*coords[(i+1)%10].y 
        + bprime2(u)*coords[(i+2)%10].y + bprime3(u)*coords[(i+3)%10].y)*-2.0f; 
      zprime = (b0(u)*coords[(i)%10].z + bprime1(u)*coords[(i+1)%10].z 
        + bprime2(u)*coords[(i+2)%10].z + bprime3(u)*coords[(i+3)%10].z)*-2.0f; 

      Coords nvector = {xprime,yprime,zprime}; 
      float magn = sqrt(nvector.x*nvector.x+nvector.y*nvector.y+nvector.z*nvector.z); 
      nvector.x= nvector.x/magn; 
      nvector.y= nvector.y/magn; 
      nvector.z= nvector.z/magn; 

      glLoadIdentity(); 
      if (rotateCam == 1){ 
       theta+=0.0001; 
       if (theta > 360) { 
        theta = 0; 
       } 
       gluLookAt(20*cos(theta),15,20*sin(theta),0,0,0,0,1,0); 
       }//if 
      else{ 
       printf("%f\t%f\t%f\n", x+xprime,y+yprime,z+zprime); 
       gluLookAt(x,y+1,z,x+xprime,y+yprime,z+zprime,0,1,0); 
      }//else 

     }//for 
}//for 

는 스페이스 바를 두 가지보기 모드 사이를 전환 할 가정되는 'rotateCam'변수를 스위치; 코스터 주위에 카메라를 빙글 빙글 돌리는 ('if'문) 및 코스터를 타는 것 ('else'문).

다음과 같은 사항이 있습니다. 선회 모드가 정상적으로 작동하고 모드 전환이 제대로 작동하지만 카메라가 항상 '주행'모드에서 정지합니다. printf 명령문은 x, xprime, y, yprime 등이 각각의 타이머 틱마다 모두 변경되지만 카메라는 절대로 움직이지 않는다는 것을 보여줍니다.

더 많은 코드가 필요하면 알려주십시오.

+0

카메라가 항상 주행 모드에서 고정되어 있다는 것은 무엇을 의미합니까? – Waleed

답변

0

gluLookAt은 cemera의 위치를 ​​지정하지 않고 올바른 각도로 회전시킵니다. 이 후에도 번역을해야합니다. 그럼이 트릭을해야합니다 :

gluLookAt(x,y+1,z,x+xprime,y+yprime,z+zprime,0,1,0); 
gluTranslated(x,y+1,z); 
+0

죄송합니다. 그건 저에게 아무 것도하지 않습니다. '눈'값을 지정했기 때문에 gluLookAt가 운동을 처리하지 않아야합니까? 가장 혼란스러운 것은 다른 호출 인 gluLookAt (20 * cos (theta), 15,20 * sin (theta), 0,0,0,0,1,0)가 완벽하게 작동한다는 것입니다. – JMcMinn