10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180

opengl SDL

21.07.2010, 14:11. Показов 3431. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как сделать чтоб треугольник двигался по нажаатию клавиши (стрелка вверх) в том напрявлении в котором направлена его вершина?
вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#if defined(__APPLE__) && defined(__MACH__)
#include <OpenGL/gl.h>  // Header File For The OpenGL32 Library
#include <OpenGL/glu.h> // Header File For The GLu32 Library
#else
#include <GL/gl.h>      // Header File For The OpenGL32 Library
#include <GL/glu.h>     // Header File For The GLu32 Library
#endif
#include "SDL.h"
 
/* rotation angle for the triangle. */
float rtri = 0.0f;
 
/* rotation angle for the quadrilateral. */
float rquad = 0.0f;
 
/* A general OpenGL initialization function.  Sets all of the initial parameters. */
void InitGL(int Width, int Height)              // We call this right after our OpenGL window is created.
{
  glViewport(0, 0, Width, Height);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);         // This Will Clear The Background Color To Black
  glClearDepth(1.0);                            // Enables Clearing Of The Depth Buffer
  glDepthFunc(GL_LESS);                         // The Type Of Depth Test To Do
  glEnable(GL_DEPTH_TEST);                      // Enables Depth Testing
  glShadeModel(GL_SMOOTH);                      // Enables Smooth Color Shading
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();                             // Reset The Projection Matrix
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);     // Calculate The Aspect Ratio Of The Window
 
  glMatrixMode(GL_MODELVIEW);
}
 
/* The main drawing function. */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);           // Clear The Screen And The Depth Buffer
  glLoadIdentity();                             // Reset The View
 
  glTranslatef(-1.5f,0.0f,-6.0f);               // Move Left 1.5 Units And Into The Screen 6.0
        
  glRotatef(rtri,0.0f,1.0f,0.0f);               // Rotate The Triangle On The Y axis 
  // draw a triangle (in smooth coloring mode)
  glBegin(GL_POLYGON);                          // start drawing a polygon
  glColor3f(1.0f,0.0f,0.0f);                    // Set The Color To Red
  glVertex3f( 0.0f, 1.0f, 0.0f);                // Top
  glColor3f(0.0f,1.0f,0.0f);                    // Set The Color To Green
  glVertex3f( 1.0f,-1.0f, 0.0f);                // Bottom Right
  glColor3f(0.0f,0.0f,1.0f);                    // Set The Color To Blue
  glVertex3f(-1.0f,-1.0f, 0.0f);                // Bottom Left  
  glEnd();                                      // we're done with the polygon (smooth color interpolation)
 
                        
 
  rtri+=15.0f;                                  // Increase The Rotation Variable For The Triangle
  r                                     // Decrease The Rotation Variable For The Quad 
 
  // swap buffers to display, since we're double buffered.
  SDL_GL_SwapBuffers();
}
 
int main(int argc, char **argv) 
{  
  int done;
 
  /* Initialize SDL for video output */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    exit(1);
  }
 
  /* Create a 640x480 OpenGL screen */
  if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL ) {
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError());
    SDL_Quit();
    exit(2);
  }
 
  /* Set the title bar in environments that support it */
  SDL_WM_SetCaption("FrosT", NULL);
 
  /* Loop, drawing and checking events */
  InitGL(640, 480);
  done = 0;
  while ( ! done ) {
    DrawGLScene();
 
    /* This could go in a separate function */
    { SDL_Event event;
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
          if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          }
        }
      }
    }
  }
  SDL_Quit();
  return 1;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.07.2010, 14:11
Ответы с готовыми решениями:

OpenGL - инициализация SDL
Возникла проблема при подключении SDL я делал как описано в уроках пошагово но вот возникает ошибка при подключении SDL.h не понимаю...

FTGL + SDL + OpenGL
Прелюдия. Пишу в Code::Blocks, компилятор MinGW. Раньше использовал GLUT, но решил попробовать пересесть под SDL. Собрал с помощью MSYS...

SDL openGL Вращение фигуры
Народ помогите. Нужно сделать так чтоб фигура вращалась при нажатии клавиш (стрелок) Вот код #ifdef WIN32 #define...

22
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 06:39
Во-первый нужно хранить вектор, который соответствует направлению, в котором смотрит треуголник:
C++
1
float fwd[] = {0.0f, 1.0f, 0.0f};
Во-втроых нужно хранить позицию треуголника:
C++
1
float pos[] = {0.0f, 0.0f, 0.0f};
По нажатию 'вперед' нужно прибавлять к позиции вектор, сонаправленный с fwd:
C++
1
2
3
4
5
float step = 0.1f;
for (int i = 0; i < 3; i++) 
{
    pos[i]+= fwd[i] * step;
}
Для 'назад' заменить pos[i]+= fwd[i] * step на pos[i]-= fwd[i] * step

