Trame invertite


8

Sto cercando di disegnare trame allineate con questo corpo fisico la cui origine del sistema di coordinate è al centro dello schermo. (XNA) Spritebatch ha la sua origine predefinita impostata nell'angolo in alto a sinistra. Le trame sono state posizionate correttamente, ma ho notato che le mie trame sono invertite verticalmente. Cioè, una trama di freccia rivolta verso l'alto, quando viene eseguito il rendering verso il basso. Non sono sicuro di dove vada storto con la matematica.

Il mio approccio è convertire tutto in unità di misura del fisico e disegnare di conseguenza.

        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();

dove Paddle :: Draw assomiglia a:

       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 di proiezione ortografica mi sembra a posto, ma ovviamente sto facendo qualcosa di sbagliato da qualche parte! Qualcuno può aiutarmi a capire cosa sto facendo di sbagliato qui?

Grazie


È scalenegativo? Fai qualcosa di speciale nel vertex / pixel shader per l'effetto che stai utilizzando (in particolare come manipoli / usi le coordinate della trama?) Inoltre, se stai usando XNA4, non vuoi passare l'effetto al Begin () call del batch, piuttosto che tentare di invocarlo manualmente?

la scala è generalmente compresa tra 50 e 150. Non è mai negativa. Non sto facendo nulla in più di quello che ho specificato qui. Creo l'effetto solo per usare la matrice di proiezione. Sto usando XNA4 e trasmetto l'effetto come parametro a Spritebatch.Begin (vedi l'ultimo parametro); ma quando l'ho fatto ... non è apparsa nessuna trama. Ho dovuto invocare manualmente per far apparire le trame sullo schermo.
brainydexter,

Oh, ho perso la chiamata Begin. In XNA, texcoords di (0,0) è l'angolo in alto a sinistra dell'immagine. Ma non sembra che tu abbia il controllo sufficiente dei texcoords qui per aver rovinato tutto.

Sì. Non capisco come spritebatch gestisca le matrici di proiezione in effetti e penso che sia qui che sta la risposta al mio problema.
brainydexter,

Puoi sempre controllare il codice sorgente di spritebatch (SpriteEffect) per vedere se aiuta la tua comprensione: create.msdn.com/en-US/education/catalog/sample/stock_effects
Joel Martinez

Risposte:


4

Guarda il riferimento di Matrix.CreateOrthographic e nota che dice questo:

L'area visibile di questa proiezione ortografica è centrata su 0,0,0. L'asse x dell'area varia da -width / 2 a larghezza / 2. L'asse y dell'area varia da -height / 2 all'altezza / 2.

Quindi, nel tuo caso, il bordo superiore dello schermo ha una coordinata Y di -scale / 2 invece di 0, e il bordo inferiore è scale / 2 invece di scale. E se stai disegnando un quadratino di dimensioni (10,10) alle coordinate (0, 0), il suo punto di origine sarà al centro dello schermo, ma poiché la tua Y positiva è verso il basso, la vedrai invertita.

Le tue scelte migliori sono solo di invertire il secondo parametro in modo che l'asse Y punti verso l'alto o definire la matrice ortografica con Matrix.CreateOrthographicOffCenter in modo da poter specificare manualmente l'origine del mondo.


0

Io penso che si dovrebbe essere in grado cose solo invertire utilizzando il matrice mondo effetti:

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

Invece di usare l'identità, come hai ora.

Spero che questo possa essere d'aiuto.


0

Non è necessario creare e assegnare manualmente le matrici di trasformazione del tuo effetto. Spritebatch li crea per te. Il modo più semplice è creare un effetto senza shader di vertici (a meno che tu non stia facendo qualcosa al di là della proiezione della visione del mondo prevista), dal momento che SpriteBatch ha già uno shader di vertici che si occuperà della trasformazione. Quindi utilizzerà il tuo pixel shader.

Inoltre, non sono sicuro che il modo in cui lo stai attualmente facendo funzioni correttamente, ma c'è un sovraccarico diverso spriteBatch.Beginche utilizza un effetto come parametro. Non sono sicuro che SpriteBatch possa assegnare correttamente l'effetto corrente se non lo trasmetti Begin().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.