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. P>
Comment allais-je faire cela? P>
3 Réponses :
Probablement la meilleure façon de le faire est avec un Fondamentalement, la forme qu'il fait ressemble à ceci:
p> exemple: p> 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. p> exemple Source: http://nfostergames.com/lessons/simpleviewculling.htm P> Pour obtenir votre monde de coordination dans l'espace de l'écran, Jetez un coup d'œil à Viewport.Project < / a>. p> p> limitefrustrum code>. 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.
Tout d'abord, vous avez besoin de votre position de vertex sous forme de 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> 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 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.
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);
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.
Vérifiez les fonctions d'abattage de l'occlusion de votre moteur. Pour XNA, vous pouvez consulter le guide-cadre (avec des échantillons) ici. P>