По нажатию 'влево' нужно поворачивать fwd:
C++
1
2
3
4
5
const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
float phi = 3.0f; //шаг поворота
rtri += phi;
fwd[0] = cos(rtri * radindeg);
fwd[1] = sin(rtri * radindeg);
Для 'вправо' rtri += phi заменить на rtri -= phi

В процедуре рендера заменить
C++
1
 glRotatef(rtri,0.0f,1.0f,0.0f);               // Rotate The Triangle On The Y axis
на
C++
1
2
glRotatef(rtri,0.0f,0.0f,1.0f);
glTranslatef(pos[0], pos[1], pos[2]);
Значения step и phi еще придется подобрать более удачные
1
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 11:56  [ТС]
ага....спасибо попробую разобратсо

Добавлено через 1 час 39 минут
Вобщем я сделал всё так как ты написал но теперь у меня неотображается треугольник.
Глянь плиз я всё правильно сделал?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <windows.h>
#include <glut.h>
#include "glut.h"   
#include "SDL.h"
#include "math.h"
 
/* вращение англе триугольника */
float rtri = 0.0f;
 
 
 
 
/* главные инициальзирующие функции */
void InitGL(int Width, int Height)          // создание окна
{
  glViewport(0, 0, Width, Height);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);     // очистка фона окна и изменение цвета на чёрный
  glClearDepth(1.0);                // отчистка Depht буфера
  glDepthFunc(GL_LESS);             // задаётся функция depht
  glEnable(GL_DEPTH_TEST);          // Enables Depth Testing
  glShadeModel(GL_SMOOTH);          // задаётся шайд мод
 
  glMatrixMode(GL_PROJECTION);  //Режим матрицы проекции
  glLoadIdentity();             // сброс открыть матрицу проекции
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // вычисление коефициентов сжатия окна
 
  glMatrixMode(GL_MODELVIEW);
}
 
/* РИсование */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       // отчистка буфера
  glLoadIdentity();             // сброс открыть
 
float pos[] = {0.0f, 0.0f, 0.0f};
  glRotatef(rtri,0.0f,0.0f,1.0f);
  glTranslatef(pos[0], pos[1], pos[2]);
  // Рисование триугольника
  glBegin(GL_POLYGON);              // начало рисования полигона
  glVertex3f( 0.0f, 1.0f, 0.0f);        // верх
  glVertex3f( 1.0f,-1.0f, 0.0f);        // низ право
  glVertex3f(-1.0f,-1.0f, 0.0f);        // низ лево  
  glEnd();                  // конец рисования
 
  
                // задаётся вращение для триугольника
   
 
  // перестановка буфера для показа
  SDL_GL_SwapBuffers();
}
 
int main(int argc, char **argv) 
{  
  int done;
 
  /* Инициализация СДЛ видео выхода */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    exit(1);
  }
 
  /* создаёт окно с размерами 640х480*/
  if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL ) {
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError());
    SDL_Quit();
    exit(2);
  }
 
  /* Титл окна */
  SDL_WM_SetCaption("Frost", NULL);
 
  /* загрузка рисовальных ивентов и ивнтов чтения */
  InitGL(640, 480);
  done = 0;
  while ( ! done ) {
    DrawGLScene();
 
    /* функции обработки клавиш */
    { SDL_Event event;
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
           if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          } float pos[] = {0.0f, 0.0f, 0.0f};
           float fwd[] = {0.0f, 1.0f, 0.0f}; 
           float step = 0.1f;
           for (int i = 0; i < 3; i++)
           if (event.key.keysym.sym==SDLK_UP){
    pos[i]+= fwd[i] * step;
        } 
           for (int i = 0; i < 3; i++)
               if (event.key.keysym.sym==SDLK_DOWN){
                   pos[i]-= fwd[i] * step;
               }const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
                float phi = 3.0f; //шаг поворота
                if (event.key.keysym.sym==SDLK_LEFT){
                          rtri += phi;
                          fwd[0] = cos(rtri * radindeg);
                          fwd[1] = sin(rtri * radindeg);
                }
                if (event.key.keysym.sym==SDLK_LEFT){
                     rtri -= phi;
                          fwd[0] = cos(rtri * radindeg);
                          fwd[1] = sin(rtri * radindeg);
                }
 
 
 
        }
      }
    }
  }
  SDL_Quit();
  return 1;
}
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:09
1 - pos и fwd должны быть глобальными
2 - не надо дважды обрабатывать SDLK_LEFT

