Laden...

World, View, Projection in eigener Klasse, läuft ohne Fehler aber d. Fenster bleibt ungerendert

Erstellt von nagelfrank vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.935 Views
N
nagelfrank Themenstarter:in
3 Beiträge seit 2014
vor 10 Jahren
World, View, Projection in eigener Klasse, läuft ohne Fehler aber d. Fenster bleibt ungerendert

Überarbeitete Version
Hallo Leute,

Erstmal danke für die schnelle Antwort, Kritik nehme ich gerne an.
Benutze XNA Game 4.0
Benutze das Beispiel "Das erstes Dreieck"

Meine Aufgabenstellung: Diese 3 Zeilen die ursprünglich in der Game Klasse standen
in eine eigen Klasse zu schreibne.


Matrix world = Matrix.CreateTranslation(0, 0, 0);
Matrix view = Matrix.CreateLookAt(new Vector3(0,0,3),new Vector3(0,0,0),new Vector3(0,1,0));
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), 800f / 480f, 0.01f, 100f);

Das Thema Namespace habe ich angepackt:
Folgende Lösung gefunden


using AliasToMyClass = PerspectiveCamera.MyPerspectiveCamera;

Somit sieht meine Camera Klasse so aus


namespace PerspectiveCamera
{
    
    public class MyPerspectiveCamera
    {
        private Matrix world;
        private Matrix view;
        private Matrix projection;

        public MyPerspectiveCamera(Matrix world, Matrix view, Matrix projection)
        {
            // TODO: Complete member initialization
            this.world = world;
            this.view = view;
            this.projection = projection;

            
            world = Matrix.CreateTranslation(0, 0, 0);
            view = Matrix.CreateLookAt(new Vector3(0, 0, 3), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
            projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), 800f / 480f, 0.01f, 100f);
            
        }

Folgen Aufruf in der Game Klasse


MyPerspectiveCamera myPerespectiecCamera = new MyPerspectiveCamera(world,view,projection)

Beim Debuggen ist folgendes Aufgedacht:
Einzelschritt: Nichtbenutzercode "Microsoft.Xna.Framework.Vector3.Vector3" wird übersprungen. Zumindestens weiß ich jetzt das was fehlt. Ich vermute mal das,
das was ich wollte so nicht geht, das ich alles auf einmal übergegen kann.

Da liegt schon noch ein Grundlagenproblem vor!
Vielleicht hat noch jemand einen Tip für mich.

5.658 Beiträge seit 2006
vor 10 Jahren

Hi nagelfrank,

das Fenster bleibt ungerendert. Wahrscheinlich liegt es an der Übergabe.

Das ist eine sehr unspezifische Problembeschreibung, die viele Ursachen haben kann. Wir wissen weder, welche "Übergabe" du meinst noch, welche Technologie du überhaupt verwendest (WPF, XNA, DirectX?). Ich hab den Beitrag daher mal in das Grafik-Forum verschoben, in Basistechnologien und allgemeine .NET-Klassen hat die Frage jedenfalls nichts verloren (siehe Forenbeschreibung).

Dein Code sieht auch sehr unstrukturiert aus. Was macht die Camera-Klasse im Namespaces "Vertices"? Und warum ist die Camera-Klasse von einer Game-Klasse abgeleitet? Beides erscheint mir überhaupt nicht logisch, und auch deine Kommentare "struct Variablen dürfen nicht initializiert werden" und "Variablen in struct Anweisungen müssen public sein!" deuten darauf hin, daß du erstmal in die (C#- bzw. OOP-)Materie einsteigen solltest, bevor du dich mit solchen Problemen beschäftigst. Eine struct ist weder eine Variable noch eine Anweisung, sondern ein Datentyp.

Siehe dazu [FAQ] Wie finde ich den Einstieg in C#? und [FAQ] Wie finde ich den Einstieg in die 3D-Programmierung mit C#?.

Christian

Weeks of programming can save you hours of planning

N
nagelfrank Themenstarter:in
3 Beiträge seit 2014
vor 10 Jahren

Problem selber gelöst!
Eigene Klasse für die PerspectiveCamera


public class PerspectiveCamera
        {
            public static Matrix worldMatrix = Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);
            public static Matrix viewMatrix = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 3.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
            public static Matrix projectionMatrix = Matrix.CreatePerspectiveFieldOfView( MathHelper.ToRadians(45.0f), 800.0f / 480.0f, 0.01f, 100.0f);
        }

In der Gameklasse folgendes definiert:


protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);
            DrawBasicEffect();
            GraphicsDevice.SetVertexBuffer(vertexBuffer);
            
            foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes)
            {
                pass.Apply();
                GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
                // TODO: Add your drawing code here
            }
            base.Draw(gameTime);

Auf die Variablen der Class PerspectiveCamera zugreifen über PerspectiveCamera.


        }
        protected void DrawBasicEffect()
        {
            basicEffect.World = PerspectiveCamera.worldMatrix;
            basicEffect.View = PerspectiveCamera.viewMatrix;
            basicEffect.Projection = PerspectiveCamera.projectionMatrix;
            basicEffect.VertexColorEnabled = true;
        }

5.658 Beiträge seit 2006
vor 10 Jahren

Hi nagelfrank,

besonders gut durchdach scheint mir das aber nicht zu sein. Was macht z.B. die World Matrix in der Kamera-Klasse? Die World Matrix gehört normalerweise zu einem Objekt, das in der Szene irgendwo positioniert wird. Und aus welchem Grund sind die Felder der Kamera-Klasse statisch? Das mag zwar momentan keine Probleme verursachen, solange es nur eine Kamera in der Szene gibt, aber wie gesagt, besonders gut durchdacht scheint mir das nicht.

Christian

Weeks of programming can save you hours of planning

N
nagelfrank Themenstarter:in
3 Beiträge seit 2014
vor 10 Jahren

Hallo Christian,
danke für die Hinweise,
im Moment brauche ich nur eine Kamera.
Mir war es est mal wichtig das es funktiniert. Bin noch ein sehr blutiger Anfänger.
(mache auch Grundlagentraining über die Konsole Variablenübergabe usw. ):
Du beschreibst genau die Problatik die ich als Anfänger habe. In den verschieden
Tutorials über VertexPositionColor, stehen nämlich die drei Matrixen an 3 verschieden
Stellen, mal im LoadContent, mal bei Initialze, mal direkt im public Game. Hat mit Sicherheit alle 3 Möglichkeiten ihre Vor- und Nachteile. Soll erstmals ne Zwischenlösung sein, bis ich gemau Bescheid weiß. Als nächstes werde ich mein Dreieck in eine eigene Klasse schreiben, dann ein Tetrahedron usw, und zum Schluß soll z. B. das jeweilige Objekt über enum das zu zeichnendes Dreieck ausgewählt werden. Rein zum lernen.

Gruß Frank

5.658 Beiträge seit 2006
vor 10 Jahren

Ich halte für die richtige Herangehensweise. Besser erstmal kleine Vorhaben umsetzen, als sich am Anfang mit zu großen Projekten zu verzetteln. Aber trotz allem solltest du dich auch von Anfang an mit den Grundlagen der objektorientierten Programmierung auseinandersetzen. Wenn du bspw. den Unterschied zwischen einem statischen und einem nicht-statischen Feld kennst, kannst du dir später viele unangenehme Überraschungen ersparen.

Christian

Weeks of programming can save you hours of planning