2016-11-22 9 views
-1

나는이 문제로 정말로 내 머리카락을 풀고있다. 저는 플레이어가 경기장 주변에서 공을 굴리는 간단한 게임을 만들려고합니다.OpenGL + GLU + C++ 무언가를 그려서는 안된다

저는 윈도우 관리 및 입력 처리를 위해 WinAPI를 사용하고 있습니다.

GLU 영역 대신 간단한 쿼드도 렌더링하려고했지만 그 중 하나도 작동하지 않았습니다.

다른 클래스에서 코드를 구분했습니다. 아래에 관련 코드를 제시합니다. 이 코드는 내의 WinMain에 있습니다

while (running) { 

    PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE); 

    if (msg.message == WM_QUIT) 
     running = false; 

    else { 

     // handle key presses 

     // update 
     gameWorld->update(getDirections()); 

     // render 
     gameWorld->render(deviceContext); 

     // I added this block of code for testing, still does not work 
     glColor4f(1, 1, 1, 1); 
     glBegin(GL_QUADS); 
     glVertex3f(10, 10, 0); 
     glVertex3f(10, -10, 0); 
     glVertex3f(-10, -10, 0); 
     glVertex3f(-10, 10, 0); 
     glEnd(); 

     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

여기 GameWorld.cpp입니다 :

GameWorld::GameWorld() 
{ 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    this->ball = new Ball(1, 10, 10); 
    this->camera = new Camera(ball); 
} 

GameWorld::~GameWorld() 
{ 
    delete this->ball; 
} 

void GameWorld::render(HDC deviceContext) { 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    this->ball->draw(); 

    SwapBuffers(deviceContext); 
} 

void GameWorld::update(Directions dirs) { 

    glLoadIdentity(); 

    this->ball->handleInput(dirs); 
    this->ball->update(); 

    this->camera->update(); 
} 

여기에 카메라를 update 방법입니다 :

void Camera::update() { 

    GLdouble ballX = ball->getLocation()->getX(); 
    GLdouble ballY = ball->getLocation()->getY(); 
    GLdouble ballZ = ball->getLocation()->getZ(); 

    GLdouble x = ballX + cos(90) * this->distanceFromBall; 
    GLdouble y = ballY + cos(90) * this->distanceFromBall; 
    GLdouble z = ballZ + cos(90) * this->distanceFromBall; 

    gluLookAt(
     x, y, z, 
     ballX, ballY, ballZ, 
     0, 1, 0 
    ); 
} 

여기에서 볼 draw 방법입니다 :

void Ball::draw() { 

    glPushMatrix(); 
    this->quadric = gluNewQuadric(); 

    glTranslated(this->location->getX(), this->location->getY(), this->location->getZ()); 

    gluQuadricDrawStyle(this->quadric, GLU_FILL); 
    glColor4f(1, 1, 1, 1); 

    gluSphere(this->quadric, this->radius, this->slices, this->stacks); 
    gluDeleteQuadric(this->quadric); 

    glPopMatrix(); 
} 

#! @ %가이 코드에 무슨 문제가 있습니까? 나는이 일을 일주일에 끝내야한다. 그래서 나는 정말로 도움을받을 수있다 ...

답변

0

나는이 작업을하기 위해 gluPerspective() 함수를 사용해야했다. 내 GameWorld 생성자는 이제 다음과 같습니다

GameWorld::GameWorld() 
{ 
    glViewport(0, 0, WIDTH, HEIGHT);  // reset the viewport to new dimensions 
    glMatrixMode(GL_PROJECTION);   // set projection matrix current matrix 
    glLoadIdentity();      // reset projection matrix 

              // calculate aspect ratio of window 
    gluPerspective(54.0f, (GLfloat)WIDTH/(GLfloat)HEIGHT, 1.0f, 1000.0f); 

    glMatrixMode(GL_MODELVIEW);    // set modelview matrix 
    glLoadIdentity(); 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    this->ball = new Ball(1, 20, 20); 
    this->camera = new Camera(ball); 
} 

코드는 데이브 Astle의 책 "의 OpenGL 게임 프로그래밍"의 샘플 코드에서 복사됩니다.