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:
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.
p>
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>