7
votes

Obtenir des coordonnées d'espace d'écran de sommets spécifiques d'un modèle 3D lorsqu'il est visible

J'aimerais reporter un modèle, alors, si des verticies particulières (comment je les marquerais?) Sont visibles, je veux rendre quelque chose de 2D où ils sont.

Comment allais-je faire cela?


0 commentaires

3 Réponses :


1
votes

Probablement la meilleure façon de le faire est avec un limitefrustrum . C'est fondamentalement comme un rectangle qui se dégage dans une certaine direction, similaire à la façon dont la caméra de joueur fonctionne. Ensuite, vous pouvez vérifier si le point donné que vous voulez est contenu dans la limitefrustrum, et s'il est, puis rendez votre objet.

Fondamentalement, la forme qu'il fait ressemble à ceci: forme d'une limitefrustrum

exemple: xxx

L'exemple est en fait pour éliminer tous les objets du jeu, mais il peut être assez facile à modifier pour gérer ce que vous voulez faire.

exemple Source: http://nfostergames.com/lessons/simpleviewculling.htm

Pour obtenir votre monde de coordination dans l'espace de l'écran, Jetez un coup d'œil à Viewport.Project < / a>.


0 commentaires

7
votes

Tout d'abord, vous avez besoin de votre position de vertex sous forme de Vector4 code> (Projections de perspective nécessite l'utilisation de coordonnées homogènes; définir w = 1 code>). Je suppose que vous savez quel sommet que vous voulez et comment obtenir sa position. Sa position sera dans un espace modèle.

transforme maintenant simplement cela point dans l'espace de projection. C'est-la multiplier par votre matrice de projection de la vue mondiale. C'est-à-dire: p> xxx pré>

maintenant votre résultat sera dans l'espace de projection, qui est (-1, -1) dans le coin inférieur gauche de l'écran et (1,1 ) dans le coin supérieur droit. Si vous souhaitez obtenir votre position dans l'espace client (qui est ce que spritbatch code> utilise), alors transformez-le simplement à l'aide de l'inverse d'une matrice qui correspond à la matrice de projection de la vue implicite utilisée par Spritbatch

Viewport vp = GraphicsDevice.Viewport;
Matrix invClient = Matrix.Invert(Matrix.CreateOrthographicOffCenter(0, vp.Width, vp.Height, 0, -1, 1));
Vector2 clientResult = Vector2.Transform(new Vector2(result.X, result.Y), invClient);


2 commentaires

Pour obtenir les coordonnées de la gamme [1, -1], il est nécessaire d'effectuer une division par le composant homogène. Le code devrait être: vector4 aux = vector4.transform (nouveau vector4 (position, 1), Viette du monde); résultat.x = aux.x /aux.w; résultat.y = aux.y /aux.w; résultat.z = aux.z /aux.w; J'ai essayé d'éditer Andrew Réponse mais il a été rejeté ... :(


Vous avez parfaitement raison. J'ai modifié ma réponse pour en tenir compte.