2014-11-15 6 views
1

Мой код до сих порOpenGL, как вращать объекты независимо друг от друга?

void display (void) 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer 
glLoadIdentity(); 
gluLookAt( camera[0][0],  camera[0][1],  camera[0][2], 
      camera[1][0],  camera[1][1],  camera[1][2], 
      camera[2][0],  camera[2][1],  camera[2][2]   );   //Set the point looking at 


glRotatef(cubeRot[0], 1.0f, 0.0f, 0.0f); //rotate on x axis 
glRotatef(cubeRot[1], 0.0f, 1.0f, 0.0f); //rotate on y axis 
glRotatef(cubeRot[2], 0.0f, 0.0f, 1.0f); //rotate on z axis 

switch (Rendermode) { //different render mode 

    case 'f': 
      //Draw object I want to rotate 
    break; 

    case 'v': 
      //Draw object I want to rotate   
    break; 

    case 'e': 
      //Draw object I want to rotate 
    break; 

glLoadIdentity(); 

} 

//Draw object I DO NOT want to rotate 

glutSwapBuffers (); // Swap The Buffers To Not Be Left With A Clear Screen 
} 

Однако на данный момент все мои объекты вращаются в то же время, как я могу повернуть объект я заметил, хочет повернуть, оставив те, которые я уже отметил не хотите повернуть еще?

ответ

2

Инкапсулируйте линейные преобразования с помощью gl Push/Pop Матрица() и нарисуйте объект. Эти функции сохраняют/восстанавливают текущее состояние матрицы, поэтому они не влияют на другие чертежи.

glPushMatrix(); 
glRotatef(...); 
// glTranslatef(...), 
//glScalef(...); 
drawObject1(); 
glPopMatrix(); 

glPushMatrix(); 
glRotatef(...); 
// glTranslatef(...), 
//glScalef(...); 
drawObject2(); 
glPopMatrix(); 
+0

Я поместил glPush и glPop вокруг чертежа объектов, которые я хотел повернуть, но другой объект по-прежнему вращается вместе с ними. Не могли бы вы оставить C & P мой код и поместить их в нужное место? – sam

+0

Прямо сейчас я вижу 3 вызова 'glRotatef()' в вашем коде, которые принимают 'cubeRot' как аргумент. Если вы хотите выполнить каждый из них на отдельном объекте, не выполняйте эти вызовы одновременно, а наиболее определенно не до 'switch/case'. Оберните каждый вызов вокруг своей собственной операции push/pop вместе с вызовом метода для рисования этого конкретного объекта. – karlphillip

+0

Кстати, удалите 'glLoadIdentity()' в конце 'switch'. В этом нет необходимости. – karlphillip

1

Как @karlphillip утверждает, что вам нужно положить вращение, чтобы glPush/glPop матрицы капсулирования. Я думаю, что этот код должен работать:

void display (void) 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer 
glLoadIdentity(); 
gluLookAt( camera[0][0],  camera[0][1],  camera[0][2], 
      camera[1][0],  camera[1][1],  camera[1][2], 
      camera[2][0],  camera[2][1],  camera[2][2]   );   //Set the point looking at 

glPushMatrix(); //-------------------- Encapsulate Rotation ---------------- 
glRotatef(cubeRot[0], 1.0f, 0.0f, 0.0f); //rotate on x axis 
glRotatef(cubeRot[1], 0.0f, 1.0f, 0.0f); //rotate on y axis 
glRotatef(cubeRot[2], 0.0f, 0.0f, 1.0f); //rotate on z axis 

switch (Rendermode) { //different render mode 

    case 'f': 
      //Draw object I want to rotate 
    break; 

    case 'v': 
      //Draw object I want to rotate   
    break; 

    case 'e': 
      //Draw object I want to rotate 
    break; 
} 
glPopMatrix(); //------------------- Encapsulate Rotation Ends ------- 

//Draw object I DO NOT want to rotate 

glutSwapBuffers (); // Swap The Buffers To Not Be Left With A Clear Screen 
} 
+0

Спасибо, я думал, что поместил их туда, но он не работал, так что, очевидно, – sam

Смежные вопросы