Estou tentando desenhar texturas alinhadas com esse corpo físico cuja origem do sistema de coordenadas está no centro da tela. (XNA) Spritebatch tem sua origem padrão definida no canto superior esquerdo. Consegui posicionar as texturas corretamente, mas notei que minhas texturas estão invertidas verticalmente. Ou seja, uma textura de seta apontando para cima, quando renderizada aponta para baixo. Não sei ao certo onde estou errado com a matemática.
Minha abordagem é converter tudo em unidades de medidor de física e desenhar de acordo.
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();
onde Paddle :: Draw se parece com:
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);
A matriz de projeção ortográfica parece boa para mim, mas obviamente estou fazendo algo errado em algum lugar! Alguém pode me ajudar a descobrir o que estou fazendo de errado aqui?
obrigado
fonte
scale
negativo? Você faz algo especial no sombreador de vértice / pixel para o efeito que está usando (especificamente como você manipula / usa coordenadas de textura?) Além disso, se você estiver usando o XNA4, não deseja passar o efeito para o efeito Chamada Begin () do lote, em vez de tentar invocá-lo manualmente?Respostas:
Veja a referência de Matrix.CreateOrthographic e observe que ele diz o seguinte:
A área visível desta projeção ortográfica está centrada em 0,0,0. O eixo x da área varia de -width / 2 a width / 2. O eixo y da área varia de-altura / 2 a altura / 2.
Portanto, no seu caso, a borda superior da tela tem uma coordenada Y de -escala / 2 em vez de 0, e a borda inferior é escala / 2 em vez de escala. E se você estiver desenhando um quadrilátero de tamanho (10,10) nas coordenadas (0, 0), seu ponto de origem estará no centro da tela, mas como seu Y positivo está para baixo, você o verá invertido.
Suas melhores opções são apenas inverter o segundo parâmetro para que seu eixo Y aponte para cima ou definir a matriz ortográfica com Matrix.CreateOrthographicOffCenter para especificar manualmente a origem do mundo.
fonte
Eu acho que você deve ser capaz de inverter as coisas usando sua matriz mundial de efeitos:
Em vez de usar a identidade, como você tem agora.
Eu espero que isso ajude.
fonte
Não há necessidade de criar e atribuir manualmente matrizes de transformação do seu efeito. Spritebatch cria isso para você. A maneira mais simples é criar um efeito sem sombreador de vértice (a menos que você esteja fazendo algo além da projeção de visão de mundo esperada), pois o SpriteBatch já possui um sombreador de vértice que cuidará da transformação. Em seguida, ele usará seu pixel shader.
Além disso, não tenho certeza se a maneira como você está fazendo atualmente funciona corretamente, mas há uma sobrecarga diferente
spriteBatch.Begin
que leva um efeito como parâmetro. Não tenho certeza se o SpriteBatch pode atribuir corretamente ao efeito atual se você não o transmitirBegin()
.fonte