2017-06-20 2 views
0

Je me demande s'il existe un moyen facile de retourner les coordonnées y lors de l'utilisation de la projection perspective? Les discussions sur la question semblent se concentrer sur la projection orthographique. Je traduis mon jeu basé sur Canvas en OpenGL ES 2.0 et j'ai une détection de collision relativement complexe. Et beaucoup de syntaxe est basée sur l'axe y commence du haut de l'écran avec 0 et se termine sur le bas de l'écran de Thes par exemple 2560OpenGL ES 2.0: inverser les coordonnées y en utilisant la projection perspective

@Override 
public void onSurfaceChanged(GL10 unused, int width, int height) { 

    game_width = width; 
    game_height = height; 

    GLES20.glViewport(0, 0, width, height); 

    // while the width will vary as per aspect ratio. 
    final float ratio = (float) width/height; 
    final float left = -ratio; 
    final float right = ratio; 
    final float bottom = -1.0f; 
    final float top = 1.0f; 
    final float near = 1f; 
    final float far = 40.0f; 

    Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far); 

} 

Répondre

1

Il y a très peu de différence en utilisant la matrice orthogonale ou tronquée de sorte que le la réponse la plus simple serait simplement d'échanger les paramètres bottom et top ou même les définir à tout ce dont vous avez besoin.

Mais pour examiner un peu plus frustum:

Qu'est-ce que cette méthode fait est qu'il crée une matrice qui échelle les objets en fonction de la distance de near. Il est conçu pour qu'un objet au near soit mis à l'échelle par 1.0. Ainsi, par exemple, si vous mettez un rectangle avec des coordonnées left, right, top, bottom comme x et y puis near comme z et en utilisant aucune autre matrice, mais le résultat sera le tronc de cône exactement un rectangle plein écran.

Les objets qui sont plus proches de near ne seront généralement pas dessinés et ceux qui seront plus loin seront linéairement échelonnés en fonction de tous les paramètres, mais far. Le paramètre far n'affecte rien sauf l'endroit où vos objets cesseront d'être dessinés. Donc, dans la plupart des cas, il n'y a pas de différence si vous mettez une très grande valeur far mais une très importante; L'effet d'avoir une grande valeur far sera le test de précision de profondeur. Donc, lorsque vous utilisez le tampon de profondeur, assurez-vous que cette valeur est aussi petite que possible mais suffisamment grande pour voir tous vos objets.

Dans la plupart des cas, nous définissons le tronc de cône avec un angle de vue. Vous définissez la constante near, far et fov à partir de laquelle les paramètres de bordure sont ensuite calculés comme right = tan(fov)*near*0.5 et top = tan(fov)*near*0.5*(viewHeight/viewWidth). Ce ne sont là que quelques exemples car il y a plusieurs façons de le définir.

Dans votre cas, il n'y a aucune raison de ne pas définir ces valeurs à votre guise. Donc ayant quelque chose comme left = 0.0, right = width, bottom = height et top = 0.0. Mais alors vous avez encore besoin de définir des valeurs proches et lointaines qui doivent être positives. Ensuite, si vos objets sont à une distance de 0.0, ils seront tous coupés.

Pour éviter cela, il est préférable d'utiliser une procédure lookAt qui générera une autre matrice pouvant définir la position "caméra" dans votre scène. En le mettant simplement à z=-near, vous devriez voir les objets exactement comme avec la projection orthographique. Le problème est maintenant que si vous voulez "zoomer" en rapprochant l'appareil des objets, ces objets ne seront plus dessinés.

Pour réaliser quelque chose comme ça, vous devez définir une échelle maximale, par exemple maxZoom = 10.0. Ce que vous feriez alors est de diviser tous les paramètres de frontière (top, left ...) avec cette valeur. Vous devez également appliquer cette échelle à la valeur z dans votre matrice lookAt pour voir que la scène n'a pas été agrandie.

Donc, en général pour retourner les coordonnées, vous pouvez modifier les valeurs de bordure ou vous pouvez jouer avec regarder la matrice.Il y a aussi d'autres moyens, mais ils sont assez standards. J'espère que cela clarifie un certain nombre de choses pour vous.

+0

Merci pour votre réponse longue et agréable - se penchera sur ce plus et peut l'accepter en temps voulu – java