Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2010, 11:59   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию OpenGL SDL

Треугольник двигается и показывается но кагда его поворачиваю он двигается както калечно по диагонали чтоли....подскажите что надо иправить чтоб он двигался по напрявлению его вершины которая удлинена...
Код:

#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, -5.0, 0.0f, 0.0f, 0.0f, 0.0f, 5.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( 0.5f,-0.5f, 0.0f);		// низ право
  glColor3f(0.0f,0.0f,1.0f);
  glVertex3f(-0.5f,-0.5f, 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_RIGHT){
               rtri += phi;
               fwd[0] = sin(rtri * radindeg);
               fwd[1] = cos(rtri * radindeg);
          } if (event.key.keysym.sym==SDLK_LEFT){
               rtri -= phi;
               fwd[0] = sin(rtri * radindeg);
               fwd[1] = cos(rtri * radindeg);
		  }
          }
        }
      }
    }
  SDL_Quit();
  return 1;
}

Последний раз редактировалось revaldo666; 22.07.2010 в 13:58.
revaldo666 вне форума Ответить с цитированием
Старый 22.07.2010, 16:29   #2
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

А че со старым алгоритмом случилось?)
wyvern@localhost:~$ sudo emerge --unmerge world
wyvern вне форума Ответить с цитированием
Старый 22.07.2010, 16:37   #3
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

та он в поряде))
Мне просто это надо на win32 и на SDL написать...
тот алгоритм я под сдл поправил...вроде как норм всё компилится, но треугольник не отображался...поэтому решил так сделать...но чёт всёравно неполучается полностью...всё у меня через задницу)))

Последний раз редактировалось revaldo666; 22.07.2010 в 16:43.
revaldo666 вне форума Ответить с цитированием
Старый 22.07.2010, 17:17   #4
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

вот короче тот переделанный код...
незнаю чё не отображается...
Код:
#include <windows.h>
#include <glut.h>
#include "glut.h"	
#include "SDL.h"
#include "math.h"
#define PI 3.1415926535898


struct Vector 
{ 
float x, y;
};

Vector v1, v2, v3,v4; 
Vector pos;
float angle;
int width;
int height;


/* главные инициальзирующие функции */
void InitGL(int Width, int Height)
	        // создание окна
{
  glViewport(0,0,width,height);
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-5,5, -5,5, 2,12);
 
   glMatrixMode( GL_MODELVIEW );


}
Vector Rotate(Vector v,float a) // функция вращения вектора на угол а.
{

Vector r;


a = a * (PI/180.0);
r.x = (v.x*cos(a)) + (v.y*sin(a));
r.y = (v.x*-sin(a)) + (v.y*cos(a));




return r;

}
void init() // Задаем установки прогы
{
v1.x = 0.3; v1.y = 0.3; // записываем статичиские кординаты фигуры
v2.x =-0.08; v2.y = 0.08;
v4.x = 0.08; v4.y =-0.08;
}

/* РИсование */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		// отчистка буфера
  glLoadIdentity();				// сброс открыть
glColor3ub(255,255,0);

  Vector tv1 = Rotate(v1,angle); // создаем временой вектор  для создания глобальних кординат
 Vector tv2 = Rotate(v2,angle);
 Vector tv3 = Rotate(v4,angle);
  // Рисование триугольника
  glBegin(GL_TRIANGLES);
    glVertex2d(tv1.x + pos.x, tv1.y + pos.y); // рисуем фигуру и добовляем позицию
    glVertex2d(tv2.x + pos.x, tv2.y + pos.y);
    glVertex2d(tv3.x + pos.x, tv3.y + pos.y);
 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(600, 600, 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;
          } if (event.key.keysym.sym==SDLK_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 (event.key.keysym.sym==SDLK_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;
 
          } if (event.key.keysym.sym==SDLK_RIGHT){
               angle += 0.7;
          } if (event.key.keysym.sym==SDLK_LEFT){
               angle -= 0.7;
		  }
          }
        }
      }
    }
  SDL_Quit();
  return 1;
}
revaldo666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SDL OpenGL Вращение фигуры revaldo666 Общие вопросы C/C++ 0 18.07.2010 22:42
Visual C++(SDL, OpenGL) revaldo666 Visual C++ 1 15.07.2010 20:09
Visual C++ (SDL, openGL) revaldo666 Qt и кроссплатформенное программирование С/С++ 0 15.07.2010 17:36
Win32Api и SDL revaldo666 Win Api 2 05.07.2010 17:49
SDL, текст Plobzik Общие вопросы C/C++ 9 23.04.2010 23:11