2012-04-03 4 views
2

나는 주위를 돌아 다니며 키로 걸어 다닐 수있는 기준으로 걸어 다닐 수있는 간단한 장면을 만들려고합니다. 그러나, 내 무승부 장면 기능에서 회전하는 것보다 내 장면을 번역 할 때 전체 장면이 단지 주위를 회전하여 개체가 나를 통과하게되므로 주변에서 패닝이 제대로 작동하지 않습니다. 내 장면을 번역하는 것보다 회전 할 때 제대로 돌아 다닐 수는 있지만 특정 방향으로 만 이동할 수 있습니다. 따라서 오른쪽으로 90도 회전하면 전진하지 않고 왼쪽으로 이동합니다. 어쨌든 내가이 두 가지 효과를 조합 할 수 있습니까? 여기먼저 번역하거나 먼저 회전해야합니까?


glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glPushMatrix(); 

glTranslated(xposition, 0, zposition); //This is where I translate my views 
glRotated(yrot, 0, 1, 0); // 

glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER_ARB, quadVBO); 

glNormalPointer(GL_FLOAT, 0, (void*)sizeof(sideArray)); 
glColorPointer(3, GL_FLOAT, 0, (void*)sizeof(sideArray)+sizeof(normals)); 
glVertexPointer(3, GL_FLOAT, 0, 0); 

glDrawArrays(GL_QUADS, 0, sizeof(sideArray)/sizeof(GLfloat)/3); 

glPopMatrix(); 
glFlush(); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 

지금 내 문제를 설명 일부 사진은 다음과 같습니다 :

회전 후 번역 :

PIC1

은 내가보기를 그리는 데 사용할 코드

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.17.39%20PM.PNG

그림 2

는 나는 내가 앞으로 걸을 때

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.17.48%20PM.PNG

Pic3

그러나, 그것은 단지 한 방향으로 산책 카메라의 회전, 그리고 내가 찾고 있어요 방향을 모방 할 수 있습니다.

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.18.30%20PM.PNG

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.18.39%20PM.PNG

다음 회전을 번역 :

PIC1

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.19.44%20PM.PNG

PIC2

내가 이동할 수 있습니다 자유롭게 주위를 바라보며 어느 방향으로나 직진합니다.

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.19.52%20PM.PNG

Pic3

그러나

, 나는 장면을 회전 할 때, 더 이상 그때 회전 할 때처럼 나를 통해 클립에 개체가 발생하고보기를 통해 "팬"하지 않는 전체 일 회전, 내 견해를 번역하십시오.

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.20.01%20PM.PNG

답변

1

켄달 (Kendall)의 답변에 댓글을 달거나 추가하는 방법이 확실하지 않으므로이 답변을 새로운 답변으로 추가하겠습니다.

나는 당신이를 위해 Y를 사용하고있을 수 있습니다 생각, 그래서 방향 라디안 경우이를 사용합니다 :

movementX = sin(direction); 
movementZ = cos(direction); 

방향도에있는 경우는 라디안으로 변환해야합니다 :

radians = degrees*(PI/180); 

그냥 1 운동을 곱 -1 당신이 앞으로 또는 뒤로 이동 여부에 따라 :

movementX = sin(direction)*forwardsBackwards; 
movementZ = cos(direction)*forwardsBackwards; 

당신은뿐만 아니라 기총 소사해야 할 경우 수행 할 수 있습니다 sideToSide가 1 또는 -1 왼쪽 또는 오른쪽 기총 소사하는 경우에 기반

movementX = sin(direction)*forwardsBackwards+sin(direction+1.5707)*sideToSide; 
movementZ = cos(direction)*forwardsBackwards+cos(direction+1.5707)*sideToSide; 

. 1.5707은 90 도의 라디안 (PI/2)입니다. 즉, 어떤 방향으로 향하고 있더라도 방향의 오른쪽으로 90도 각도가 필요합니다. 원하는 경우 변환하기 전에도 회전에 90도를 추가 할 수도 있습니다.

곱하기 원하는 이동 속도에 의해 전체 것은 :

movementX = (sin...eToSide)*speed; 
movementZ = (cos...eToSide)*speed; 

그러나 이것은 한 번에 2 개 방향으로 이동하는 경우 더 빨리 이동하는 straferunning 효과를 생성합니다. 당신이 확인하려면 그렇게 그 계산 운동하기 전에이 추가 발생하지 않습니다 : 당신이 매우 정확해야하는 경우도 COS와 0.7071 (45)를 대체 할 수

if (!forwardsBackwards && !sideToSide) 
{ 
    forwardsBackwards *= 0.7071; 
    sideToSide *= 0.7071; 
} 

.

또는 당신은 할 수 :

float diagonalMod = 1; 
if (!forwardsBackwards && !sideToSide) 
    diagonalMod = 0.7071; // or cos(45) 

movementX = (sin...eToSide)*speed*diagonalMod; 
movementZ = (cos...eToSide)*speed*diagonalMod; 

먼저 회전하고 번역 할 것입니다. 다른 방법은, 내가 올바르게 생각하면 기본적으로 카메라가 회전 할 지점 인 피벗 점을 이동하는 것과 같습니다. 이것이 회전 할 때 객체들을 클립핑하는 이유입니다.

또한 glLoadIdentity()에 이어 "카메라"회전 및 변환을 수행해야합니다. 장면의 다른 모든 것들이 이동하고 회전하기를 원하는 것처럼 OpenGL의 "카메라"기능도 마찬가지입니다.

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 

glRotated(yrot, 0, 1, 0); 
glTranslated(xposition, 0, zposition); 

glPushMatrix(); 

그리고 경우에 나중에 참조 할 수 있도록 당신이 그것에 확장 : 이것은 설치 될 어떻게

glRotatef(Pitch, 1, 0, 0); // Up and down look 
glRotatef(Yaw, 0, 1, 0); // Left and right look 
glRotatef(Roll, 0, 0, 1); // Like a barrel roll in a jet 
glTranslatef(X,Y,Z); 
3

귀하의 문제는 변환의 순서로하지 않습니다. 당신은 회전하고 나서 번역해야합니다.

문제는 이동 중에 회전을 고려하고 있지 않다는 것입니다. 운동 수식 :

방향 라디안의 수는 북쪽으로부터 시계 방향으로되어 있으며, 양의 X 동쪽이고, Y가 양의 북쪽
movementX = sin(direction); 
movementY = cos(direction); 

.