C# XNA 4.0 - Einfache Textur (3D) wird nicht angezeigt

Thaxll'ssillyia

Captain
Registriert
Dez. 2007
Beiträge
3.595
Hallo Community!

Ich beschäftige mich erst seit ca. 2 Wochen mit XNA (4.0) und bin bei einem Versuch auf ein Problem gestoßen.

Mein Projekt findet ihr im Anhang (gesplittet, da die Textur 5 MB groß ist)

Ich möchte mithilfe des VertexBuffers eine Wand mit einer Textur anzeigen (3D versteht sich).

Ich hatte es erst ohne eine spezielle Kamera probiert und da hat es funktioniert.

Nun wollte ich aber eine frei bewegliche Kamera benutzen, also hab ich diese hier eingebunden:
http://www.dhpoware.com/demos/xnaFirstPersonCamera.html

Ich habe aber trotzdem das Effect-File von Riemers Tutorial genommen:
http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Textured_triangle.php

Leider kann ich meine Textur nicht sehen, auf wenn ich mich drehe/bewege.
(Bewegen geht per WASD, Drehen über die Maus)

Oben in der Menüleiste hab ich mal die Position und den Betrachtungsvektor eingeblendet, die Daten passen eigentlich alle ganz gut.

Was mache ich falsch?

Vielen Dank für Hilfe!

Gruß Thax
 
Zuletzt bearbeitet:
Wieso versuchst du nicht direkt die Kamera zu bewegen anstatt eine fremde API zu benutzen. Ist doch eine einfach Vektorberechnung! Hatte mal auch nen Monat lang mit XNA beschäftigt. Es hat alles ohne Fremde APIs funktioniert!
 
Okay, ich habs jetzt noch mal selber probiert.

Was funktioniert ist:

- mithilfe der Maus umschauen
- Bewegen nach oben/unten (Space/Shift) und vor/zurück/links/rechts (WASD).

Was nicht funktioniert:

- Kamera bewegt sich nicht auf Mauszeiger zu, sondern entlang der jeweiligen Achse.
- Bei Umschauen mit der Maus dreht sich die Kamera zur Seite, sie wird also "schief"

Mein Code:

Code:
        protected override void Update(GameTime gameTime) // 60 Times per Second
        {
            ProcessInput();
            SetUpCamera();

            base.Update(gameTime);
        }

Code:
        private void SetUpCamera()
        {
            rotationMatrix *= Matrix.CreateRotationX(mouseDifferenceY / 1000) * 
Matrix.CreateRotationY(mouseDifferenceX / 1000);

            viewMatrix = Matrix.CreateLookAt(cameraPosition, cameraTarget,
 new Vector3(0, 1, 0)) *rotationMatrix;
        }

Jetzt komm ich leider nicht weiter. Ich kanns mir halt nicht mehr räumlich im Kopf vorstellen...
 
Zuletzt bearbeitet: (Code aktualisiert und im nächsten Post angehängt)
Was ist mit dem Link?
Versuch den Vektor für die Sicht zu berechnen nicht die einzelne Koordinaten... ich sehe mir mal dein Projekt an. Hab leider meinen alten Projekt nicht mehr! Muss auch noch XNA installieren!

Habs ausprobiert. Die Änderungen funktionieren. Leider hatte ich wenig zeit um alles genau durchzugehen, was bei mir zu einem Fehler führte, dass die Kamera sich von alleine bewegte!
 
Zuletzt bearbeitet:
Okay, bin jetzt ein gutes Stück weitergekommen.

Ich hab das ganze Projekt nochmal besser strukturisiert und kein eigenes VertexFormat genommen, sondern das XNA-eigene VertexPositionTexture (Projekt im Anhang).

Ich habe allerdings noch 2 Fragen/Probleme:

Die erste betrifft die Texturen auf einem Triangle. Dazu folgende Klasse, die mir einen Wall darstellt:

Code:
    public class Wall:BaseObject
    {
        public Wall(GraphicsDevice device):base(device)
        {
            vertices = new VertexPositionTexture[4];

            vertices[0] = new VertexPositionTexture(new Vector3(0, 0, 0), new Vector2(-1f, -5.5f));
            vertices[1] = new VertexPositionTexture(new Vector3(0, 0, -100), new Vector2(-1f, 0.0f));
            vertices[2] = new VertexPositionTexture(new Vector3(0, 20, 0), new Vector2(0f, -5.5f));
            vertices[3] = new VertexPositionTexture(new Vector3(0, 20, -100), new Vector2(0f, 0f));

            vertexBuffer = new VertexBuffer(device, VertexPositionTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
            vertexBuffer.SetData(vertices);

            indicies = new int[6];

            indicies[0] = 0; //Nur auf einer Seite
            indicies[1] = 1;
            indicies[2] = 2;

            indicies[3] = 1;
            indicies[4] = 2;
            indicies[5] = 3;

            //indicies[3] = 0; //Komischerweise auf beiden Seiten?
            //indicies[4] = 1;
            //indicies[5] = 3;

            //indicies[0] = 0;
            //indicies[1] = 2;
            //indicies[2] = 3;
        }
        public override void Draw()
        {
            device.SetVertexBuffer(vertexBuffer);
            device.DrawUserIndexedPrimitives(PrimitiveType.TriangleStrip, vertices, 0, 4, indicies, 0, 4);
        }
    }

Wie schon an der Auskommentierung zu erkennen, verstehe ich nicht, auf welcher Seite die Textur platziert wird. Dies scheint ja von der Reihenfolge des Index abhängig zu sein.
Wenn ich die Klasse so nehme wie oben gepostet, dann wird die Textur nur auf einer Seite angezeigt. Wenn ich allerdings die andere Indicies-Zuweisung nehme, dann wird sie auf beiden Seiten platziert.

-----------

Die andere Frage betrifft die Maussteuerung: Dezeit ist es noch möglich, die Kamera auf den Kopf zu stellen (über eine "Rückwärtsrolle"). Ich habe versucht, dieses Verhalten mit Begrenzen des UpVectors.Y zu unterbinden, allerdings hat dies keine Auswirkungen.
(Die Kamera ist in einer eigenen Klasse untergebracht -> in FreeCamera.cs)

Vielen Dank für weitere Hilfe!

Gruß Thax
 

Anhänge

Zuletzt bearbeitet:
Ich kann dir diese Seite hier empfehlen: XNAmag.de

Dort gibt es viele Leute die dir bei XNA weiterhelfen können.

(Ich hoffe dass das nicht als Werbung angesehen wird.)
 
Zurück
Oben