Ich versuche, Texturen zu zeichnen, die auf diesen Physikkörper ausgerichtet sind, dessen Koordinatensystem in der Mitte des Bildschirms liegt. (XNA) Bei Spritebatch ist der Standardursprung in der oberen linken Ecke festgelegt. Ich habe die Texturen richtig positioniert, aber ich habe festgestellt, dass meine Texturen vertikal invertiert sind. Das heißt, eine Pfeilstruktur, die nach oben zeigt, zeigt beim Rendern nach unten. Ich bin mir nicht sicher, wo ich mit der Mathematik falsch liege.
Mein Ansatz ist es, alles in Metereinheiten der Physik umzurechnen und entsprechend zu zeichnen.
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();
wo Paddle :: Draw aussieht wie:
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);
Die orthographische Projektionsmatrix scheint mir in Ordnung zu sein, aber ich mache offensichtlich irgendwo etwas falsch! Kann mir bitte jemand helfen, herauszufinden, was ich hier falsch mache?
Vielen Dank
quelle
scale
negativ? Tun Sie im Vertex / Pixel-Shader etwas Besonderes für den von Ihnen verwendeten Effekt (insbesondere wie manipulieren / verwenden Sie Texturkoordinaten?). Auch wenn Sie XNA4 verwenden, möchten Sie den Effekt nicht an den übergeben Beginnen Sie mit dem Aufruf des Stapels (), anstatt zu versuchen, ihn manuell aufzurufen?Antworten:
Sehen Sie sich die Referenz von Matrix.CreateOrthographic an und stellen Sie fest, dass dort Folgendes steht:
Der sichtbare Bereich dieser orthografischen Projektion ist auf 0,0,0 zentriert. Die x-Achse des Bereichs reicht von -width / 2 bis width / 2. Die y-Achse des Bereichs reicht von -Höhe / 2 bis Höhe / 2.
In Ihrem Fall hat der obere Rand des Bildschirms eine Y-Koordinate von -scale / 2 anstelle von 0, und der untere Rand ist scale / 2 anstelle von scale. Wenn Sie ein Quad der Größe (10,10) an den Koordinaten (0, 0) zeichnen, befindet sich sein Ursprungspunkt in der Mitte des Bildschirms. Da Ihr positives Y jedoch nach unten zeigt, wird es invertiert angezeigt.
Am besten invertieren Sie einfach den zweiten Parameter, sodass Ihre Y-Achse nach oben zeigt, oder definieren die orthografische Matrix mit Matrix.CreateOrthographicOffCenter, damit Sie den Weltursprung manuell angeben können.
quelle
Ich denke, Sie sollten in der Lage sein, Dinge mithilfe Ihrer Effektweltmatrix einfach umzukehren:
Anstatt die Identität zu verwenden, wie Sie es jetzt getan haben.
Ich hoffe das hilft.
quelle
Sie müssen die Transformationsmatrizen Ihres Effekts nicht manuell erstellen und zuweisen. Spritebatch erstellt diese für Sie. Am einfachsten ist es, einen Effekt ohne Vertex-Shader zu erstellen (es sei denn, Sie tun dort etwas anderes als die erwartete Weltanschauungsprojektion), da SpriteBatch bereits über einen Vertex-Shader verfügt, der sich um die Transformation kümmert. Dann wird Ihr Pixel-Shader verwendet.
Ich bin mir auch nicht sicher, ob die Art und Weise, wie Sie es gerade tun, richtig funktioniert, aber es gibt eine andere Überladung
spriteBatch.Begin
, die einen Effekt als Parameter verwendet. Ich bin nicht sicher, ob SpriteBatch den aktuellen Effekt richtig zuordnen kann, wenn Sie ihn nicht weitergebenBegin()
.quelle