2009-08-06 2 views
1

우분투에서 OpenGL 프로그래밍을 실험하기위한 코드를 작성했습니다. 조금만 지나쳤지만 C를 합리적으로 이해하는 데 익숙했습니다. C++은 내가 개발하려고하는 프로그래밍 언어에 대한 언어입니다. 그것으로.Linux에서 SDL OpenGL을 처음 사용하는 경우이 문제가 무엇입니까?

이것은 OpenGL에서 sdl로 시도한 첫 번째 시도이며, 지금까지 컴파일하고 실행했지만 카메라 기능은 아무 것도하지 않는 것 같습니다. 이런 종류의 일을하는 데 더 좋은 방법이 많이 있다는 것을 알고 있습니다. 그러나 더 고급스럽고 진보적 인 것들로 넘어 가기 전에 기본을 배우고 싶었습니다.

MAIN.CPP

#include <iostream> 
#include <cmath> 
#include "SDL/SDL.h" 
#include "SDL/SDL_opengl.h" 

int screen_width = 640; 
int screen_height = 480; 
const int screen_bpp = 32; 
float rotqube = 0.9f; 

float xpos = 0, ypos = 0, zpos = 0, xrot = 0, yrot = 0, angle=0.0; 
float lastx, lasty; 

SDL_Surface *screen = NULL; // create a default sdl_surface to render our opengl to 

void camera (void) { 
glRotatef(xrot,1.0,0.0,0.0); // x-axis (left and right) 
glRotatef(yrot,0.0,1.0,0.0); // y-axis (up and down) 
glTranslated(-xpos,-ypos,-zpos); // translate the screen to the position 
SDL_GL_SwapBuffers(); 
} 

int DrawCube(void) 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 

glTranslatef(0.0f, 0.0f,-7.0f); 
glRotatef(rotqube,0.0f,1.0f,0.0f); 
glRotatef(rotqube,1.0f,1.0f,1.0f); 
glBegin(GL_QUADS); 
    glColor3f(0.0f,1.0f,0.0f); 
    glVertex3f(1.0f, 1.0f,-1.0f); 
    glVertex3f(-1.0f, 1.0f,-1.0f); 
    glVertex3f(-1.0f, 1.0f, 1.0f); 
    glVertex3f(1.0f, 1.0f, 1.0f); 
    glColor3f(1.0f,0.5f,0.0f); 
    glVertex3f(1.0f,-1.0f, 1.0f); 
    glVertex3f(-1.0f,-1.0f, 1.0f); 
    glVertex3f(-1.0f,-1.0f,-1.0f); 
    glVertex3f(1.0f,-1.0f,-1.0f); 
    glColor3f(1.0f,0.0f,0.0f); 
    glVertex3f(1.0f, 1.0f, 1.0f); 
    glVertex3f(-1.0f, 1.0f, 1.0f); 
    glVertex3f(-1.0f,-1.0f, 1.0f); 
    glVertex3f(1.0f,-1.0f, 1.0f); 
    glColor3f(1.0f,1.0f,0.0f); 
    glVertex3f(1.0f,-1.0f,-1.0f); 
    glVertex3f(-1.0f,-1.0f,-1.0f); 
    glVertex3f(-1.0f, 1.0f,-1.0f); 
    glVertex3f(1.0f, 1.0f,-1.0f); 
    glColor3f(0.0f,0.0f,1.0f); 
    glVertex3f(-1.0f, 1.0f, 1.0f); 
    glVertex3f(-1.0f, 1.0f,-1.0f); 
    glVertex3f(-1.0f,-1.0f,-1.0f); 
    glVertex3f(-1.0f,-1.0f, 1.0f); 
    glColor3f(1.0f,0.0f,1.0f); 
    glVertex3f(1.0f, 1.0f,-1.0f); 
    glVertex3f(1.0f, 1.0f, 1.0f); 
    glVertex3f(1.0f,-1.0f, 1.0f); 
    glVertex3f(1.0f,-1.0f,-1.0f); 
glEnd(); 
SDL_GL_SwapBuffers(); 

rotqube +=0.9f; 
return true; 
} 

bool init_sdl(void) 
{ 
if(SDL_Init(SDL_INIT_EVERYTHING) != 0) 
{ 
    return false; 
} 

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); 
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); 
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); 
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 

