Pergunta

Estou tentando descobrir como desenhar gráficos no XNA, e outra pessoa sugeriu isso. Mas antes de tentar usar isso ...

Se eu criar e usar esta câmera e definir para a esquerda, de cima para 0 e largura = 256 e altura = 240, qualquer coisa que eu renderize na tela usará essas coordenadas? Então, uma caixa com largura e altura de 1, se definido como 0,0, ocupará espaço de 0,0 a 1,1?

Foi útil?

Solução

A função a que você está se referindo é: Matrix.CreateOrthographicOffCenter(left, right, bottom, top, zNearPlane, zFarPlane).

Isso retorna uma matriz de projeção que pode ser usada para transformar um ponto no espaço mundial em um ponto no espaço de projeção.

O espaço de projeção vai de (-1, -1) no canto inferior esquerdo da viewport para (1,1) no canto superior direito. Este é o espaço de coordenadas em que a GPU realmente funciona ao rasterizar.

O espaço mundial é o que você quiser.

Então, digamos que você crie uma matriz com Matrix.CreateOrthographicOffCenter(0, 256, 240, 0, -10, 10), e você usou essa matriz como sua matriz de projeção com o BasiceFeft para desenhar um modelo de um cubo. Digamos que o modelo do cubo esteja centrado na origem e é do tamanho 1 (comprimento, largura e altura).

Assim como basicEffect.Projection, você faria basicEffect.View = Matrix.Identity (porque não queremos uma transformação adicional da câmera) e basicEffect.World = Matrix.CreateTranslation(0.5f, 0.5f, 0) Traduzir seu modelo para que ele exista de (0,0) para (1,1) no espaço mundial. Em seguida, desenhe seu modelo usando esse Basiceffet.

A face superior do seu cubo (a projeção ortográfica significa que não há perspectiva) será desenhada no canto superior esquerdo da viewport. Levará 1/256 da largura e 1/240th da altura da viewport (veja também GraphicsDevice.Viewport).

(PS: Não me lembro como o abate de backface é afetado por esse tipo de projeção. Se você não vê nada, tente desligá -lo ou alternar a ordem de enrolamento.)


Agora, dito isso - sinto uma sensação de suas outras perguntas (e do fato de você querer fazer uma matriz ortográfica) que deseja fazer o trabalho 2D Sprite. A BasiceFeff é projetada principalmente para fazer o trabalho em 3D (embora se você fizer seu próprio shadex de vértice, não recomendado para sprites, precisará de uma matriz de projeção).

Você provavelmente quer usar o spritebatch da XNA - principalmente porque é pesadamente otimizado para sprites de desenho. SpriteBatch.Begin vai levar um Matrix transformMatrix como um argumento. Isso é equivalente ao mundo e à matriz de visão, acima, não a matriz de projeção.

O SpriteBatch assume que seu espaço mundial é o mesmo que o espaço do cliente (o canto superior esquerdo é (0,0), a largura e a altura são do tamanho da viewport) e lida com a projeção para você. (Na verdade, é mais avançado que isso - aplicará um deslocamento para você, para que os pixels Sprite se alinhem com pixels de tela.)

Se você quiser desenhar sprites para que o mundo pareça 256 unidades de largura e 240 unidades de altura na viewport, você pode passar uma matriz como essa para SpriteBatch.Begin:

Matrix.CreateScale(viewport.Width / 256f, viewport.Height / 240f, 1f)

Vale a pena notar que no novo XNA 4.0 você pode Use SpriteBatch para desenhar com shaders de vértice personalizados E assim você pode usar matrizes arbitrárias de projeto de vista do mundo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top