А треугольник не отображается, потому что цвет для него не установлен (glColor3f не стоило убирать)
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 12:18  [ТС]
Цитата Сообщение от Hypafrag Посмотреть сообщение
1 - pos и fwd должны быть глобальными
2 - не надо дважды обрабатывать SDLK_LEFT

А треугольник не отображается, потому что цвет для него не установлен (glColor3f не стоило убирать)
Сделал всё как вы сказали.
Но всёравно не показывает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <windows.h>
#include <glut.h>
#include "glut.h"   
#include "SDL.h"
#include "math.h"
 
/* вращение англе триугольника */
float rtri = 0.0f;
float pos[] = {0.0f, 0.0f, 0.0f};
float fwd[] = {0.0f, 1.0f, 0.0f}; 
 
 
 
/* главные инициальзирующие функции */
void InitGL(int Width, int Height)          // создание окна
{
  glViewport(0, 0, Width, Height);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);     // очистка фона окна и изменение цвета на чёрный
  glClearDepth(1.0);                // отчистка Depht буфера
  glDepthFunc(GL_LESS);             // задаётся функция depht
  glEnable(GL_DEPTH_TEST);          // Enables Depth Testing
  glShadeModel(GL_SMOOTH);          // задаётся шайд мод
 
  glMatrixMode(GL_PROJECTION);  //Режим матрицы проекции
  glLoadIdentity();             // сброс открыть матрицу проекции
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // вычисление коефициентов сжатия окна
 
  glMatrixMode(GL_MODELVIEW);
}
 
/* РИсование */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       // отчистка буфера
  glLoadIdentity();             // сброс открыть
 
 
  glRotatef(rtri,0.0f,0.0f,1.0f);
  glTranslatef(pos[0], pos[1], pos[2]);
  // Рисование триугольника
  glBegin(GL_POLYGON);      // начало рисования полигона
   glColor3f(1.0f,0.0f,0.0f);
  glVertex3f( 0.0f, 1.0f, 0.0f);// верх
  glColor3f(0.0f,1.0f,0.0f);
  glVertex3f( 1.0f,-1.0f, 0.0f);        // низ право
  glColor3f(0.0f,0.0f,1.0f);
  glVertex3f(-1.0f,-1.0f, 0.0f);        // низ лево  
  glEnd();                  // конец рисования
 
  
                // задаётся вращение для триугольника
   
 
  // перестановка буфера для показа
  SDL_GL_SwapBuffers();
}
 
int main(int argc, char **argv) 
{  
  int done;
 
  /* Инициализация СДЛ видео выхода */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    exit(1);
  }
 
  /* создаёт окно с размерами 640х480*/
  if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL ) {
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError());
    SDL_Quit();
    exit(2);
  }
 
  /* Титл окна */
  SDL_WM_SetCaption("Frost", NULL);
 
  /* загрузка рисовальных ивентов и ивнтов чтения */
  InitGL(640, 480);
  done = 0;
  while ( ! done ) {
    DrawGLScene();
 
    /* функции обработки клавиш */
    { SDL_Event event;
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
           if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          }
           
           float step = 0.1f;
           for (int i = 0; i < 3; i++)
           if (event.key.keysym.sym==SDLK_UP){
    pos[i]+= fwd[i] * step;
        } 
           for (int i = 0; i < 3; i++)
               if (event.key.keysym.sym==SDLK_DOWN){
                   pos[i]-= fwd[i] * step;
               }const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
                float phi = 3.0f; //шаг поворота
                if (event.key.keysym.sym==SDLK_LEFT){
                          rtri += phi;
                          fwd[0] = cos(rtri * radindeg);
                          fwd[1] = sin(rtri * radindeg);
                }
                if (event.key.keysym.sym==SDLK_RIGHT){
                     rtri -= phi;
                          fwd[0] = cos(rtri * radindeg);
                          fwd[1] = sin(rtri * radindeg);
                }
 
 
 
        }
      }
    }
  }
  SDL_Quit();
  return 1;
}
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:32
Обработка клавиш совсем неправильно сделана, должна выглядеть примерно вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    /* функции обработки клавиш */
    { SDL_Event event;
      const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
      float step = 0.1f;
      float phi = 3.0f; //шаг поворота
 
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
           if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          } if (event.key.keysym.sym==SDLK_UP) {
               for (int i = 0; i < 3; i++)
                    pos[i]+= fwd[i] * step;
          } if (event.key.keysym.sym==SDLK_DOWN){
               for (int i = 0; i < 3; i++)
                    pos[i]-= fwd[i] * step;
          } if (event.key.keysym.sym==SDLK_LEFT){
               rtri += phi;
               fwd[0] = cos(rtri * radindeg);
               fwd[1] = sin(rtri * radindeg);
          } if (event.key.keysym.sym==SDLK_RIGHT){
               rtri -= phi;
               fwd[0] = cos(rtri * radindeg);
               fwd[1] = sin(rtri * radindeg);
          }
        }
      }
    }
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 12:39  [ТС]
спасибо.
А вот что с самим треугольником делать?
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:41
А с таким управлением он не появляется?
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 12:50  [ТС]
Такс
я изменил вот так glTranslatef(-1.5f,0.0f,-6.0f); в место того чтоб было pos[0]... в нутри
треугольник появился но двигается только клавишами право влево причём по дуге и чтоб его поворачивать нужно много раз клавишу нажимать...можно както сделать чтоб он с зажатой крутился?.
а должен поворачиватся на месте.
вперёд назад чегото неработают
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:55
А если поменять порядок translate и rotate, какой эффект?
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 12:57  [ТС]
о....поворачивается нормально.
но вот кнопки вверх вниз недают результата
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:59
Дык, верни translatef(pos[0], pos[1], pos[2]);
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 13:02  [ТС]
Вернул....но треугольник теперь пропал
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 13:06
C++
1
gluLookAt(0.0f, 0.0f, -1.0, 0.0f, 0.0f, 0.0f. 0.0f, 1.0f, 0.0f);
после gluPerspective возможно поможет
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 13:14  [ТС]
Вставил выдоло кучу ошибок


