J'essaie de dessiner des textures alignées avec ce corps physique dont l'origine du système de coordonnées est au centre de l'écran. (XNA) Spritebatch a son origine par défaut définie dans le coin supérieur gauche. J'ai réussi à positionner correctement les textures, mais j'ai remarqué que mes textures étaient inversées verticalement. Autrement dit, une texture de flèche pointant vers le haut, lorsque le rendu pointe vers le bas. Je ne sais pas où je me trompe avec les mathématiques.
Mon approche est de tout convertir en unités de mesure physique et de dessiner en conséquence.
Matrix proj = Matrix.CreateOrthographic(scale * graphics.GraphicsDevice.Viewport.AspectRatio, scale, 0, 1);
Matrix view = Matrix.Identity;
effect.World = Matrix.Identity;
effect.View = view;
effect.Projection = proj;
effect.TextureEnabled = true;
effect.VertexColorEnabled = true;
effect.Techniques[0].Passes[0].Apply();
SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, DepthStencilState.Default, RasterizerState.CullNone, effect);
m_Paddles[1].Draw(gameTime);
SpriteBatch.End();
où Paddle :: Draw ressemble:
SpriteBatch.Draw(paddleTexture,
mBody.Position,
null,
Color.White,
0f,
new Vector2(16f, 16f), // origin of the texture
0.1875f, SpriteEffects.None, // width of box is 3*2 = 6 meters. texture is 32 pixels wide. to make it 6 meters wide in world space: 6/32 = 0.1875f
0);
La matrice de projection orthographique me semble bien, mais je fais évidemment quelque chose de mal quelque part! Quelqu'un peut-il m'aider à comprendre ce que je fais mal ici?
Merci
la source
scale
négatif? Faites-vous quelque chose de spécial dans le vertex / pixel shader pour l'effet que vous utilisez (en particulier comment manipulez-vous / utilisez-vous les coordonnées de texture?) De plus, si vous utilisez XNA4, ne voulez-vous pas transmettre l'effet au Commencer () l'appel du lot, plutôt que d'essayer de l'invoquer manuellement?Réponses:
Regardez la référence de Matrix.CreateOrthographic et notez qu'il dit ceci:
La zone visible de cette projection orthographique est centrée sur 0,0,0. L'axe des x de la zone va de -largeur / 2 à largeur / 2. L'axe des y de la zone va de -hauteur / 2 à hauteur / 2.
Donc, dans votre cas, la bordure supérieure de l'écran a une coordonnée Y de -scale / 2 au lieu de 0, et la bordure inférieure est scale / 2 au lieu de scale. Et si vous dessinez un quadruple de taille (10,10) aux coordonnées (0, 0), son point d'origine sera au centre de l'écran, mais puisque votre Y positif est vers le bas, vous le verrez inversé.
Vos meilleurs choix consistent simplement à inverser le deuxième paramètre afin que votre axe Y pointe vers le haut ou à définir la matrice orthographique avec Matrix.CreateOrthographicOffCenter afin de pouvoir spécifier manuellement l'origine du monde.
la source
Je pense que vous devriez pouvoir inverser les choses en utilisant votre matrice de monde d'effets:
Au lieu d'utiliser l'identité, comme vous l'avez maintenant.
J'espère que ça aide.
la source
Il n'est pas nécessaire de créer et d'assigner manuellement les matrices de transformation de votre effet. Spritebatch les crée pour vous. Le moyen le plus simple est de créer un effet sans vertex shader (sauf si vous faites quelque chose en plus de la projection de vision du monde attendue), car SpriteBatch a déjà un vertex shader qui prendra en charge la transformation. Ensuite, il utilisera votre pixel shader.
De plus, je ne sais pas si la façon dont vous le faites actuellement fonctionne correctement, mais il y a une surcharge différente
spriteBatch.Begin
qui prend un effet comme paramètre. Je ne sais pas si SpriteBatch peut correctement être affecté à l'effet actuel si vous ne le transmettez pasBegin()
.la source