OpenGL: échelle de traduire? et comment?

J'ai un peu de géométrie 2D. Je veux prendre quelques rect délimitation autour de ma géométrie, puis rendre une version plus petite de quelque part d'autre sur l'avion. Voici plus ou moins le code que j'ai à faire de mise à l'échelle et à la traduction:

//source and dest are arbitrary rectangles.
float scaleX = dest.width /source.width;
float scaleY = dest.height /source.height;
float translateX = dest.x - source.x;
float translateY = dest.y - source.y;

glScalef(scaleX, scaleY, 0.0);
glTranslatef(translateX, translateY, 0.0);
//Draw geometry in question with its normal verts.

Cela fonctionne exactement comme prévu pour une dimension donnée lorsque la destination d'origine est de 0. Mais si l'origine pour, disons, x, est différente de zéro, le résultat est toujours mis à l'échelle correctement mais ressemble (?) il est traduit en quelque chose de proche de zéro sur l'axe de toute façon-- s'avère qu'il n'est pas exactement le même que si dest.x est zéro.

Quelqu'un peut-il point quelque chose d'évident, je suis absent?

Merci!

Dernière mise à JOUR Par Bahbar et Marcus réponses ci-dessous, j'ai fait un peu plus d'expériences et d'réglé ce problème. Adam de Bowen commentaire a été à la pointe. J'ai été absent à deux faits:

  1. J'avais besoin d'être mise à l'échelle vers le centre de la géométrie, je m'y intéressai.
  2. J'avais besoin pour appliquer les transformations dans l'ordre inverse de l'intuition (pour moi).

La première est une sorte d'évidence avec le recul. Mais pour ce dernier, pour d'autres de bons programmeurs/mauvais mathématiciens comme moi: - s'avère que mon intuition était d'exploitation en ce que le Livre Rouge appelle un "Grand Système de Coordonnées Fixe", dans lequel il y a un absolu de l'avion, et votre géométrie se déplace sur l'avion à l'aide de transformations. C'est OK, mais compte tenu de la nature des mathématiques derrière cumul de plusieurs transforme en une matrice, il est à l'opposé de la façon dont les choses fonctionnent réellement (voir les réponses ci-dessous ou Livre Rouge pour plus de détails). Fondamentalement, les transformations sont "appliqués" dans "ordre inverse" à la façon dont ils apparaissent dans le code. Voici la dernière solution de travail:

//source and dest are arbitrary rectangles.
float scaleX = dest.width /source.width;
float scaleY = dest.height /source.height;
Point sourceCenter = centerPointOfRect(source);
Point destCenter = centerPointOfRect(dest);

glTranslatef(destCenter.x, destCenter.y, 0.0);
glScalef(scaleX, scaleY, 0.0);
glTranslatef(sourceCenter.x * -1.0, sourceCenter.y * -1.0, 0.0);
//Draw geometry in question with its normal verts.
InformationsquelleAutor Ben Zotto | 2010-02-13