원근 투영에 glFrustum
을 사용하려고합니다. glFrustum
은 glOrtho
과 같이 실제 좌표계와 실제 화면 좌표 (파란색 책에서 읽음)의 매핑을 수정하는 데 사용할 수 있습니다. 따라서 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 호출에 좌표계에 대해 빠뜨린 점이 있습니까?
값이 올바르지 않을 수 있습니다. 'left == bottom'과'right == top'은'aspectRatio = 1'을 의미합니다 ('headX'와'headY'는 0이므로). 'fov'를'0.5'로 설정합니다. 그것은''== 0.5''를 의미합니다. 그러나 '1'로 설정합니다. 예상보다 다른 값이 있어야합니다. 모든 변수에 올바른 값이 포함되어 있는지 확인하십시오. –
@NicoSchertler : headX와 headY를 0으로 만들고 스크린 샷을 찍었습니다. -> http://i.imgur.com/dTjfazb.png 잘 보였습니다. 너비/높이의 나누기를 위해 두 배로 타입 캐스팅을하지 않았기 때문에 가로 세로 비율은 실제로 하나가되었습니다. 답변으로 추가 할 수 있습니까? 나는 그 의견에 몇 가지 후속 질문을하겠습니다. 감사합니다 – user1240679
당신이 그 대답이라고 생각한다면, 그렇게 할 것입니다. –