Estoy tratando de dibujar texturas alineadas con este cuerpo de física cuyo origen del sistema de coordenadas está en el centro de la pantalla. (XNA) Spritebatch tiene su origen predeterminado establecido en la esquina superior izquierda. Obtuve las texturas para colocarlas correctamente, pero noté que mis texturas están invertidas verticalmente. Es decir, una textura de flecha apuntando hacia arriba, cuando se representa apuntando hacia abajo. No estoy seguro de dónde me estoy equivocando con las matemáticas.
Mi enfoque es convertir todo en unidades de medidor de física y dibujar en consecuencia.
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();
donde se ve Paddle :: Draw:
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 matriz de proyección ortográfica me parece bien, ¡pero obviamente estoy haciendo algo mal en alguna parte! ¿Alguien puede ayudarme a descubrir qué estoy haciendo mal aquí?
Gracias
fuente
scale
negativo? ¿Hace algo especial en el sombreador de vértices / píxeles para el efecto que está usando (específicamente, ¿cómo manipula / usa las coordenadas de textura?) Además, si está usando XNA4, ¿no desea pasar el efecto al ¿Iniciar () la llamada del lote, en lugar de intentar invocarlo manualmente?Respuestas:
Mire la referencia de Matrix.CreateOrthographic y observe que dice esto:
El área visible de esta proyección ortográfica se centra en 0,0,0. El eje x del área varía de -width / 2 a width / 2. El eje y del área varía de -altura / 2 a altura / 2.
Entonces, en su caso, el borde superior de la pantalla tiene una coordenada Y de escala / 2 en lugar de 0, y el borde inferior es escala / 2 en lugar de escala. Y si está dibujando un quad de tamaño (10,10) en las coordenadas (0, 0), su punto de origen estará en el centro de la pantalla, pero como su Y positiva está hacia abajo, la verá invertida.
Sus mejores opciones son simplemente invertir el segundo parámetro para que su eje Y apunte hacia arriba, o definir la matriz ortográfica con Matrix.CreateOrthographicOffCenter para que pueda especificar manualmente el origen del mundo.
fuente
Yo creo que debería ser capaz cosas invertidas usando su matriz mundo efectos:
En lugar de usar la identidad, como lo has hecho ahora.
Espero que esto ayude.
fuente
No es necesario crear y asignar manualmente las matrices de transformación de sus efectos. Spritebatch crea estos para ti. La forma más simple es crear un efecto sin sombreador de vértices (a menos que esté haciendo algo más allá de la proyección de visión del mundo esperada), ya que SpriteBatch ya tiene un sombreador de vértices que se encargará de la transformación. Luego usará su sombreador de píxeles.
Además, no estoy seguro de si la forma en que lo está haciendo actualmente funciona correctamente, pero hay una sobrecarga diferente
spriteBatch.Begin
que toma un Efecto como parámetro. No estoy seguro de si SpriteBatch puede asignar correctamente el efecto actual si no lo pasaBegin()
.fuente