2014-12-18 2 views
3

바로 그 지점으로갑니다. 나는 이미 약간의 reasearch를했고 아직도 나는 이것을 알아 내지 못했다.Orthographic Projection의 최신 OpenGL 문제

각 얼굴에 색상을 사용하여 입방체를 그려주는 프로그램이 있습니다. 그런 다음이 큐브를 Y 축과 X 축 (각각 -45와 +45)으로 회전시킵니다.

문제는 내가 기대했던대로 렌더링되지 않는다는 것입니다. 큐브가 어느 시점에서 잘려나 가고 있습니다.

코드 : 나는 정의하고

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f); 

camera = glm::lookAt(
        glm::vec3(+0.0f,+0.0f,+1.0f), 
        glm::vec3(0.0f,0.0f,0.0f), 
        glm::vec3(0.0f,1.0f,0.0f) 
        ); 

model = glm::mat4(1.0f); 
model = glm::rotate(model, -45.0f, glm::vec3(0.0f, 1.0f, 0.0f)); 
model = glm::rotate(model, +45.0f, glm::vec3(1.0f, 0.0f, 0.0f)); 

mvp = projection * camera * model; 

Cube rendered clipped

모든 정점 ± 0.25로 만들어집니다. 그래서 난 아직도 볼륨에 딱 맞는 zNear 및 zFar 그들이 내이 값을 적어도 그 생각,하지만 난

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +2.0f, -1.0f); 

의 라인

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f); 

을 변경할 때 그것은 잘 작동

Correct rendered

그러나

작동하지 않습니다

누군가 내게 이유를 설명 할 수 있습니까? 나는 더 많은 값을 넣으면 프로젝션 큐브의 볼륨이 커지므로 잘 렌더링된다는 것을 알고 있습니다. 나도 알다시피 오른쪽 하단 정점은 zNear와 zFar가 +1.0과 -1.0 (꼭지점 값은 행렬의 적용 후에 1.76과 비슷합니다.)이지만 zFar 큐브를 -2.0f로 확장하면 큐브 밖에 있습니다. 그렇지?

레드 북과 Peter Shirley의 컴퓨터 그래픽 기초 자료를 읽으려고했습니다. 심지어 매트릭스를 혼자서 만들었지 만 동일한 결과를 보았습니다.

어쨌든 미리 감사드립니다.

답변

4

무슨 일이 일어나고 있는지, 큐브가 카메라의 원거리 클립면에 의해 잘린 것입니다.

멀리있는 클립 평면을 벗어나는 부분은 렌더링되지 않습니다.

원본 코드에서 원거리 클립 평면은 카메라에 매우 근접한 +1로 설정됩니다. 1 단위를 초과하는 것은 렌더링되지 않습니다.

작업 코드에서 먼 쪽 평면을 +2로 설정하면 2 단위를 초과하는 부분은 렌더링되지 않습니다.

큐브가 카메라에 2 단위 가까이 있기 때문에 전체 큐브가 렌더링됩니다.

+0

답장을 보내 주셔서 감사합니다! 그러나 나는 가까운 비행기가'ortho (T const & left, T const & right, T const & bottom, T const & top, T const & zNear, T const & zFar)라고 생각했습니다. ' 멀리 평면 -2 시도하고 볼 수, 정점에 대한 매트릭스의 계산에 의해 왼쪽 하단 정점에서 Z 구성 요소는 +0.25에서 -1.75갑니다. 그래서 저는 그것이 먼 비행기에 의해 잘리고 있다는 것을 이해합니다. 그러나 멀리 비행기를 -2에 댈 때 그것은 여전히 ​​발생합니다. –

+1

원거리 평면의 목적은 카메라가 렌더링 할 수있는 가장 먼 거리를 정의하는 것입니다. -2로 설정하면 멀리있는 비행기가 카메라 뒤에있을뿐만 아니라 가까운 비행기 뒤쪽에있게됩니다 (일반적으로 원하는 것은 아닙니다). 대신에 원하는 것은 가까운 평면보다 큰 양의 값을 가진 먼 평면입니다. 예를 들어, 나는 보통 0.01의 근사 평면과 100의 원 평면을가집니다. –

+0

아마도, 나는 멀리 평면이 어디에 있는지 오해하고 있습니다. 왜냐하면 카메라를 (0,0,1)에 놓고 보면 (0,0,0)은 가까운 평면을 아주 가깝게 만들고 멀리있는 평면을 카메라 뒤에서 볼 수 있지만 여전히 카메라로 볼 수 있다고 생각했기 때문입니다. 그래서 가까운 값을 0.01로 설정하고 100으로 설정하면이 두 값 사이의 모든 정점 구성 요소를 올바르게 정의해야합니다. –

1

일반적으로 근거리 평면이 원거리 평면 앞에 오길 원합니다. 어떤 이유에서든 먼 비행기가 부정적으로되고 가까운 비행기가 긍정적 인 경우 어떻게 될지 잘 모르겠다.

+0

내가 아는 한 가까운 비행기는 + 1.0f이고 먼 비행기는 -1.0f입니다. 그래서 카메라를 0,0,1 위치에두면 가까운 곳이 먼 곳으로 오게됩니다. 아니면 내가 풀 타르트로 갔습니까? –

+1

근거리/원거리 값은 카메라, IIRC를 기준으로하므로 음수가 카메라 뒤에 있고 양수가 앞으로 표시됩니다. –

+0

예! 당신은 정확합니다, 대단히 감사합니다! –