Laden...

WPF - Koordinatensystem

Erstellt von cook vor 15 Jahren Letzter Beitrag vor 15 Jahren 7.923 Views
C
cook Themenstarter:in
193 Beiträge seit 2005
vor 15 Jahren
WPF - Koordinatensystem

Moin,
ich hab auch nochmal eine Frage. Fange grad etwas mit WPF und 3D an. Hab da ein kleines Verständnisproblem mit der Kamera in welche Richtung ich gerade sehe =)

Stand ist momentan einfach nur ein kleines rotes Dreieck 😉.

Jetzt habe ich eine "PerspectiveCamera“ mit der LookDirection=“0, 0, 1“ und der Position=“0,0,-10“. Ich bin jetzt davon ausgegangen das die Kamera sozusagen vor dem Bildschirm ist und in die Tiefe schaut (Noch richtig?). Meine erste Frage ist dann nämlich warum bei Beispielen, z.B. bei MSDN immer andersrum geschaut wird. Also von hinten aus dem Bildschirm raus.
Der Code den ich bis jetzt habe um mein Dreieck zu erzeugen sieht wie folgt aus:

            MeshGeometry3D triangleMesh = new MeshGeometry3D();
            Point3D point0 = new Point3D(5, 0, 0);
            Point3D point1 = new Point3D(0, 0, 0);
            Point3D point2 = new Point3D(0, 5, 0);
            triangleMesh.Positions.Add(point0);
            triangleMesh.Positions.Add(point1);
            triangleMesh.Positions.Add(point2);

            triangleMesh.TriangleIndices.Add(0);
            triangleMesh.TriangleIndices.Add(1);
            triangleMesh.TriangleIndices.Add(2);

            Material material = new DiffuseMaterial(new SolidColorBrush(Colors.Red));
            GeometryModel3D triangleModel = new GeometryModel3D(triangleMesh, material);
            ModelVisual3D model = new ModelVisual3D();
            model.Content = triangleModel;

            this.mainViewport.Children.Add(model); 

Das Dreieck wird aber jetzt falschrum angezeigt. Denke ich zumindest. Es sieht aus als wenn ich von hinten drauf schauen würde.

Wäre nett wenn mir jmd. Bei meinem Denkfehler helfen könnte ^^.

Gruß
Michael

1.044 Beiträge seit 2008
vor 15 Jahren

Hallo cook,

bist du dir sicher, dass die Koordinaten alle richtig sind bzw. auch die LookDirection und PerspectiveCamera? Hast du eine Rotation o.ä. verwendet? Auf MSDN gibt es auch ein Beispiel für ein Dreieck: http://msdn.microsoft.com/de-de/library/ms747393.aspx#fillpaint

zero_x

C
cook Themenstarter:in
193 Beiträge seit 2005
vor 15 Jahren

Ne, ich habe sonst keinerlei Transformationen oder Rotationen. Obiger Code ist alles. Ansonsten nurnoch ein ganz einfach Viewport3D. Die eingesetzte PerpectiveCamera hat nur die 2 oben genannten properties gesetzt.

Ich habe gestern abend noch einen Webcast zu WPF gesehen wo Bernd Marquardt auf die basics eingeht. Und auch da verwendet er als Camera position x=0, y=0 und z=4 ... das bedeutet für mich, dass wenn ein object auf z=0 liegt, würde ich von hinten gegen schauen oder nicht?!?!

Gruß
Michael

F
101 Beiträge seit 2007
vor 15 Jahren

liegt das vlt daran das du bei Position=“0,0,-10“ bist und in RICHTUNG 0,0,1 guckst??? das heisst: du bist mit der kamera UNTER 0 (du bist unter dem dreieck). Änder die -10 mal in 10... sollte dann eigentlich passen

C
cook Themenstarter:in
193 Beiträge seit 2005
vor 15 Jahren

Warum bin ich dann unter dem dreieck. Die -10 gibt doch meine Position auf der Z achse an. MINUS 10 würde doch dann bedeuten das die Kamera vor dem Monitor positioniert ist und die richtung 0,0,1 würde doch bedeuten das die Kamera in den Monitor rein schaut?!

Ich steh glaub ich total auf dem Schlauch ^^

F
101 Beiträge seit 2007
vor 15 Jahren

hups.. sorry... wörter vertauscht.. nicht unter sondern hinter dem dreieck.
Hoffentlich erklät das bild bei dir alles