: error C2059: синтаксическая ошибка: константа
1>d:\documents and settings\userxp\мои документы\visual studio 2008\projects\sdl4\sdl4\sdl4.cpp(30) : error C2228: выражение слева от ".glMatrixMode" должно представлять класс, структуру или объединение

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <windows.h>
#include <glut.h>
#include "glut.h"   
#include "SDL.h"
#include "math.h"
 
/* вращение англе триугольника */
float rtri = 0.0f;
float pos[] = {0.0f, 0.0f, 0.0f};
float fwd[] = {0.0f, 1.0f, 0.0f}; 
 
 
 
/* главные инициальзирующие функции */
void InitGL(int Width, int Height)          // создание окна
{
  glViewport(0, 0, Width, Height);
 
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);     // очистка фона окна и изменение цвета на чёрный
  glClearDepth(1.0);                // отчистка Depht буфера
  glDepthFunc(GL_LESS);             // задаётся функция depht
  glEnable(GL_DEPTH_TEST);          // Enables Depth Testing
  glShadeModel(GL_SMOOTH);          // задаётся шайд мод
 
  glMatrixMode(GL_PROJECTION);  //Режим матрицы проекции
  glLoadIdentity();             // сброс открыть матрицу проекции
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // вычисление коефициентов сжатия окна
  gluLookAt(0.0f, 0.0f, -1.0, 0.0f, 0.0f, 0.0f. 0.0f, 1.0f, 0.0f);
  glMatrixMode(GL_MODELVIEW);
}
 
/* РИсование */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       // отчистка буфера
  glLoadIdentity();             // сброс открыть
 
glTranslatef(pos[0], pos[1], pos[2]);
  glRotatef(rtri,0.0f,0.0f,1.0f);
  
  // Рисование триугольника
  glBegin(GL_POLYGON);      // начало рисования полигона
   glColor3f(1.0f,0.0f,0.0f);
  glVertex3f( 0.0f, 1.0f, 0.0f);// верх
  glColor3f(0.0f,1.0f,0.0f);
  glVertex3f( 1.0f,-1.0f, 0.0f);        // низ право
  glColor3f(0.0f,0.0f,1.0f);
  glVertex3f(-1.0f,-1.0f, 0.0f);        // низ лево  
  glEnd();                  // конец рисования
 
  
                // задаётся вращение для триугольника
   
 
  // перестановка буфера для показа
  SDL_GL_SwapBuffers();
}
 
