2010-09-16 8 views
1

J'ai un objet 2D (GL_QUAD) avec la taille (W, H) et assis à (-W * 0.5, -H * 0.5).Comment changer la projection pour qu'elle montre mon objet?

Je préfère ne pas redimensionner l'objet, car j'ai besoin de pouvoir sélectionner des points sur cet objet par rapport à la texture. (c'est-à-dire (x, y) dans openGL se traduit par (x, y) sur la texture - aucune mise à l'échelle nécessaire). Ce que je veux faire est de changer les propriétés de la caméra (projection, angle, etc) de sorte que l'objet, quelle que soit sa taille, apparaisse en remplissant le plus grand axe de l'écran. (Aspect Fit?)

Je peux comparer la taille de l'écran par rapport à la taille de l'objet sans problème. Je peux changer ma matrice de caméra sans problème (modelview et projection). Mais je ne sais pas comment calculer la transformation dont j'ai besoin pour voir l'ensemble de l'objet.

Je pensais:

  1. traduire caméra (0,0, -1)
  2. objet 4 coords avec du projet gluProject()
  3. de test si les points existent dans rect écran.
  4. sinon, goto 1.

Mais cela semble ... informatiquement si intense. J'ai les coordonnées de l'écran, et les coordonnées de l'objet - ne devrais-je pas être en mesure de calculer l'angle solide que les lignes entre les 4 coins de chaque objet décrivent et mettre à cela?

Merci,


[EDIT]

Voici une autre solution non-élégante:

void View::getCamera(eq::Matrix4f& camera) 
{ 
    camera = eq::Matrix4f::IDENTITY; 
    camera = camera * _rotation; 
    camera.set_translation(_translation ); 
    float longAxis = 1.0f; 

    // Normalize Scale 
    @try { 
     float tH = (float)getHeight(); // texture coords 
     float tW = (float)getWidth(); 
     float sH = getBaseFrustum().getWall().getHeight(); // screen coords 
     float sW = getBaseFrustum().getWall().getWidth(); 

     float rW = tW/sW; 
     float rH = tH/sH; 

     if (rH > rW) { 

      longAxis *= tH*2.0f; 

     } else { 

      longAxis *= tW*2.0f; 
     } 

    } 
    @catch (...) { 
     //Nothing? 
     NSLog(@"Couldn't get Height or Width"); 
    } 

    // Normalize Scale to Screen/Image Size 
    camera.scale(eq::Vector3f(_scale/longAxis,-_scale/longAxis,1.0f)); 
} 

Je ne pense pas que c'est une excellente solution, mais ...

Répondre

0

On dirait que votre matériel est entièrement en 2D et n'a vraiment pas besoin des avantages d'une projection en perspective, dans ce cas, une projection orthogonale serait beaucoup plus facile à utiliser. Une projection orthogonale rend trivialement facile l'ajustement d'un quad pour remplir l'écran.

http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml

+0

Je vais tout de l'affichage 2D à quadriceps marching cubes pour le rendu de volume ... Je préfère généraliser mieux que je peux ... –