2010-01-15 4 views
1

Je fais mes premiers pas avec OpenGL ES 2.0 en essayant des choses sur mon ipod touch. Je me demandais comment résoudre ce problème de coordonnées ..OpenGL 2.0 ES coordonnées

Pour mieux expliquer, j'essayais de dessiner un quad et de le faire pivoter/traduire en utilisant un vertex shader (aussi parce que d'après ce que j'ai lu, il semble que la seule façon de fais le).

Depuis que je travaille avec un ipod J'ai un rapport 1.5 : 1 et une fenêtre définie par

glViewport(0, 0, backingWidth, backingHeight); 

Alors 0,0 est le centre et les limites de coupure devrait être à -1.0, -1.0, -1.0, 1.0, etc (à droite?)

pour dessiner un carré me fallait utiliser des valeurs différentes pour les coordonnées x et y en raison du rapport d'aspect:

static const GLfloat lineV[] = { 
     -0.5f, 0.33f, 0.5f, 0.33f, 
     0.5f, 0.33f, 0.5f,-0.33f, 
     0.5f,-0.33f, -0.5f,-0.33f, 
     -0.5f,-0.33f, -0.5f, 0.33f, 
     -0.5f, 0.33f, 0.5f,-0.33f, 
     0.5f, 0.33f, -0.5f,-0.33f, 
    }; 

Il est un carré avec les deux diagonales (je sais que l'utilisation d'indices serait plus efficace, mais ce n'est pas le point) ..

J'essayé d'écrire un vertex shader pour faire tourner l'objet tout en le déplaçant:

void main() 
{ 
    m = mat4(cos(rotation), sin(rotation), 0.0, 0.0, 
      -sin(rotation), cos(rotation), 0.0, 0.0, 
         0.0,   0.0, 1.0, 0.0, 
         0.0,   0.0, 0.0, 1.0); 

    m2 = mat4(1.0); 
    m2[1][3] = sin(rotation)*0.8; 
    gl_Position = position*(m*m2); 
} 

Cela fonctionne mais comme les coordonnées ne sont pas les mêmes, le quad est déformé pendant la rotation. Comment devrais-je empêcher cela? Je pensais que s'il était possible de changer la vue tronconique pour avoir des limites différentes (pas de -1.0 à 1.0 sur les deux axes, de sorte que l'agrandissement sur l'axe des y résoudrait le problème).

De plus, existe-t-il une meilleure façon d'utiliser les matrices? Je veux dire, j'avais l'habitude d'utiliser glRotatef sans avoir à spécifier toute la matrice .. est-ce que les fonctions de commodité/constructeurs existent pour accomplir cette tâche?

Répondre

0

Aucune fonction de surabondance ou de soutien n'est fournie par ce que j'ai vu. Fondamentalement, je l'ai résolu en utilisant des coordonnées égales lors de la construction des sommets et en utilisant un vertex shader pour mettre à l'échelle sur l'axe y par le bon ratio d'aspect.

0

Les premiers arguments à glViewport() ne sont pas le centre, ce sont les coordonnées du coin inférieur gauche.

Vous devez probablement configurer une projection qui prend en compte votre aspect, en utilisant généralement gluPerspective() (si GLU est disponible en ES).