2016-06-24 13 views
1

유전자 변형 파리에 간단한 그림이 표시되는 실험 설정을 다루고 있습니다. 그 그림은 그 비행 거리와 일정한 거리를두고 화면에 투사됩니다.OpenGL Perspective 보정을 설정하는 방법은 무엇입니까?

이제 원근감 교정을 설정하여 표시되는 이미지 (예 : 가로 막 대형 막대)가 파리의 시점 (experimental setup)에서 먼 거리에 더 넓게 보입니다. 코드는 이제 다음과 같습니다

glMatrixMode(GL_PROJECTION);       
glLoadIdentity(); 

if(!USEFRUSTUM) 
    gluPerspective(90.0f, 2 * width/height, 0.1f, 100.0f); 
else 
    glFrustum(92.3f, 2.3f, -25.0f, 65.0f, 50.0f, 1000.0f); 

값은 몇 년 전에 누군가가 입력 한 우리는 더 이상 정확하지 않습니다 파악되었다. 그러나 실험 설정에서 볼 수 있듯이 파리의 시야가 약간 기울어 져 있기 때문에 어떤 값을 입력하거나 변경하여 투영이 제대로 작동하는지 혼란 스럽습니다. 프로젝션 스크린

  • 하지만 zNear 무엇에

    • fovy = 각도 A와 C 사이
    • 측정 폭과 높이

      I는 그 값에 대한 생각? 비행 거리에서 화면의 상단 또는 하단까지의 거리를 측정해야합니까? 나는 누군가가 0.1f를 입력 한 이유를 알지 못한다.

    • zFar의 가치를 어떻게 알 수 있습니까? 그것은 비행 거리에있는 물체의 최대 거리입니까?

  • 나는에서 glPerspective에 내 정보를 가지고 : https://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 는 또한 Simplest way to set up a 3D OpenGL perspective projection을 확인하지만,이 게시물에 내 혼란의 근원 내 실험 장치를 취급하지 않습니다.

    도움 주셔서 감사합니다.

    답변

    0

    frustum 방법이 원근법보다 사용하기 쉬운 주요 사례 중 하나입니다. 절두체는 본질적으로 잘려진 피라미드입니다. 4 면체의 기울어 진 피라미드의 끝에서 당신의 파리를 상상해보십시오. 가까운 값은 피라미드베이스까지의 거리를 제공하고 왼쪽, 오른쪽, 아래쪽 및 위쪽은 피라미드베이스의 각면과 팁 사이의 수직 거리입니다. 팁이 기본 영역의 "외부"에 있다는 것은 매우 합리적입니다. 또는 비행편의 경우 센터가 "왼쪽"가장자리 바로 위에있을 수 있습니다.

    fly frustum

    "근처는"(왼쪽 물론 또한 상단, 하단 등) 영사 화면의 오른쪽에있는 "거리"를 제공하는 각각의 거리 :

    그래서 원래의 사진을 가정하고 우리는이 팁의 틀린 부분은 화면 가장자리에 수직으로 날아갑니다.

    "멀리"는 투영 피처에 중요하지 않으며 깊이 범위를 결정하기 위해서만 사용됩니다.

    double near = ${distance to screen in mm}; 
    double left = ${perpendicular to left screen edge in mm}; 
    double right = ${perpendicular to right screen edge in mm}; 
    double top = ${perpendicular to top screen edge in mm}; 
    double bottom = ${perpendicular to bottom screen edge in mm}; 
    double s = ${scaling factor from mm into OpenGL units}; 
    double zrange = ${depth range in OpenGL units the far plane is behind near}; 
    glFrustum(s*left, s*right, s*bottom, s*top, s*near, s*near + zrange); 
    

    오른쪽 상단과 하단이 음수가 될 수있다, 왼쪽 유의 사항 :

    그래서 당신은 무엇으로 프로그램 할 수 있습니다하면 다음과 같다. 한쪽 방향으로 대칭 (비 변이) 뷰를 원한다고 말하면, left = -bottom이고 교대는 본질적으로 두 오프셋에 모두 더하기/빼기입니다.

    +0

    안녕하세요 datenwolf! 대답 해 주셔서 감사합니다.이제는 근거리, 좌, 우로 측정하는 방법과 내 경우의 절두체가 어떻게 보이는지 이해했습니다. 제가 아직 이해하지 못하는 것은 스케일링 인자를 결정하는 방법입니다. "OpenGL Programming Guide : 공식 OpenGL 학습 안내서, 버전 3"(Google 도서)을 읽었습니다. 측정 값이 일관성있는 단위를 사용하는 한, 크기를 조정하지 않은 채로 둘 수 있습니다. 깊이 범위는 파리의 시야 깊이에 따라 달라질 수 있습니까? 내 동료들과 적절한 가치에 대해 토론 할 수 있다고 생각합니다. – TheCooocy

    +0

    @TheCooocy : 예, OpenGL로 그리는 모든 지오메트리가 일관성이 있다면 's'(즉 s = 1)를 완전히 생략 할 수 있습니다. 물리적 인 동물 (동물)과 상호 작용하기 때문에 "외부"투영 시스템이 측정되는 것과 동일한 물리적 단위로 OpenGL을 사용하여 그릴 형상을 정의하는 것이 좋습니다. * 거리는 실제 화면까지의 거리가 아니어야합니다 (파리의 눈앞에서 작은 화면을 이미징). 그러나 설정에 물리적 제약이 있다면 큰 화면을 사용해야합니다. – datenwolf

    +0

    @TheCooocy : 그렇다면 당신이하는 것은 "가상"근거리 거리'n_'과 실제 스크린 거리'n' 사이의 비율을 취하고, 왼쪽, 오른쪽, 아래쪽, 위, 그리고 가까운 것을 비율 'n_/n' '. 만약 여러분이 모든 일을하고 있다면, 말하자면, * mm * 단위는 멀리있는 물체들이 (갑자기) 사라지는 절단 거리가 될 것입니다. 깊이 버퍼 해상도와 관련된 실용적인 이유 때문에 * far * 값을 작게 선택하고 * near * 값을 가능한 한 작게 선택하여 그려야 할 형상을 수용해야합니다. – datenwolf