2013-08-19 2 views
0

안녕하세요, 저는 프로젝트에서 작업하고 있는데, 주 ​​객체를 움직일 때 화면/바닥이 흔들립니다.개체가 움직일 때 화면이 흔들림

일반적으로 "w"버튼으로 움직이면 문제가 없습니다. 하지만 메신저를 돌리는 동안 움직이면 문제가 생깁니다.

보기 : 마우스 오른쪽 버튼을 사용하여 30 정도를주고 (버튼을 놓지 마십시오) 하고 객체를 회전시키면서 w 버튼을 계속 누릅니다. 쉐이크가 바닥에서 보입니다.

문제는 내 looat 함수 계산에 관한 것 같습니다.

gluLookAt(sin(rot*PI/180)*(10-fabs(roty)/4) +movex ,3-(roty/2), cos(rot*PI/180)*(10-(fabs(roty)/4)) +movez , -sin(rot*PI/180)*6 + movex, roty, -cos(rot*PI/180)*6 +movez, 0, 1, 0); 

여기 내 회전 기능이 있습니다. 나는이 func 후에 모든 것을 그려 낸다.

void System::rotater(){ 

if(mouseStates[2][0]==1 && mx!= savex && mx!=mouseStates[2][1]){ 
    rot += (mx-mouseStates[2][1]) * 90/glutGet(GLUT_WINDOW_WIDTH)/2; 
    if(rot>360)rot-=360; 
    if(rot<0)rot= 360+rot; 

} 


glRotatef(rot,0,1,0); 
} 

그리고 내 이동 옵션 마지막은 여기에 있습니다 : 나는 문제는 이벤트, 업데이트 객체와 카메라를 처리하는 순서와 함께 할 일반적이다 흔들어 보이는 화면을 발견했습니다

if(a==87 || a==119){ 
movex -= sin(rot*PI/180)/3; 
movez -= cos(rot*PI/180)/3; 
} 
+5

알려지지 않은 바이너리를 다운로드하여 실행하지 마십시오. 꼭 필요한 경우 gitourious, github 등의 pastebin이나 저장소를 통해 전체 소스 코드를 제공하십시오. ** 이진 실행 파일! ** – datenwolf

+0

좋아, 편집하고 전체 소스를 추가했습니다. – nadirg

+0

문제는 sinus cosinus 함수에 관한 것 같습니다. 나는 그들없이 쉐이크를 볼 수 없기 때문에 gluLookAt (movex, 3- (roty/2), movez +5, movex, roty, movez, 0, 1, 0); 하지만 뒤에서 물건을 따라 가야합니다. – nadirg

답변

0

전 장면을 그립니다 (또는 물리 엔진이 원인이됩니다 : P). 프레임 율이 높으면 작은 불완전 함을 알지 못할 수도 있습니다. 이러한 문제를 드러내 기 위해 잠자기/수면 시간대를 추가 할 수 있습니다. 예를 들어, 카메라 위치가 카메라 회전을 기반으로하지만 마우스 이벤트를 처리하기 전에 위치를 업데이트하면 카메라 위치/회전이 동기화되지 않은 프레임이 될 수 있습니다.

입력, 이동 및 렌더링을 매우 다른 단계에서 처리해야하는 좋은 이유입니다.

LookAt 함수가 다소 복잡해 보입니다. lookAt는 무언가를 바라 보는 카메라를 원할 때 매우 유용하지만,이 경우 카메라 위치에서 보이는 카메라를 쫓고 있습니다. 이것은 수동으로 Sceene을 그리기 전에 카메라 객체의 위치를 ​​지정하기 위해 역변환을 수동으로 구현하여 구현하기가 더 쉽습니다. 예를 들어 왼쪽으로 이동하려면 다른 모든 항목을 오른쪽으로 (역으로) 번역하십시오.

glLoadIdentity(); 
glRotatef(camera.rotX, 1.0f, 0.0f, 0.0f); 
glRotatef(camera.rotY, 0.0f, 1.0f, 0.0f); 
glRotatef(camera.rotZ, 0.0f, 0.0f, 1.0f); 
glTranslatef(-camera.posX, -camera.posY, -camera.posZ); 
+0

그리기 전에 업데이트했지만 결과는 동일합니다. 많은 모델/오브젝트로 작업 할 때 카메라 시스템이 지연을 일으킬 것이라고 생각 했었습니다. 내가 옮겼을 때 프로그램은 모든 물건을 번역 할 것입니다. 프로그램이 지구를 번역하기 때문입니다. – nadirg

+0

카메라가 구현되는 방식입니다. gluLookAt 호출은 유사한 방식으로 모델 뷰 행렬에 변환을 적용합니다. 즉, 장면의 모든 객체를 이동합니다. 이것은 모든 작업이 하나의 4x4 modelview 행렬로 결합되어 있으므로 어쨌든 그리는 모든 것을 변형하는 데 사용되므로 값 비쌉니다. 떨리는 것에 관해서는, 당신이 메인 루프 구조를 보지 않고 상황이 업데이트되고 그려지는 순서에 관한 문제가 여전히 남아 있다고 추측 할 수 있습니다. – jozxyqk

관련 문제