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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вращение в OpenGL, Через какое то время перестает вращаться 
:(
    Опции темы
SergeAndK
Дата 28.8.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



  Только начал обучаться OpenGL. Модифицировал учебный пример, чтобы его можно было вращать по осям Ox  и Oy. Первые несколько секунд вращается нормально (угол меняется клавишами). А потом yRot продолжает меняться при нажатии, одноко картика не изменяется. В тоже время по оси Ох ващается нормально. В чем может быть ошибка?

Код

#include <glut.h>
#include <math.h>

#define GL_PI 3.1415f

static GLfloat fElect = 0.0f;
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;

void RenderScene(void)
{
    int n = 256;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -100.0f);
    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);
    
    // Ядро
    glColor3f(1.0f, 0.0f, 0.0f);
    glutSolidSphere(10.0f, 15.0f, 15.0f);
    
    glColor3f(1.0f, 1.0f, 0.0f);
    
    // Электрон №1
    glPushMatrix();
    glRotatef(fElect, 0.0f, 1.0f, 0.0f);
    glBegin(GL_LINE_LOOP);
        for (int i = 0; i < n; i++)
        {
            double angle = 2*GL_PI*i/n;
            glVertex3f(90.0*cos(angle), 0.0f,  90.0*sin(angle));
        }
    glEnd();
    glTranslatef(90.0f, 0.0f, 0.0f);
    glutSolidSphere(6.0f, 15.0f, 15.0f);
    glPopMatrix();

    // Электрон №2
    glPushMatrix();
    glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
    glRotatef(fElect, 0.0f, 1.0f, 0.0f);
    glBegin(GL_LINE_LOOP);
        for (int i = 0; i < n; i++)
        {
            double angle = 2*GL_PI*i/n;
            glVertex3f(70.0*cos(angle), 0.0f, 70.0*sin(angle));
        }
    glEnd();
    glTranslatef(-70.0f, 0.0f, 0.0f);
    glutSolidSphere(6.0f, 15.0f, 15.0f);
    glPopMatrix();

    // Электрон №3
    glPushMatrix();
    glRotatef(360.0f - 45.0f, 0.0f, 0.0f, 1.0f);
    glRotatef(fElect, 0.0f, 1.0f, 0.0f);
    glBegin(GL_LINE_LOOP);
        for (int i = 0; i < n; i++)
        {
            double angle = 2*GL_PI*i/n;
            glVertex3f(60.0*cos(angle), 0.0f, 60.0*sin(angle));
        }
    glEnd();
    glTranslatef(0.0f, 0.0f, 60.0f);
    glutSolidSphere(6.0f, 15.0f, 15.0f);

    fElect += 5.0f;
    if(fElect > 360.0f)
        fElect = 0.0f;
    glutSwapBuffers();
}

void SetupRC(void)
{
    glEnable(GL_DEPTH_TEST);
    glFrontFace(GL_CCW);
    glEnable(GL_CULL_FACE);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void SpecialKeys(int key, int x, int y)
{
    if(key == GLUT_KEY_UP)
        xRot -= 5.0f;
    if(key == GLUT_KEY_DOWN)
        xRot += 5.0f;
    if(key == GLUT_KEY_LEFT)
        yRot -= 5.0f;
    if(key == GLUT_KEY_RIGHT)
        yRot += 5.0f;
    if(xRot > 356.0f)
        xRot = 0.0f;
    if(xRot < -1.0f)
        xRot = 355.0f;
    if(yRot > 356.0f)
        yRot = 0.0f;
    if(yRot < -1.0f)
        yRot = 355.0f;
    glutPostRedisplay();
}

void TimerFunc(int value)
{
    glutPostRedisplay();
    glutTimerFunc(50, TimerFunc, 1);
}

void ChangeSize(int w, int h)
{
    GLfloat nRange = 100.0f;
    if(h ==0)
        h = 1;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w <= h)
        glOrtho(-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange*2.0f, nRange*2.0f);
    else
        glOrtho(-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange*2.0f, nRange*2.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Atom Ordinary");
    glutSpecialFunc(SpecialKeys);
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    glutTimerFunc(500, TimerFunc, 1);
    SetupRC();
    glutMainLoop();
    return 0;
}






Это сообщение отредактировал(а) SergeAndK - 28.8.2009, 08:59
PM MAIL   Вверх
Rickert
Дата 6.10.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



При больших значениях угла поворота у вас получается что объект вращается почти на 360 градусов, поэтому вам и кажется что он стоит.


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

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

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


 




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


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

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