2013-05-13 2 views
3

원근 투영에 glFrustum을 사용하려고합니다. glFrustumglOrtho과 같이 실제 좌표계와 실제 화면 좌표 (파란색 책에서 읽음)의 매핑을 수정하는 데 사용할 수 있습니다. 따라서
glFrustum(-1,1,-1,1,1,1000);을 입력하면 좌표가
left = -1, right = 1, bottom = -1, top = 1로 바뀝니다.glFrustum으로 좌표 변경

내 좌표계에서 다음 방정식을 호출하여 간단한 방 (2 개의 측벽이있는)을 그려 보았습니다. 그러면 화면에 적절히 그림이 그려집니다. 다음

void drawRoomWalls(){ 
    //Left wall 
    glBegin(GL_QUADS); 
    glVertex3f(-1.0, 1.0, 0.0); 
    glVertex3f(-1.0, 1.0, -0.4); 
    glVertex3f(-1.0, -1.0, -0.4); 
    glVertex3f(-1.0, -1.0, 0.0); 
    glEnd(); 

    //Right wall 
    glBegin(GL_QUADS); 
    glVertex3f(1.0, 1.0, 0.0); 
    glVertex3f(1.0, 1.0, -0.4); 
    glVertex3f(1.0, -1.0, -0.4); 
    glVertex3f(1.0, -1.0, 0.0); 
    glEnd(); 
} 

함수가 호출 :

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
    glFrustum(1.0, -1.0, -1.0, 1.0, 1.0, 1000.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0, 0, -1.0); 
drawRoomWalls(); 

이후, I는 (입력 대신에 사용자의 머리로 마우스를 취하여) 엇축 프로젝션을 수행하려고. 코드는 다음과 같습니다 : glMatrixMode (GL_PROJECTION); glPushMatrix(); glMatrixMode (GL_MODELVIEW); glPushMatrix();

double fov, near, far; 
double headX, headY, headZ; 
float aspectRatio; 

near = 0.5f; far = 1000.0f; aspectRatio = ofGetWidth()/ofGetHeight(); 
fov = tan(DEG_TO_RAD * 30/2); //tan accepts angle in radians. tan of the half of the fov angle 
fov = 0.5; //taken constant for now 

double msX = (double)ofGetMouseX(); 
double msY = (double)ofGetMouseY(); 
double scrWidth = (double)ofGetWidth(); 
double scrHeight = (double)ofGetHeight(); 

headX = (msX/scrWidth) - 0.5; 
headY = ((scrHeight - msY)/scrHeight) - 0.5; 
headZ = -2.0; 

glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(near * (-fov * aspectRatio + headX), 
       near * (fov * aspectRatio + headX), 
       near * (-fov + headY), 
       near * (fov + headY), 
       near, 
       far); 

leftValue = near * (-fov * aspectRatio + headX); //for printing out on screen 
rightValue = near * (fov * aspectRatio + headX); //for printing out on screen 
bottomValue = near * (-fov + headY); //for printing out on screen 
topValue = near * (fov + headY); //for printing out on screen 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(headX * headZ, headY * headZ, 0, headX * headZ, headY * headZ, -1, 0, 1, 0); 
glTranslatef(0.0, 0.0, headZ); 
drawRoomWalls(); 


내가 leftValue, rightValue, bottomValue, topValue의 값을 인쇄 마우스가 화면의 중앙에있을 때 ( glFrustum에 대한 호출은 위의 호출 당으로 glFrustum(-0.25,0.25,-0.25,0.25,1.0,1000.0)
처럼 보이는, 내가 예상 좌표계의 left=-0.25, right=0.25, bottom=-0.25, top=0.25과 나는 벽이 사라질 것으로 기대했다. (예를 들어 (1.0,1.0,0.0)에서 그려지기 때문이다.) 그러나 벽은 화면의 측면에 계속 나타난다. (장면이 비뚤어지고 센터는 본질적으로 오프 액시스 프로젝션과 동일합니다.) 왜 벽은 여전히 ​​측면의 위치에 있습니다 (심지어 thoug h 좌표가 -0.25,0.25로 변경됨) 또는 glFrustum 호출에 좌표계에 대해 빠뜨린 점이 있습니까?

+0

값이 올바르지 않을 수 있습니다. 'left == bottom'과'right == top'은'aspectRatio = 1'을 의미합니다 ('headX'와'headY'는 0이므로). 'fov'를'0.5'로 설정합니다. 그것은''== 0.5''를 의미합니다. 그러나 '1'로 설정합니다. 예상보다 다른 값이 있어야합니다. 모든 변수에 올바른 값이 포함되어 있는지 확인하십시오. –

+0

@NicoSchertler : headX와 headY를 0으로 만들고 스크린 샷을 찍었습니다. -> http://i.imgur.com/dTjfazb.png 잘 보였습니다. 너비/높이의 나누기를 위해 두 배로 타입 캐스팅을하지 않았기 때문에 가로 세로 비율은 실제로 하나가되었습니다. 답변으로 추가 할 수 있습니까? 나는 그 의견에 몇 가지 후속 질문을하겠습니다. 감사합니다 – user1240679

+0

당신이 그 대답이라고 생각한다면, 그렇게 할 것입니다. –

답변

4

방금 ​​headZ-2으로 변경했음을 깨달았습니다. 그것은 행동을 설명합니다.

카메라가 z = 2에 있고 수직 반 fov가 0.5 인 경우 z = 0에 이미 1 단위가 양수 및 음수 y 방향으로 표시됩니다. 그것이 당신이 벽을 보는 이유입니다.

Visualization

+1

감사합니다! 그 그림 특히! – user1240679