2010-08-28 26 views
0

Étant donné que je fais quelque chose comme ceci:Cairo Matrix equivillant de GlOrtho Matrix?

void glOrtho( GLdouble left, 
    GLdouble right, 
    GLdouble bottom, 
    GLdouble top, 
    GLdouble nearVal, 
    GLdouble farVal); 

et le résultat est: http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml w que je pourrais obtenir une matrice comme ceci:

http://cairographics.org/manual/cairo-matrix.html

J'ai essayé ceci:

cairo_matrix_t mat; 
      mat.xx = 2/(right - left); 
      mat.yx = 0; 
      mat.xy = 2/(top - bottom); 
      mat.yy = 0; 
      mat.x0 = 0; 
      mat.y0 = 0; 

cairo_set_matrix(cr,&mat); 

Mais cela n'a pas fonctionné. Comment pourrais-je réaliser la même matrice que GlOrtho au Caire? Merci

+0

Je ne sais pas du Caire, mais il ressemble à 'cairo_matrix_t' est une matrice 3x3, pas un 4x4 comme les OpenGL. Si vos points sont comme '(x y 1)' (encore une fois je ne connais pas Cairo) vous devez enlever la troisième ligne et la colonne de la matrice GL, pas la quatrième – Tomaka17

+0

Alors que dois-je faire pour que ça fonctionne pour 3x3? – jmasterx

+0

Mais il n'a que 6 doubles, pas 9 – jmasterx

Répondre

0

Je ne sais pas le Caire, donc je vais supprimer ma réponse si un meilleur vient.

Selon les documents du Caire:

x_new = xx * x + xy * y + x0; 
y_new = yx * x + yy * y + y0; 

Lorsque vous utilisez OpenGL, la formule est comme: (m étant la matrice)

x_new = m(1,1) * x + m(1,2) * y + m(1,3) * z + m(1,4) 
y_new = m(2,1) * x + m(2,2) * y + m(2,3) * z + m(2,4) 
z_new = m(3,1) * x + m(3,2) * y + m(3,3) * z + m(3,4) 

(noter que, par souci de simplicité, je n'a pas mentionné la quatrième coordonnée)

Donc ce que vous avez à faire est de simplement faire correspondre les deux formules:

mat.xx = 2/(right - left); 
mat.yy = 2/(top - bottom); 
mat.xy = 0; 
mat.yx = 0; 
mat.x0 = -(right + left)/(right - left); 
mat.y0 = -(top + bottom)/(top - bottom); 

S'il vous plaît essayer ce

+0

Je ne pense pas que ça marche, je dessine et je ne vois jamais rien, – jmasterx

+0

Le problème est aussi que cette matrice OpenGL est construite pour les surfaces dont les coords vont (-1,1) à (1, -1). Je ne sais pas si c'est le cas pour le Caire – Tomaka17

+0

flotter à gauche; \t \t \t left = cameraX - ((flottant) engineGL.controls.MainGlFrame.Dimensions.x) * scalediv; \t \t \t flotteur droit; \t \t \t right = cameraX + ((flottant) engineGL.controls.MainGlFrame.Dimensions.x) * scalediv; \t \t \t fond flottant; \t \t \t bottom = cameraY - ((float) engineGL.controls.MainGlFrame.Dimensions.y) * scalediv; \t \t \t flotteur; \t \t \t top = cameraY + ((float) engineGL.controls.MainGlFrame.Dimensions.y) * scalediv; – jmasterx