la conversion de la position 3d à la 2d la position de l'écran
Je voudrais convertir une position 3d en 2d position de l'écran. J'ai eu un coup d'oeil à une question similaire: La projection d'un point 3D sur un écran en 2D coordonner , mais je ne comprends pas complètement. Je pensais que pour le calcul de la position 2d j'aurais besoin de la matrice de projection, mais je ne vois pas comment il est utilisé, en dehors de la conversion d'un point à l'emplacement de l'espace de coordonnées. D'ailleurs, est-cam.FieldOfView égal à farZ en OpenGL?
Quelqu'un pourrait-il svp m'aider à remplir cette fonction. Sont les paramètres suffisants pour calculer la position 2d? Pos est déjà un vecteur par rapport à la position de la caméra.
Vector2* convert(Vector3& pos, Matrix4& projectionMatrix, int screenWidth, int screenHeight)
{
float ratio = screenWidth / screenHeight;
...
screenX = screenWidth * ( 1.0f - screenX);
screenY = screenHeight * ( 1.0f - screenY);
return new Vector2(screenX, screenY);
}
OriginalL'auteur Pedro | 2011-10-13
Vous devez vous connecter pour publier un commentaire.
Me semble que ce serait quelque chose comme ça:
Ce que nous faisons ici, c'est juste en passant le Vecteur si les deux matrices de transformation: la vue, puis la projection. Après la projection, vous obtenez un vecteur Y et X compris entre -1 et 1. Nous ne la transformation appropriée pour obtenir réel les coordonnées des pixels et de retour d'un nouveau Vector2. Notez que la composante Z de 'pos' également stocker la profondeur du point, dans l'espace de l'écran, à la fin de la fonction.
Vous avez besoin de la " vue " de la matrice, car il définit l'endroit où l'appareil photo est situé et en rotation. La projection seulement définit la façon dont l'espace 3D est "aplati" sur l'espace 2D.
Un champ de vue n'est pas le farZ. Une matrice de projection a quelques paramètres, parmi eux:
Outre le problème de maths, vous pouvez utiliser directement le Vector2 au lieu d'un tas de répartition (retournant un pointeur). Vector2 est une structure légère et les pointeurs sont très susceptibles de causer des maux de tête dans ce contexte (où allez-vous le supprimer, et ainsi de suite). Notez également que j'ai utilisé 'const' références que nous n'avons pas les modifier, à l'exception du vecteur. Pour celui-ci, nous voulons une copie locale, c'est pourquoi il n'est pas une référence.
OriginalL'auteur Jean
Code précédent ne fonctionne que si vous ne le faites pas tout de rotations (pour exemple.
GL.Rotate(rotation_x, 1.0, 0.0, 0.0)
).Mais si vous n'voici le code:
OriginalL'auteur skolko
Je pense que vous êtes à la recherche d'un remplacement pour gluLookAt. Donné une position et de l'orientation, il convertit la géométrie de la scène en coordonnées d'écran pour le rendu. Comme le dit l'article, il s'appuie sur un certain nombre de fonctionnalités obsolètes de l'OpenGL, mais il fournit un exemple de code que vous pouvez mettre en œuvre à l'aide de votre vecteur /matrice de la bibliothèque. Des informations plus détaillées sur les matrices de projection est disponible à partir de ici.
Une fois que vous avez la matrice de projection il vous suffit de l'appliquer à vos vecteurs (post-multipliez votre scène de vecteurs par la matrice de projection) et ensuite il suffit de déposer la composante Z du vecteur résultant ... qui est, il suffit d'utiliser les composants X et Y de la résultante des vecteurs.
OriginalL'auteur andand