2009-11-04 6 views
4

저는 한동안 게임 엔진에서 작업 해 왔습니다. 필자는 SDL만으로 2D 그래픽을 시작했지만 OpenGL을 사용하여 천천히 3D 기능으로 옮겨 가고 있습니다. 제가 사용하지 않은 GLUT를 사용하여 "일을 완수하는 방법"에 관해 본 문서 대부분을 사용합니다.OpenGL에서 카메라 설정

질문은 3D 환경을 돌아 다니면서 3D 모델과 스프라이트 (예 : 고정 위치와 회전이있는 스프라이트)를 올바르게 표시 할 수있는 OpenGL에서 "카메라"를 만드는 방법입니다. OpenGL 카메라에서 카메라를 설치하기 위해서는 어떤 기능을 사용해야하며 어떤 순서로 호출해야합니까?

여기 실제 카메라가 필요한 배경 정보가 있습니다.

간단한 스프라이트를 그리려면 SDL 표면에서 GL 텍스처를 만들고이를 (SpriteX-CameraX) 및 (SpriteY-CameraY)의 좌표로 화면에 그립니다. 이것은 정상적으로 작동하지만 실제 3D 모델로 이동하면 제대로 작동하지 않습니다. 카메라 위치는 X, Y, Z 정수 구성 요소를 사용하는 맞춤 벡터 클래스 (즉 표준 라이브러리를 사용하지 않는 클래스)입니다.

저는 삼각형으로 구성된 3D 큐브를 가지고 있으며 그 자체만으로도 그려서 회전 할 수 있습니다. 모델을 그릴 때 카메라 위치를 전달하여 큐브를 실제로 이동할 수 있습니다 (어색한 방식으로도). 위치 벡터의 해당 구성 요소를 사용하여 모델 위치를 계산합니다. 모델을 회전 시키려고 할 때이 접근법으로 문제가 분명해진다. 모델의 기원은 모델 자체가 아니며 화면의 원점 인 것으로 보입니다. 일부 인터넷 검색은 모델의 위치를 ​​저장하고 원본을 중심으로 회전 한 다음 원래 위치로 모델을 복원해야한다고 말합니다.

내 카메라의 위치를 ​​전달하고 새 정점을 계산하여 뷰포트에서 작업해야하는 위치를 계산하는 대신, 필자는이 작업을 위해 OpenGL "카메라"를 만들 것이라고 생각했습니다. do는 내 Camera 객체의 좌표를 OpenGL 카메라로 전달하면 뷰가 자동으로 변환됩니다. 이 작업은 GLUT를 사용하는 경우 매우 쉬울 것 같지만 OpenGL을 사용하여 카메라를 설정하는 방법을 잘 모르겠습니다.

편집 # 1 (일부 설명 후) : 몇 가지 제안 사항을 따르면 다음은 내 프로그램에서 호출되는 업데이트 방법입니다. Perspective와 View Matrix를 만들기 위해 업데이트되었습니다. 이 작업이 시작되기 전에 모든 도면이 발생합니다. OpenGL이 실행될 때 (버퍼 스왑을 뺀) 유사한 메소드 세트가 실행됩니다. x, y, z 좌표는 카메라의 인스턴스와 위치 벡터입니다. 카메라가 (256, 32, 0)이면 256, 32 및 0이 Update 메서드로 전달됩니다. 현재 z는 그 값을 변경할 수있는 방법이 없으므로 0으로 설정됩니다. 그려지는 3D 모델은 위치 X = 320, Y = 240, Z = -128에있는 정점/삼각형 + 법선 집합입니다. 프로그램이 실행될 때 이것은 FILL 모드로 그리고 나서 LINE 모드로 그리고 또 하나는 FILL after movement으로, 제가 카메라를 조금 오른쪽으로 움직일 때 그려집니다. 그것은 Normals가 원인일지도 모릅니다. 그러나 glFrustum의 NEAR 및 FAR 매개 변수가 실제로 무엇을하는지 완전히 이해하지 못하거나 무언가를 놓치고있는 것과 관련이 있다고 생각합니다.

이러한 변경을 구현하기 전에 glOrtho와 큐브를 올바르게 렌더링했습니다. 이제 glOrtho로 다시 전환하면 한면이 (녹색) 렌더링되고 회전은 매우 이상합니다. 아마도 아마도 번역 때문일 것입니다. 큐브는 각면에 하나씩 6 가지 색상이 있습니다. 빨강, 파랑, 녹색, 청록색, 흰색 및 자주색.

int VideoWindow::Update(double x, double y, double z) 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glFrustum(0.0f, GetWidth(), GetHeight(), 0.0f, 32.0f, 192.0f); 


    glMatrixMode(GL_MODELVIEW); 

    SDL_GL_SwapBuffers(); 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glRotatef(0, 1.0f, 0.0f, 0.0f); 
    glRotatef(0, 0.0f, 1.0f, 0.0f); 
    glRotatef(0, 0.0f, 0.0f, 1.0f); 
    glTranslated(-x, -y, 0); 

    return 0; 
} 

편집 FINAL : 문제는 근거리 및 glFrustum의 극동 인수 및 glTranslated의 Z 값에 문제가 밝혀졌다.값을 변경하면 고정되어 있지만 두 함수 간의 관계에 대해 더 자세히 알아야 할 것입니다.

답변

4

당신은 뷰 매트릭스와 프로젝션 매트릭스가 필요합니다. 당신은 한 두 가지 방법으로 수행 할 수 있습니다 glMatrixMode()glLoadMatrixf()를 사용하여

  1. 로드 매트릭스 자신을, 당신이 행렬을 계산하는 자신의 라이브러리를 사용 후. glMatrixMode(GL_MODELVIEW)glTranslate()/glRotate()

  2. 사용 조합 뷰 행렬을 작성하고, glFrustum()glMatrixMode(GL_PROJECTION)은 투영 행렬을 만들 수 있습니다. 기억하십시오 - 뷰 행렬은 카메라 위치의 음의 변환입니다 (세계을 카메라 원점을 기준으로 이동해야하는 위치이므로) 적용된 모든 회전 (피치/요)을 적용합니다.

희망이 있으면 도움이 될 것입니다.

+0

올바른 방향으로 밀어 주셔서 감사합니다. 내 코드와 스크린 샷을 살펴볼 수 있다면 해당 게시물을 편집했습니다. 뭔가 올바르게 맞지 않습니다 :) –

+0

실제로 문제는 glFrustum에 대한 Near 및 Far 인수와 glTranslated에 전달 된 Z 값을 선택하는 값입니다. 감사. –

2

당신은

, 객체 계층 구조로 행렬 스택을 사용하여 수행해야하지만 OpenGL을 만 매트릭스를 사용하기 때문에 개체를 그리기 전에 역 스택에 변환 넣어 그래서 카메라는 계층 구조 안에 3D에서 카메라로.

1

체크하지 않은 경우 다음 프로젝트에서 "tsalter"가 자신의 게시물에 쓴 내용을 자세히 설명해 줄 수 있습니다. OGL의 SDK (CodeColony)

이 또한보기에 대한 설명은 레드 책을보고 모델 - 뷰 및 프로젝션 매트릭스 당신이 카메라를 만드는 데 도움이됩니다 않는 방법에서

Camera

. 실제 카메라와 OpenGL API에 해당하는 것을 비교하여 시작합니다. Chapter 3 - Viewing