int main(int argc, char **argv) 
{  
  int done;
 
  /* Инициализация СДЛ видео выхода */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    exit(1);
  }
 
  /* создаёт окно с размерами 640х480*/
  if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL ) {
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError());
    SDL_Quit();
    exit(2);
  }
 
  /* Титл окна */
  SDL_WM_SetCaption("Frost", NULL);
 
  /* загрузка рисовальных ивентов и ивнтов чтения */
  InitGL(640, 480);
  done = 0;
  while ( ! done ) {
    DrawGLScene();
 
    /* функции обработки клавиш */
    { SDL_Event event;
      const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
      float step = 0.3f;
      float phi = 3.0f; //шаг поворота
 
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
           if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          } if (event.key.keysym.sym==SDLK_UP) {
               for (int i = 0; i < 3; i++)
                    pos[i]+= fwd[i] * step;
          } if (event.key.keysym.sym==SDLK_DOWN){
               for (int i = 0; i < 3; i++)
                    pos[i]-= fwd[i] * step;
          } if (event.key.keysym.sym==SDLK_LEFT){
               rtri += phi;
               fwd[0] = cos(rtri * radindeg);
               fwd[1] = sin(rtri * radindeg);
          } if (event.key.keysym.sym==SDLK_RIGHT){
               rtri -= phi;
               fwd[0] = cos(rtri * radindeg);
               fwd[1] = sin(rtri * radindeg);
          }
          }
        }
      }
    }
  SDL_Quit();
  return 1;
}
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 13:15
Точка там вместо запятой, аккуратней копипастить код надо
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 13:22  [ТС]
ага...помогло треугольник появился...двигается...
подскажи как сделать чтоб он двигался при зажатой кнопке...чтоб не клацать постоянно?
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 13:25
Точно не скажу, с SDL дела никогда не имел, но предполагаю, что вместо события SDL_KEYDOWN нужно ловить событие SDL_KEYPRESSED
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 13:34  [ТС]
впрочем это уже нетакуж важно...покавыряюсь...
а вот последний вопросик...треугольник двигается при нажатии вверх низ не по направлению своей главной вершине...а както непонятно...в разброс чтоли...можно это както исправить?

Добавлено через 1 минуту
это происходить когда его поворачиваю...

Добавлено через 5 минут
вот пример на вин32...
я чёт ковырялся...мозгов нехватило переделать))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if(GetAsyncKeyState(VK_LEFT))  angle -= 0.7; // Кнопки Влево и вправо крутят фигуру! 
 if(GetAsyncKeyState(VK_RIGHT)) angle += 0.7;
 
 if(GetAsyncKeyState(VK_UP)) { 
     Vector tmp; tmp.x = 0.01; tmp.y = 0.01;
     tmp = Rotate(tmp, angle);
     
     pos.x += tmp.x; pos.y += tmp.y;
     if(pos.x > 5.1) pos.x = -5.1;
     if(pos.x < - 5.1) pos.x = 5.1;
 
     if(pos.y > 5.1) pos.y = -5.1;
     if(pos.y < - 5.1) pos.y = 5.1;
 
 }  // Кнопки вверх и вниз меняют позицию фигуру! 
 if(GetAsyncKeyState(VK_DOWN)) {
     Vector tmp; tmp.x = -0.006; tmp.y = -0.006;
     tmp = Rotate(tmp, angle);
     pos.x += tmp.x; pos.y += tmp.y;
 
     pos.x += tmp.x; pos.y += tmp.y;
     if(pos.x > 5.1) pos.x = -5.1;
     if(pos.x < - 5.1) pos.x = 5.1;
 
     if(pos.y > 5.1) pos.y = -5.1;
     if(pos.y < - 5.1) pos.y = 5.1;
 
 }
0
 Аватар для Hypafrag
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 13:37
Исправить можно все...

Я перепутал cos и sin местами при повороте, возможно в этом вся проблема
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2010, 13:37
Помогаю со студенческими работами здесь

Несколько вопросов (2D игра с SDL и OpenGL)...
Здравствуйте. Делаю2D игру появилась проблема. Да и советы не помешаю (т.к. это моё первое серьёзное творение). Функции, которые...

Не компилируется SDL + OpenGL на Windows в mingw
Здравствуйте. Пишу проект на sdl+opengl. В линуксе всё компилируется нормально, однако, когда я решил скомпилировать это под windows, то...

SDL: OpenGL: установка границ объема отсечения glOrtho(.);
Открыл окно SDL, создал контекст OpenGL. Соответственно, что бы что-либо рисовать, нужно определить границы объема отсечения. И не...

Не отображается текстура SDL + OpenGL
Вот код SDL_Window *window = NULL; SDL_Surface *surf = NULL; SDL_GLContext glContext; unsigned int texture; void init() {...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо инициализация происходить по другому. как мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru