Texturas invertidas

8

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

brainydexter
fuente
Es scalenegativo? ¿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?
la escala generalmente oscila entre 50 y 150. Nunca es negativa. No estoy haciendo nada más de lo que especifiqué aquí. Creo el efecto solo para usar la matriz de proyección. Estoy usando XNA4, y paso el efecto como parámetro a Spritebatch.Begin (ver último parámetro); pero cuando hice eso ... no apareció la textura. Tuve que invocar manualmente para que las texturas comenzaran a aparecer en la pantalla.
brainydexter
Oh, perdí la llamada de Comenzar. En XNA, los códigos de texto de (0,0) son la esquina superior izquierda de la imagen. Pero no parece que tenga el control suficiente de los texcoords aquí para haberlo estropeado.
Sip. No entiendo cómo spritebatch maneja las matrices de proyección en efecto y creo que ahí es donde radica la respuesta a mi problema.
brainydexter
Siempre puede consultar el código fuente del spritebatch (SpriteEffect) para ver si ayuda a su comprensión: create.msdn.com/en-US/education/catalog/sample/stock_effects
Joel Martinez

Respuestas:

4

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.

r2d2rigo
fuente
0

Yo creo que debería ser capaz cosas invertidas usando su matriz mundo efectos:

effect.World = Matrix.CreateScale(1, -1, 1);

En lugar de usar la identidad, como lo has hecho ahora.

Espero que esto ayude.

VeraShackle
fuente
0

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.Beginque toma un Efecto como parámetro. No estoy seguro de si SpriteBatch puede asignar correctamente el efecto actual si no lo pasa Begin().

Tim R.
fuente