2013-01-24 3 views
2

좌표계의 축을 내 장면으로 렌더링하려고 할 때 현재 일부 문제가 있습니다. 이러한 축의 경우 3D 큐브의 중심을 지나는 3 개의 직선을 그립니다. 문제가 무엇인지 설명하는 것은 꽤 힘듭니다. 따라서 사진을 게시하는 가장 시범적인 방법은 사진을 게시하는 것입니다.Perspective OpenGL의 3D 좌표계 문제

전체 장면 1)보기 : click here

2) 좌표계의 원점에보기 확대 : 나는 더 작은 조금 확대하면 click here

3)의 두 축이 사라지고 어떤 이유로 인해 다른 축이 이동 한 것으로 보입니다. click here

왜 이런 일이 발생하며 어떻게 방지 할 수 있습니까?

내 모델 뷰 및 프로젝션 행렬은 다음과 같은 모양 "클리핑"라고

// Set ProjectionMatrix 
projectionMatrix = glm::perspective(90.0f, (GLfloat)width/(GLfloat) height, 0.0001f, 1000.f); 
glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO); 
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projectionMatrix)); 
glBindBuffer(GL_UNIFORM_BUFFER, 0); 

// Set ModelViewMatrix 
glm::mat4 identity  = glm::mat4(1.0); // Start with the identity as the transformation matrix 
glm::mat4 pointTranslateZ = glm::translate(identity, glm::vec3(0.0f, 0.0f, -translate_z)); // Zoom in or out by translating in z-direction based on user input 
glm::mat4 viewRotateX  = glm::rotate(pointTranslateZ, rotate_x, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the whole szene in x-direction based on user input 
glm::mat4 viewRotateY  = glm::rotate(viewRotateX, rotate_y, glm::vec3(0.0f, 1.0f, 0.0f)); // Rotate the whole szene in y-direction based on user input 
glm::mat4 pointRotateX = glm::rotate(viewRotateY, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the camera by 90 degrees in negative x-direction to get a frontal look on the szene 
glm::mat4 viewTranslate = glm::translate(pointRotateX, glm::vec3(-dimensionX/2.0f, -dimensionY/2.0f, -dimensionZ/2.0f)); // Translate the origin to be the center of the cube 
+2

Frustrum culling? – Alexander

+0

2 축이 사라지는 이유를 설명하겠습니까? 하지만 왜 조금 더 확대해도 세 번째 이미지의 다른 이미지가 완전히 왜곡 된 이유는 무엇입니까? – Schnigges

+1

어쩌면 그것의 일부가 렌더링되고 당신은 친밀감 때문에 부자연 스럽다고 생각할 수 있습니다. – Alexander

답변

2

. 축이 클립 근처의 평면에 닿아 서 클리핑됩니다. 세 번째 축은 "대체"되지 않습니다. 단순히 부분적으로 잘립니다. 두 번째 이미지를 가져 와서 대부분을 덮어서 대각선 축의 일부만 볼 수 있도록하십시오. 그것이 당신이 얻는 것입니다.

여기에는 몇 가지 일반적인 해결책이 있습니다. 첫째, 사용자가 멀리까지 확대 할 수 없도록 할 수 있습니다. 또는 카메라가 대상 객체에 더 가까이 이동하면 니어 클립면을 안쪽으로 조정할 수 있습니다. 이렇게하면 멀리있는 물체에 정밀도 문제가 발생할 수 있으므로 원거리 클립 면도 안쪽으로 조정해야합니다.

또는 깊이 클램핑을 켜기 만 할 수도 있습니다 (GL 3.x +가 있다고 가정하거나 ARB_depth_clamp 또는 NV_depth_clamp에 액세스). 이것은 완벽한 해결책이 아닙니다. 카메라를 뒤집어 놓았을 때 물건이 잘릴 수 있기 때문입니다. 그리고 두 개의 객체가 겹쳐지면 가까운 클립 평면과 교차하는 객체는 더 이상 적절한 깊이 버퍼링을 갖지 않습니다. 그러나 일반적으로 충분합니다.