// TODO: Add error check to this screen surface init 
screen = SDL_SetVideoMode(screen_width, screen_height, screen_bpp, SDL_OPENGL | SDL_HWSURFACE | SDL_RESIZABLE); 

return true; 
} 

static void init_opengl() 
{ 
float aspect = (float)screen_width/(float)screen_height; 
glViewport(0, 0, screen_width, screen_height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(60.0, aspect, 0.1, 100.0); 
glMatrixMode(GL_MODELVIEW); 
glClearColor(0.0, 0.0 ,0.0, 0); 
glEnable(GL_DEPTH_TEST); 
} 

void heartbeat() 
{ 
float xrotrad, yrotrad; 
int diffx, diffy; 

SDL_Event event; 

while(1) 
{ 
    while(SDL_PollEvent(&event)) 
    { 
     switch(event.type) 
     { 
      case SDL_KEYDOWN: 
       switch(event.key.keysym.sym) 
       { 
        case SDLK_ESCAPE: 
         exit(0); 
         break; 
        case SDLK_w: 
         yrotrad = (yrot/180 * 3.141592654f); 
         xrotrad = (xrot/180 * 3.141592654f); 
         xpos += (float)sin(yrotrad); 
         zpos -= (float)cos(yrotrad); 
         ypos -= (float)sin(xrotrad); 
         std::cout << "w pressed" << std::endl; 
         break; 
        case SDLK_s: 
         yrotrad = (yrot/180 * 3.141592654f); 
         xrotrad = (xrot/180 * 3.141592654f); 
         xpos -= (float)sin(yrotrad); 
         zpos += (float)cos(yrotrad); 
         ypos += (float)sin(xrotrad); 
         break; 
        case SDLK_d: 
         yrotrad = (yrot/180 * 3.141592654f); 
         xpos += (float)cos(yrotrad) * 0.2; 
         zpos += (float)sin(yrotrad) * 0.2; 
          break; 
         case SDLK_a: 
         yrotrad = (yrot/180 * 3.141592654f); 
         xpos -= (float)cos(yrotrad) * 0.2; 
         zpos -= (float)sin(yrotrad) * 0.2; 
          break; 
        default: 
         break; 
       } 
       break; 

      case SDL_MOUSEMOTION: 
       diffx=event.motion.x-lastx; //check the difference between the current x and the last x position 
       diffy=event.motion.y-lasty; //check the difference between the current y and the last y position 
       lastx=event.motion.x; //set lastx to the current x position 
       lasty=event.motion.y; //set lasty to the current y position 
       xrot += (float)diffy; //set the xrot to xrot with the addition of the difference in the y position 
       yrot += (float)diffx; //set the xrot to yrot with the addition of the difference in the x position 
       break; 

      case SDL_QUIT: 
       exit(0); 
       break; 

      case SDL_VIDEORESIZE: 
       screen = SDL_SetVideoMode(event.resize.w, event.resize.h, screen_bpp, SDL_OPENGL | SDL_HWSURFACE | SDL_RESIZABLE); 
       screen_width = event.resize.w; 
       screen_height = event.resize.h; 
       init_opengl(); 
       std::cout << "Resized to width: " << event.resize.w << " height: " << event.resize.h << std::endl; 
       break; 

      default: 
       break; 
     } 
    } 

    DrawCube(); 
    camera(); 

    SDL_Delay(50); 
} 
} 

int main(int argc, char* argv[]) 
{ 
if(init_sdl() != false) 
{ 
    std::cout << "SDL Init Successful" << std::endl; 
} 

init_opengl(); 

std::cout << "Hello World" << std::endl; 

heartbeat(); // this is essentially the main loop 

SDL_Quit(); 

return 0; 
} 

메이크

all: 
g++ -o test main.cpp -lSDL -lGL -lGLU 

그것은 컴파일 및 실행, 나는 그냥 카메라 번역을하고 몇 가지 도움이 필요 같아요. 감사합니다.

답변

0

큐브를 그리기 전에 카메라를 렌더링 해보십시오. 현재 카메라 번역은 잘 작동하지만 카메라와 동일한 위치에 큐브를 그립니다. 입방체를 먼저 그린 다음 카메라를 움직이면 예상했던 번역이 보입니다.

관련 문제