C
cook Themenstarter:in
193 Beiträge seit 2005
vor 15 Jahren

Schonmal danke für die hilfe. Die Grafik hat mir schonmal etwas geholfen. Aber ich so leit es mir tut. Mein Dreieck zeigt er mir immernoch nicht an =). Der code ist ja wirklich so simpel wie er nur sein kann. Fällt einem da noch was auf?

Code behind:

            MeshGeometry3D triangleMesh = new MeshGeometry3D();
            Point3D point0 = new Point3D(5, 0, 0);
            Point3D point1 = new Point3D(0, 0, 0);
            Point3D point2 = new Point3D(0, 5, 0);
            triangleMesh.Positions.Add(point0);
            triangleMesh.Positions.Add(point1);
            triangleMesh.Positions.Add(point2);

            triangleMesh.TriangleIndices.Add(0);
            triangleMesh.TriangleIndices.Add(1);
            triangleMesh.TriangleIndices.Add(2);

            Material material = new DiffuseMaterial(new SolidColorBrush(Colors.Red));
            GeometryModel3D triangleModel = new GeometryModel3D(triangleMesh, material);
            ModelVisual3D model = new ModelVisual3D();
            model.Content = triangleModel;

            this.mainViewport.Children.Add(model);

XAML:

        <Viewport3D Name="mainViewport">
            <Viewport3D.Camera>
                <PerspectiveCamera Position="2.5, 2.5, 10" LookDirection="2.5, 2.5, -10" />
            </Viewport3D.Camera>
            
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <AmbientLight Color="White" />
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>

Hat es jetzt evtl. noch etwas mit den Normalen zu tun?

Danke schonmal

Gruß
Michael

F
101 Beiträge seit 2007
vor 15 Jahren

<PerspectiveCamera Position="2.5, 2.5, 10" LookDirection="2.5, 2.5, -10" />
zu
<PerspectiveCamera Position="0, 0, 10" LookDirection="0, 0, 0 (oder 1)" />

C
cook Themenstarter:in
193 Beiträge seit 2005
vor 15 Jahren

leider beides kein erfolg 🙁

F
101 Beiträge seit 2007
vor 15 Jahren

...Mein Dreieck zeigt er mir immernoch nicht an =). ...

moment mal... jetzt wird es garnicht mehr angezeigt?? oder immernoch falsch rum?

edit: probiers ma mit lookdirection 0, 0, -1

C
cook Themenstarter:in
193 Beiträge seit 2005
vor 15 Jahren

Ne es wird garnicht angezeigt. -1 hatte ich auch schon getestet. hab ja schon etwas mit den werten rum gespielt ...

Hier ist mal das kleine bsp. projekt. Evtl. hilfts ja...

Ganz schön traurig dat ich da schon net klar komme ^^

C
cook Themenstarter:in
193 Beiträge seit 2005
vor 15 Jahren

Hat sich erledigt, es funktioniert jetzt. Hatte wohl immer eine schlechte zusammenstellung von den eigenschaften die ich getestet hab.. pech halt =). So funktioniert es jetzt und ich raffs auch =)

XAML:

        <Viewport3D Name="mainViewport" ClipToBounds="True">
            <Viewport3D.Camera>
                <PerspectiveCamera LookDirection="0, 0, -0.1"  Position="0, 0, 10" FieldOfView="90" FarPlaneDistance="50" NearPlaneDistance="0" />
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <AmbientLight Color="White" />
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>

Code behind:

MeshGeometry3D triangleMesh = new MeshGeometry3D();
            Point3D point0 = new Point3D(5, 0, 0);
            Point3D point1 = new Point3D(0, 5, 0);
            Point3D point2 = new Point3D(0, 0, 0);

            triangleMesh.Positions.Add(point0);
            triangleMesh.Positions.Add(point1);
            triangleMesh.Positions.Add(point2);

            triangleMesh.TriangleIndices.Add(0);
            triangleMesh.TriangleIndices.Add(1);
            triangleMesh.TriangleIndices.Add(2);


            Material material = new DiffuseMaterial(new SolidColorBrush(Colors.Red));
            GeometryModel3D triangleModel = new GeometryModel3D(triangleMesh, material);
            ModelVisual3D model = new ModelVisual3D();
            model.Content = triangleModel;

            this.mainViewport.Children.Add(model);

Danke für eure hilfe 🙂

Gruß
Michael