2013-03-31 13 views
0

나는 이것이 간단하고 직선적이라고 생각했지만 그렇지 않았습니다. openGL 응용 프로그램에 카메라가 있고 표시된 이미지를 각각 카메라 "위치"로 변환합니다. 위치가 위로 변경됨아래로으로 변경되었습니다. 카메라는 왼쪽을 사용하여 회전 할 수 있습니다.오른쪽. 카메라가 회전하면 전진 및 후진 운동이 달라야합니다.카메라를 각각 해당 위치로 이동

//Somewhere in event handler switch 
    else if (key == GLUT_KEY_UP|| key == GLUT_KEY_DOWN) { 
    char direction = key==GLUT_KEY_UP?1:-1; //Whether it is forward or backward movement 
    std::cout<<"Moving camera in direction "<<(int)direction<<" with angle "<<rotate_y<<'\n'; 
    std::cout<<" - this means X is multiplied by "<<((sin((rotate_y/180)*M_PI)+1)/2)<<'\n'; 
    camera_x += 0.5*((sin((rotate_y/180)*M_PI)+1)/2)*direction; 
    camera_z += 0.5*((cos((rotate_y/180)*M_PI)+1)/2)*direction; 
    } 

원래의 회전 각도에 있지만 math.h에서 sin() 라디안을 허용 : 이것은 내가 만들어 한 것입니다. 결과에 0을 추가하여 0-2 사이의 결과를 얻습니다. 그런 다음 결과를 2로 나눌 때 sin 또는 cos 진폭을 2에서 1로 변경합니다.
즉, 카메라가 0, 90, 180, 270 또는 360도 각도로 보일 때 함수는 0-1을 반환해야합니다 값. 내가 맞습니까?
처음의 0.5는 단지 이동 속도입니다.

답변

0

당신의 범위는 0에있을 sin/cos의 출력을 원하는 생각하지 않는다 - 당신이 할 필요가, 당신이 특정 방향으로의 움직임 벡터를 생성하려는 경우 1.

원점을 중심으로 한 원에 점을 생성합니다. 축척 및 오프셋을 적용하기 전에 정확하게 원점에있는 점입니다. 대신 당신은 방향 벡터로 사용하는 경우 아마 잘못된 방향으로 가리키는 점 0.5, 0.5, 주위에 원을 생성하고 : 당신의 결과이기 때문 만 (하나의 사분면에 방향을 생성 할 수 있습니다

 
Direction Angle Vector Your Vector Actual Direction 
N   0  0, 1 0.5, 1  ~NNE 
E   90  1, 0 1 , 0.5  ~ENE 
S   180  0, -1 0.5, 0  E 
W   270  -1, 0 0 , 0.5  N 

공지 사항 항상 긍정적 인) 그리고 그들 중 누구도 당신이 원했던 것입니다.

+0

나를 분명하게 해주셔서 감사합니다. OpenGL 세계가 조금 뒤틀린 것처럼 보이기 때문에 원하는 결과를 얻으려면 'sin (360 각)'을 수행해야했습니다. –