7
votes

Coordonnée 3D de 2D Point donné Caméra et plan d'affichage

Je souhaite générer des rayons de la caméra dans le plan de visionnage. Pour ce faire, j'ai besoin de ma position de la caméra ("œil"), de haut, de droite et de vecteurs (où est le vecteur de la caméra dans la direction de l'objet que la caméra regarde) et p, le point sur le plan de visualisation. Une fois que je les ai, le rayon généré est: xxx

où T est la distance le long du rayon (supposez t = 1 pour l'instant).

Ma question est, Comment puis-je obtenir les coordonnées 3D du point P étant donné qu'il est situé en position (i, j) sur l'avion de visualisation? Supposons que les coins supérieurs gauche et inférieur du plan de visualisation sont donnés.

Remarque: le plan de visualisation n'est pas réellement un plan dans le sens où il ne s'étend pas infiniment dans toutes les directions. Au contraire, on peut penser à cet avion comme une image de largeur. Dans la direction X, la plage est de 0 à> la largeur et dans la direction Y La plage est de 0 -> hauteur. Je souhaite trouver la coordonnée 3D du (i, j) e élément, 0


2 commentaires

Cela pourrait être à n'importe quel angle. Mais vous savez que le plan de visualisation est perpendiculaire à la caméra et est en direction de caméra_tawards . Ainsi, caméra_teowards est le vecteur perpendiculaire au plan de visualisation et caméra_eye + caméra_towards est le centre du plan de visualisation de la taille de la largeur de la taille *.


Désolé - a supprimé mon commentaire car j'ai fini par comprendre la question mieux. Mais (@all) Par souci de clarté Depuis que MyX a posté une réponse, j'ai demandé si le plan de visualisation pouvait être à n'importe quel angle, ou s'il s'agissait toujours d'un certain angle par rapport à la caméra.


3 Réponses :


2
votes

solution générale de l'iTNersection d'une ligne et d'un avion Voir http : //local.wasp.uwa.edu.au/~pbourke/geometry/planeline/

VOTRE GRAPHIQUE GRAPHICS LIB (OpenGL / DirectCX, etc.) peut avoir une façon standard de faire cela

Edit: Vous essayez de trouver l'intersection 3D d'un point d'écran (par exemple, un curseur de la souris) avec un objet 3D dans votre scène?


2 commentaires

Je n'essaie pas de trouver l'intersection d'une ligne et d'un avion. J'essaie réellement de générer la ligne. C'est-à-dire que le deuxième point final de la ligne est non connu et c'est ce que j'essaie de résoudre. Le "plan de visualisation" n'est que la terminologie. Ce n'est pas en fait un avion (puisqu'un avion s'étend infiniment dans toutes les directions). Plutôt ce "plan" a une dimension fixe et j'essaie de comprendre les coordonnées 3D de chacun des points de l'avion (les points de l'avion à partir de 0 à la largeur dans la direction x et 0 à la hauteur dans la direction de Y)


C'est ce que ces algorithmes atteignent. Vous pouvez identifier les polygones représentés dans un pixel, ainsi que les coordonnées barycentiriques dans it.



0
votes

Pour fonctionner à P, vous avez besoin de la distance de la caméra dans le plan de détourage à proximité (écran), de la taille de la fenêtre située dans le plan de détourage proche (ou de l'angle de vue, vous pouvez calculer la taille de la fenêtre à partir de la taille de la fenêtre. Afficher l'angle) et la taille de la fenêtre rendue.

  1. échelle de la position de l'écran sur la plage -1
  2. Échelle normalisée X, Y par la fenêtre View Window Taille
  3. échelle par les vecteurs droit et up de la caméra et résumez les résultats
  4. Ajoutez le regard sur le vecteur mis à l'échelle par la distance du plan de clipsage

    En effet, vous obtenez: xxx

    où x et y sont: xxx


2 commentaires

Quelle est la différence entre view_width et largeur?


@MYX: La largeur est la largeur de l'écran, généralement en pixels. View_Width est la largeur, dans les coordonnées du monde, de la fenêtre positionnée dans le plan de clip près de laquelle la caméra regarde.



0
votes

Lorsque je branché directement des formules suggérées dans mon programme, je n'ai pas obtenu de résultats corrects (peut-être que certains débogage devaient être effectués). Mon problème initial semblait être dans le malentendu des coordonnées (x, y, z) des points d'angle interpolant. Je traitais x, y, z-coordonnées séparément, où je ne devrais pas (et cela peut être spécifique à l'application, car la caméra peut être orientée dans n'importe quelle direction). Au lieu de cela, la solution s'est avérée une interpolation simple des points d'angle du plan de visualisation:

  • interpolez les points de coin inférieurs dans la direction I pour obtenir P1
  • interpolez les points de coin supérieurs dans la direction I pour obtenir P2
  • interpoler p1 et p2 dans la direction j pour obtenir les coordonnées mondiales du point final

0 commentaires