2009-03-31 11 views
13

Je souhaite déterminer les coordonnées d'écran 2D (x, y) des points dans l'espace 3D (x, y, z).Projection en perspective - Aidez un Noob

Les points que je souhaite projeter sont des points du monde réel représentés par les coordonnées GPS et l'élévation au-dessus du niveau de la mer.

Par exemple: Point (Lat: 49,291882, Long: -123,131676, Hauteur: 14m)

La position de la caméra et la hauteur peut également être déterminée en tant que x, y, z point. J'ai aussi le cap de la caméra (degrés boussole), son degré d'inclinaison (au-dessus/en dessous de l'horizon) et le roulis (autour de l'axe z). Je n'ai aucune expérience de la programmation 3D, j'ai donc lu le sujet de la projection de perspective et j'ai appris qu'il nécessite des connaissances sur les matrices, les transformations, etc., ce qui m'embrouille complètement à l'heure actuelle.

On m'a dit que OpenGL peut être utile pour construire un modèle 3D des points du monde réel, configurer l'orientation de la caméra et récupérer les coordonnées 2D des points 3D.

Cependant, je ne suis pas sûr si vous utilisez OpenGL est la meilleure solution à ce problème et même si elle est je ne sais pas comment créer des modèles, installer des caméras etc

Quelqu'un pourrait-il proposer la meilleure méthode pour résoudre mon problème? Si OpenGL est une solution réalisable, je devrais utiliser OpenGL ES si cela fait une différence. Oh et quelle que soit la solution que je choisis, elle doit s'exécuter rapidement.

Merci pour votre aide

+0

Avez-vous w fourmi pour dessiner des choses ou voulez-vous juste calculer quelques points? –

Répondre

4

vous avez besoin en effet un perspective projection et matrix operations grandement simplifier le faire. Je suppose que vous êtes déjà au courant que votre spherical coordinates doit être transformé en Cartesian coordinates pour ces calculs.

L'utilisation de OpenGL vous ferait probablement gagner beaucoup de travail en lançant le vôtre software rasterizer. Donc, je conseillerais d'abord trying it. Vous pouvez prototyper votre système sur un PC puisque OpenGL ES n'est pas trop différent tant que vous le gardez simple.

+0

Je ne savais pas que je devais me transformer en coordonnées cartésiennes, alors merci pour cela. En ce qui concerne OpenGL, je vais essayer d'implémenter une solution en utilisant des méthodes pour configurer la position de la caméra et, je crois, un mécanisme pour obtenir la projection 2D du modèle 3D. Connaissez-vous de bons tutoriels? –

+0

Ce sont des tutoriels classiques portés à plusieurs langues: http://nehe.gamedev.net/ –

2

Si vous avez juste besoin de calculer les coordonnées de certains points, vous n'avez besoin que de quelques compétences en algèbre, pas de programmation 3D avec openGL.

De plus openGL ne traite pas avec les coordonnées géographiques

d'abord obtenir une doc sur WGS84 et les coordonnées géodésiques, vous devez d'abord convertir vos données GPS dans un cadre cartésien (par exemple la terre centrée sur le cadre cartésien dans lequel est défini l'ellipsoïde WGS84).

Ensuite, les calculs avec matrice peuvent avoir lieu. La chaîne de transformations est à peu près:

  • WGS84
  • coordonnées centré sur la terre
  • certaines trames local
  • cadre de la caméra
  • projection 2D

Pour la première conversion voir this Le dernier implique une matrice de projection Les autres sont seulement des rotations de coordonnées et de traduction. La "trame locale" est la trame cartésienne locale dont l'origine correspond à l'emplacement de la caméra tangente à l'ellipsoïde.

2

Je recommanderais «Mathématiques pour la programmation de jeux 3D et les infographies» par Eric Lengyel. Il couvre les matrices, les transformations, la vision frustum, la projection perspective et plus encore.

Il existe également un bon chapitre dans le Guide de programmation OpenGL (livre rouge) sur la visualisation des transformations et la mise en place d'une caméra (y compris comment utiliser gluLookAt). Si vous n'êtes pas intéressé par l'affichage de la scène 3D et êtes limité à l'utilisation d'OpenGL ES, il peut être préférable d'écrire simplement votre propre code pour faire le mappage de la fenêtre 3D vers la fenêtre 2D. Pour commencer, vous pouvez télécharger Mesa 3D, une implémentation open source d'OpenGL, pour voir comment ils implémentent gluPerspective (pour définir une matrice de projection), gluLookAt (pour définir une transformation de caméra) et gluProject (pour projeter un point 3D sur des coordonnées de fenêtre 2D).

12

Voici une réponse très générale. Dites que l'appareil photo est sur (Xc, Yc, Zc) et que le point que vous voulez projeter est P = (X, Y, Z). La distance entre la caméra et le plan 2D sur lequel vous projetez est F (donc l'équation du plan est Z-Zc = F). Les coordonnées 2D de P projetées sur le plan sont (X ', Y').

Puis, très simplement:

X '= ((X - Xc) * (F/Z)) + Xc

Y' = ((Y - Yc) * (F/Z)) + Yc

Si votre appareil photo est l'origine, cela simplifie à:

X '= X * (F/Z)

Y' = Y * (F/Z)

+0

Ne devrait pas les deux premières équations lire «X» = ((X - Xc) * (F/(Z-Zc))) + Xc' et 'Y '= ((Y - Yc) * (F/(Z-Zc))) + Yc'? –

+1

@rofrankel Et si je veux projeter un point avec Z = 0? – 0x6B6F77616C74

Questions connexes