Объект не будет вращаться? - PullRequest
2 голосов
/ 19 марта 2009
void RenderBrain(void)
{ 

glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);

ifstream myFile("brainData.txt");

if (!myFile.is_open()) 
{
    cout << "Unable to open file";
    exit(1); // terminate with error
}


glRotatef(80.0f, 1.0f, 0.0f, 0.0f);

while (! myFile.eof()) 
{
    myFile>>a[0];
    myFile>>a[1];
    myFile>>a[2];
    myFile>>a[3];


    glColor3f(0.60f,0.80f,0.90f);

    glLoadIdentity();       
    glTranslatef((a[0]-1.15)*26, a[2]*30, a[1]*30);
    glutSolidSphere(6, 5, 5);   


}   

myFile.close();
glFlush();
glutSwapBuffers();
}

Выше приведена часть моего кода, у меня проблема с его поворотом после добавления glLoadIdentity (); внутри петли. Если я уберу его, то все мои шары полетят во все стороны.

Кто-нибудь может помочь?

Ответы [ 6 ]

7 голосов
/ 19 марта 2009

Я настоятельно рекомендую работать с Учебными пособиями по NeHe OpenGL , если OpenGL является новым для вас.

glLoadIdentity сводит на нет эффект glRotate. Вместо этого используйте glPushMatrix / glPopMatrix для достижения независимых переводов:

glPushMatrix();               
glTranslatef((a[0]-1.15)*26, a[2]*30, a[1]*30);
glutSolidSphere(6, 5, 5);
glPopMatrix();

Если сферы больше не видны, вам необходимо предоставить свой код настройки видового экрана и матрицы проекции, чтобы мы могли определить проблему. С другой стороны, если вы вообще не настроили область просмотра и проекцию, то посмотрите учебник выше и исправьте это!

Кроме того, вы поворачиваете матрицу вида модели на 80 градусов при каждом рендеринге сцены. Это ожидаемый результат? Как часто эта функция вызывается? Я хотел бы рассмотреть возможность поддержания желаемого поворота в переменной, а затем загрузить единичную матрицу и поворачивать ее на этот угол вместо каждого прохода. Например:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
angle += angularVelocity * deltaTime;
glRotate(angle, 1, 0, 0);

Также неоднозначно, вызываете ли вы эту функцию только один раз и ожидаете, что вызов glRotate будет постоянно обновлять сцену (очень неверное предположение), или вы вызываете эту функцию несколько раз для визуализации анимированной сцены. Если это первый случай, пожалуйста, прочитайте учебники, на которые я ссылался выше. Если это последний случай, то вам следует рассмотреть возможность выполнения файлового ввода-вывода один раз и создания списка отображения для вызова в цикле рендеринга.

3 голосов
/ 19 марта 2009

У вас нет glBegin / glEnd. (не требуется со сплошной сферой). Также попробуйте glLoadIdentity перед glRotate, поскольку это звучит так, как будто матрица проецирования не инициализирована. Говоря об этом, вам, вероятно, также понадобится gluPerspective.

2 голосов
/ 19 марта 2009

Вы создаете сплошную сферу ... как вы должны сказать, вращается она или нет?

2 голосов
/ 19 марта 2009

Вы должны помнить, что матричный стек OpenGL не зависит от ваших кадров. Стек остается, поэтому его необходимо либо сохранить с помощью push / pop, либо полностью восстановить для каждого кадра.

В вашем случае попробуйте переместить вызов glRotate () после glLoadIdentity (), чтобы сделать новый поворот. Конечно, вы должны затем изменить угол, чтобы добиться изменения поворота.

0 голосов
/ 20 марта 2009

Правильно ли вы устанавливаете ProjectionMatrix? (используя glutOrtho и т. д.)

Как уже отмечали другие, glLoadIdentity определяет вашу модель-матрицу-представление и после этого вы выполняете перевод, поэтому, когда вы визуализируете сферу, она будет только переведена. Что касается полета, вы выполняете преобразования в цикле, а OpenGL является конечным автоматом, поэтому все ваши преобразования применяются один за другим. т.е.

for (each point)
{
   modelMatrix *= translate(newPt); // this is adding all transaltes..
}

Таким образом, ваши начальные точки могут отображаться правильно (вероятно, только в первую очередь), но последующие будут выглядеть как летящие ... так как они получают переводы всех предыдущих точек.

Что вам нужно сделать, это применить переводы для каждого отдельного пункта, т. Е.

for (each pt)
{
push_matrix
glLoadIdentity
glRotate      // matrix being applied is in reverse order of being called..
glTranslate   // so translate and rotate
glutSphere
pop matrix
}

Но вышесказанное не поможет вам, так как вы хотите двигать всем мозгом. Таким образом, вы должны визуализировать свой мозг с помощью трансляций, но применять матрицу вращения ко всем объектам.

Надеюсь, это прояснится.

0 голосов
/ 19 марта 2009

Мой OpenGL ржавый, но я думаю, что вы хотите сделать поворот после загрузки идентификационной матрицы.

glLoadIdentity();    
glRotatef(80.0f, 1.0f, 0.0f, 0.0f);           
glTranslatef((a[0]-1.15)*26, a[2]*30, a[1]*30);
glutSolidSphere(6, 5, 5);

Но лучшее решение (если я правильно помню) - это нажать матрицу после поворота, а затем вытолкнуть ее вместо glLoadIdentity() на каждой итерации цикла, но я менее уверен в этом. Возможно, другие знают больше о матричном стеке OpenGL?

...