2009-08-06 10 views
1

私は、Ubuntu上でOpenGLプログラミングを実験するためのコードを書いていますが、それは少しですが、私はCの合理的な理解を持っていました。C++は私が開発しようとしているゲームプログラミングの言語ですそれと。LinuxでSDL OpenGLを初めて使用しましたが、これには何が問題なのですか?

これは私の最初の実際の試みで、sdlでopenglを実行しています。これまでのところコンパイルして実行していますが、カメラ機能は何もしないようです。私はこのようなことをやるより良い方法がたくさんあることは知っていますが、私はより高度なものに移行する前に基本を知りたいと思っていました。

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; 
} 

Makefileの

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

それは私が、私はちょうどカメラの翻訳を行うといくつかの助けを必要と推測し、コンパイルし、実行します。ありがとう

答えて

1

DrawCube()からglLoadIdentity()を削除します。最初にglPushMatrix()に、最後にglPopMatrix()に置き換えます。今すぐ 'w'を押すと何かができます。 (私はそれが何をすべきか完全にはわかっていません)

問題は、glLoadIdentityはglTranslatefなどで設定された以前のすべての変換をクリアすることです。詳細な説明:http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushmatrix.html

0

キューブを描画する前にカメラをレンダリングしてみてください。現在、カメラの翻訳はうまくいきますが、カメラと同じ位置に立方体を描いています。キューブを先に描いてからカメラを動かすと、予想通りの翻訳が見えます。

関連する問題