2011-10-14 4 views
2

이것은 아마도 매우 기본적인 질문 일 뿐이지 만 포인트 좌표계로 작업하기 위해 OpenGL을 사용할 수없는 것 같습니다. 대신에 퍼센트가있는 것처럼 보입니다. 예를 들어 .99 나를 화면의 가장자리에 놓습니다. 이게 그거야, 아니면 내가 뭔가 잘못하고있는거야? 감사! 사용OpenGL의 좌표계는 어떻게 작동합니까?

코드 :

#include <iostream> 
#include <stdlib.h> 
#include <GLUT/GLUT.h> 

void RenderScene() 
{ 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBegin(GL_POINTS); 

     glVertex3f(0, 0, 0); 

    glEnd(); 


    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv);     
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);   
    glutInitWindowSize(600, 600);   
    glutCreateWindow("OpenGL"); 
    glutDisplayFunc(RenderScene); 
    glutMainLoop(); 
    return 0; 
} 
+0

아마도 [이 질문에 대한 답변] (http://stackoverflow.com/q/7377912/743214)은 OpenGL의 변환 파이프 라인에 대한 통찰력을 제공 할 것입니다. –

답변

6

OpenGL은 다음과 같은 방식으로 작동합니다. 로컬 좌표계 (임의 단위)가 시작됩니다. 이 좌표계는 눈 공간 좌표로 modelview 행렬로 변환됩니다 (모델 및 행렬 변환을 결합하므로 modelview 행렬이라고 함).

시각 공간이 즉시 정규화 장치를 얻을 원근 제산 뒤에 투영 행렬로 클립 공간으로 변환된다

(NDC{x,y,z} = Clip{x,y,z}/Clip_w)를 조정한다. NDC의 [-1,1]^3 범위는 뷰포트 (x 및 y)와 설정된 깊이 범위 (z)에 매핑됩니다. 당신이 당신의 변환 행렬 (모델 뷰투사) ID를두면

그럼 실제로 범위는 [-1,1] 뷰포트에 매핑됩니다 좌표입니다. 그러나 apropriate 변환 및 투영을 선택하면 모델 스페이스 단위에서 뷰포트 단위로 임의로 매핑 할 수 있습니다.

+0

Clip {x, y, z}/Clip_w에 대해 확실합니까? 삼각형이 Z = 1000에 있으면 어떻게 될까요? 그들은 버려 졌습니까? 그것이 htat 다음에 클리핑되는 부분이 아닌가? –

+0

@IvanKuckir : OpenGL 사양은 균질 분할 전에 클리핑이 발생한다고 정의합니다. – datenwolf

1

정말 비율이 아니다 : 그것은 현재 뷰포트의 크기와 화면 비율에 관련이. 나는 그것에 대해 전체적인 이야기를 쓸 수는 있지만, 창 설정에 관해서는 lesson 1으로 시작하는 OpenGL의 NeHe's tutorials을 살펴 보시기 바랍니다. 매우 철저하고 강력하게 추천합니다.

1

프로젝션 매트릭스 개념이 누락되었습니다.

기본적으로 투영 매트릭스는 2D 공간에 정점을 투영하는 매트릭스입니다. 원근법과 정사영이라는 두 가지 투영 행렬이 있습니다.

현재 투영 매트릭스는 유효 꼭지점 스크린 위치를 결정합니다. 투영 행렬을 설정하지 않았으므로 기본 정사각형 인 수평 및 수직 범위 -1 .. +1을 사용합니다.

투영 행렬을 제어하려면 gluOrtho2D 함수를 참조하십시오. 필요한 모든 정보를 찾을 수 있습니다.