Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поворот куба в OpenGL 
V
    Опции темы
stat007
Дата 10.1.2010, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: нет
Всего: -4



Код приведённый ниже рисует каркасный КУБ синего цвета. Нужно доделать, что бы при нажатии на клавиатуре на стрелку влево, куб бы поворачивался влево, а при нажатии на правую стрелку, куб поворачивался вправо ...
Помогите это сделать.
Код

#include <windows.h>
#include "GL\glut.h"

GLsizei winW=500, winH=500;

void init ()
{
    glClearColor(1.0,1.0,1.0,1.0);
}
void RanderScene()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    gluLookAt(5.0,5.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
    glEnable(GL_DEPTH_TEST);
    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
    glColor3f(1.0,0.0,0.0);
    glutSolidCube(2);
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
    glEnable(GL_POLYGON_OFFSET_FILL);
    glPolygonOffset(1.0,1.0);
    glColor3f(0.0,0.0,1.0);
    glutSolidCube(2);
    glDisable(GL_POLYGON_OFFSET_FILL);
    glFlush();
}
void ChangeSize(GLint w, GLint h)
{
    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0,(GLfloat)w/(GLfloat)h,2.0,25.0);    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
}    
int main()
{    
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(50,100);
    glutInitWindowSize(winW,winH);
    glutCreateWindow("Êóá");
    init();
            glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RanderScene);
    init();
    glutMainLoop();
    return 0;
}

PM MAIL   Вверх
Alexeis
Дата 10.1.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(stat007 @  10.1.2010,  22:36 Найти цитируемый пост)
Нужно доделать, что бы при нажатии на клавиатуре на стрелку влево, куб бы поворачивался влево, а при нажатии на правую стрелку, куб поворачивался вправо ...


За движение объекта отвечает видовая матрица. Собственно сам объект обычно не трогают (исходные координаты), меняют его отображение в пространстве.
 
Код

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(x, y, z); //сдвиг
  glRotatef(angleX, 1, 0, 0); //поворот вокруг оси Х 
  glRotatef(angleY, 0, 1, 0); //поворот вокруг оси Y 
  glRotatef(angleZ, 0, 0, 1); //поворот вокруг оси Z 


меняя x, y, z, angleX, angleY, angleZ будем двигать и поворачивать объект соответственно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rickert
Дата 11.1.2010, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



Только когда мы говорим о конкретном объекте, а не о всём мире, нам необходимо снаала запомнить текущую матрицу вида:
Код
glPushMatrix()

Затем совершить поворот объекта, а потом вернуть видовую матрицу:
Код
glPopMatrix()




--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
stat007
Дата 11.1.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: нет
Всего: -4



Alexeis
А как это применить к данной программе??

PM MAIL   Вверх
Alexeis
Дата 11.1.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата

Умножение координат на матрицы происходит в момент вызова
соответствующей команды OpenGL, определяющей координату (как
правило, это команда glVertex*)


stat007, значит сначала сохраняем видовую матрицу glPushMatrix(), устанавливаем нужное преобразование (см мой код), затем передаем координаты модели (glVertex*), потом восстанавливаем видовую матрицу (glPopMatrix()) как сказал Rickert.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stat007
Дата 11.1.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: нет
Всего: -4



Alexeis
Вот постарался сделать как говорилось ранее в функцию ChangeSize, но почему то не хочет всё-равно работать программа.. Так же попробовал создать ещё одну функцию keyboord, но пока результата от этого нет! 
Что делать????? Помогите кто понимает, как правильно дописать программу, что бы она заработала........
И как указать в функции  keyboord в case вместо символов 'd' и 'a', как указать левую и правую стрелку на клавиатуре?????
Код

#include <windows.h>
#include "GL\glut.h"

GLsizei winW=500, winH=500;

//static int year=0, day=0;
int alpha=0, beta=0, gamma=0;
int x,y,z;

void init ()
{
    glClearColor(1.0,1.0,1.0,1.0);
//    glShadeModel(GL_FLAT);
    
}

void RanderScene()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    gluLookAt(5.0,5.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
    glEnable(GL_DEPTH_TEST);
    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
    glColor3f(1.0,0.0,0.0);
    glutSolidCube(2);
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
    glEnable(GL_POLYGON_OFFSET_FILL);
    glPolygonOffset(1.0,1.0);
    glColor3f(0.0,0.0,1.0);
    glutSolidCube(2);
    glDisable(GL_POLYGON_OFFSET_FILL);
    glFlush();
}

void ChangeSize(GLint w, GLint h)
{

    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0,(GLfloat)w/(GLfloat)h,2.0,25.0);    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
    glPushMatrix();
  glTranslatef(x, y, z);
  glRotatef(alpha, 1, 0, 0);
  glRotatef(beta, 0, 1, 0); 
  glRotatef(gamma, 0, 0, 1); 
  glPopMatrix();
}
    
void keyboord(unsigned char Key, int x,int y)
{
    switch(Key)
    {
    case 'd':
        alpha += 5;
//        glutPostRedisplay();
        break;
    case 'a':
        alpha += 5;
        break;
/*    case 'y':
        year=(year+5)%360;
        glutPostRedisplay();
        break;
    case 'Y':
        year=(year-5)%360;
        glutPostRedisplay();
        break;         */
    default: break;
    }

/*void CALLBACK Key_LEFT(void)
{
  alpha -= 5;
} */


int main()
{

    
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(50,100);
    glutInitWindowSize(winW,winH);
    glutCreateWindow("Êóá");
    init();
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RanderScene);
//    glutKeyboardFunc(Key_LEFT);
    glutKeyboardFunc(keyboord);
    
    init();

    glutMainLoop();
    return 0;
}


PM MAIL   Вверх
Alexeis
Дата 11.1.2010, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



  Отрисовкой очередного кадра занимается функция void RanderScene() , поскольку она вызывается циклически. Очевидно преобразования должны применяться к тому что мы рисуем. 
  Функция void keyboord вызывается при наступлении события от клавиатуры, без относительно того что сейчас твориться на экране, очевидно что в ней нужно менять некоторые переменные, влияющие на положение куба. void RanderScene() должна использовать эти переменные, чтобы нарисовать актуальное положение объекта, т.е. использовать в своем теле переменные которые меняются в void keyboord.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stat007
Дата 11.1.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: нет
Всего: -4



Это всё теория, я уже голову сломал - мучаюсь с этим, КАК ДОДЕЛАТЬ?????????
PM MAIL   Вверх
stat007
Дата 11.1.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: нет
Всего: -4



Сам доделал.........  smile 
Тема закрыта
PM MAIL   Вверх
Alexeis
Дата 23.1.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(stat007 @  11.1.2010,  22:17 Найти цитируемый пост)
Сам доделал.

Правильно! Зато научился. Написали бы все за тебя, ничего бы не понял smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.