Guten Tag liebes Forum,
ich programmiere gerade eine Mathematik Klasse das fundamentale Methoden zur Verfügung stellt, und will nun die Projektion eines 3D Punktes auf eine Ebene(Bildschirm) implementieren_
Ich fand diesen gelungenen Wikipedia Artikel,
en.wikipedia.org/wiki/3D_projection
das ich auch anfangs implementiert hatte...
Nur gab es eben Probleme mit der World-Matrix weshalb ich hernach beschloss einfach die Projektion aus XNA zu übernehmen ( Viewport.Project).
Nun habe ich bemerkt, dass die Methode .Project ein 3-dimensionalen Vektor zurückgibt(um vermutlich die Tiefe zu speichern).
Relevant sind ja eigentlich die X und Y Komponente des Vektors.
Wie repräsentiert denn nun XNA 3d in 2d?
Muss ich etwa die X und Y Komponente des Vektors durch die Z Komponente teilen ?
Die X und Y Komponente liegen im Bereich -1 und 1 und werden deswegen zwischen Ursprung und Width, respektive Height verschoben .
Wie projiziert XNA ein Punkt im Raum auf ein Bildschirm?
So?
Lieben Dank!
EDIT:
Hier ein Beispiel:
Origin ist bei (0.1, 0.1, 250.0)
dann wird Origin verschoben auf
(0.1, 0.1, 500) Resultat: Identische Bildschirmkoordinaten.
Wie kann die Tiefe projiziert werden?
ich programmiere gerade eine Mathematik Klasse das fundamentale Methoden zur Verfügung stellt, und will nun die Projektion eines 3D Punktes auf eine Ebene(Bildschirm) implementieren_
Ich fand diesen gelungenen Wikipedia Artikel,
en.wikipedia.org/wiki/3D_projection
das ich auch anfangs implementiert hatte...
Nur gab es eben Probleme mit der World-Matrix weshalb ich hernach beschloss einfach die Projektion aus XNA zu übernehmen ( Viewport.Project).
Nun habe ich bemerkt, dass die Methode .Project ein 3-dimensionalen Vektor zurückgibt(um vermutlich die Tiefe zu speichern).
Relevant sind ja eigentlich die X und Y Komponente des Vektors.
Wie repräsentiert denn nun XNA 3d in 2d?
Muss ich etwa die X und Y Komponente des Vektors durch die Z Komponente teilen ?
C#-Quellcode
- public static Vector3<T> Project(Vector3<T> point, Matrix4x4<T> projection, Matrix4x4<T> view, Matrix4x4<T> world, int width, int height, int x, int y)
- {
- Matrix4x4<T> result = (world * view) * projection;
- Vector3<T> transformed = result * point;
- return new Vector3<T>((transformed.X.ParseToNumeric<T>() + 1.0) * 0.5 * width + x, (-transformed.Y.ParseToNumeric<T>() + 1.0) * 0.5 * height + y, transformed.Z.ParseToNumeric<T>() * (1.0 - 0.0) + 0.0);
- }
Die X und Y Komponente liegen im Bereich -1 und 1 und werden deswegen zwischen Ursprung und Width, respektive Height verschoben .
Wie projiziert XNA ein Punkt im Raum auf ein Bildschirm?
So?
Lieben Dank!
EDIT:
Hier ein Beispiel:
C#-Quellcode
- Vector3<double> origin = new Vector3<double>(0.1, 0.1, 50.0);
- Matrix4x4<double> view = Matrix4x4<double>.CreateLook(new Vector3<double>(0, 0, 5), new Vector3<double>(0, 0, 1), new Vector3<double>(0, 1, 0));
- Matrix4x4<double> projection = Matrix4x4<double>.CreateProjection(Math.PI / 4.0, panel1.Width / panel1.Height, 1.0, 500.0);
- Vector3<double> projected = Matrix4x4<double>.Project(origin, projection, view, Matrix4x4<double>.Identity(), panel1.Width, panel1.Height, 0, 0);
- pt0 = new PointF((float)projected.X, (float)projected.Y);
Origin ist bei (0.1, 0.1, 250.0)
dann wird Origin verschoben auf
(0.1, 0.1, 500) Resultat: Identische Bildschirmkoordinaten.
Wie kann die Tiefe projiziert werden?
Und Gott alleine weiß alles am allerbesten und besser.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „φConst“ ()