Domanda

Ho problemi con l'inserimento di più oggetti. Carico oggetto ma sono tutti in un unico posto,

for( int i = 0; i <= 5; i++ )
{        
  glCallList( OBJECT_LIST[ i ] );
}

glFlush();
glutSwapBuffers();

} // unopened paren 

void Reshape( int width, int height ) {
  glViewport( 0, 0, width, height );
  glMatrixMode( GL_PROJECTION );

  glLoadIdentity();
  for( int i = 0; i <= 5; i++ )  {      
    if( !load_obj( argv[ i ], OBJECT_LIST[ i ] ) )
    {
      printf( "error load file %s", argv[ i ] );
    }
  } 
}
È stato utile?

Soluzione

È necessario specificare direttamente la matrice di oggetti (come se il caricamento di oggetti da un file 3DS) in questo modo:

glMatrixMode(GL_MODELVIEW); // we are going to manipulate object matrix
for(int i = 0; i <= 5; i++) {
    glPushMatrix(); // save the current modelview (assume camera matrix is there)
    glMultMatrixf(pointer_to_object_matrix(i)); // apply object matrix
    glCallList( OBJECT_LIST[i]);
    glPopMatrix(); // restore modelview
}

Guardando questo, nota anche che non è possibile archiviare le operazioni a matrice negli elenchi di visualizzazione (cioè. Se la funzione load_obj () sta impostando le matrici comunque, non funzionerà perché queste operazioni non sono "registrate").

L'altra opzione è quella di utilizzare uno schema di posizionamento degli oggetti semplice, come questo:

glMatrixMode(GL_MODELVIEW); // we are going to manipulate object matrix
for(int i = 0; i <= 5; i++) {
    glPushMatrix(); // save the current modelview (assume camera matrix is there)

    glTranslatef(object_x(i), object_y(i), object_z(i)); // change object position

    glRotatef(object_yaw(i), 0, 1, 0);
    glRotatef(object_pitch(i), 1, 0, 0);
    glRotatef(object_roll(i), 0, 0, 1); // change object rotations

    glCallList( OBJECT_LIST[i]);
    glPopMatrix(); // restore modelview
}

Ad ogni modo, è necessario scrivere alcune funzioni extra (Pointer_to_object_matrix o object_ [x, y, z, yaw, pitch e roll]). Se stai solo cercando di visualizzare alcuni oggetti, prova questo:

glMatrixMode(GL_MODELVIEW); // we are going to manipulate object matrix
for(int i = 0; i <= 5; i++) {
    glPushMatrix(); // save the current modelview (assume camera matrix is there)

    const float obj_step = 50; // spacing between the objects
    glTranslatef((i - 2.5f) * obj_step, 0, 0); // change object position

    glCallList( OBJECT_LIST[i]);
    glPopMatrix(); // restore modelview
}

Spero che sia d'aiuto ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top