In base alle informazioni nel capitolo 7 di 3D Programming For Windows (Charles Petzold), ho tentato di scrivere come funzione di supporto che proietta un Point3D in un punto 2D standard che contiene le coordinate dello schermo corrispondenti (x, y) :Proiezione di un punto 3D a una coordinata dello schermo 2D
public Point Point3DToScreen2D(Point3D point3D,Viewport3D viewPort)
{
double screenX = 0d, screenY = 0d;
// Camera is defined in XAML as:
// <Viewport3D.Camera>
// <PerspectiveCamera Position="0,0,800" LookDirection="0,0,-1" />
// </Viewport3D.Camera>
PerspectiveCamera cam = viewPort.Camera as PerspectiveCamera;
// Translate input point using camera position
double inputX = point3D.X - cam.Position.X;
double inputY = point3D.Y - cam.Position.Y;
double inputZ = point3D.Z - cam.Position.Z;
double aspectRatio = viewPort.ActualWidth/viewPort.ActualHeight;
// Apply projection to X and Y
screenX = inputX/(-inputZ * Math.Tan(cam.FieldOfView/2));
screenY = (inputY * aspectRatio)/(-inputZ * Math.Tan(cam.FieldOfView/2));
// Convert to screen coordinates
screenX = screenX * viewPort.ActualWidth;
screenY = screenY * viewPort.ActualHeight;
// Additional, currently unused, projection scaling factors
/*
double xScale = 1/Math.Tan(Math.PI * cam.FieldOfView/360);
double yScale = aspectRatio * xScale;
double zFar = cam.FarPlaneDistance;
double zNear = cam.NearPlaneDistance;
double zScale = zFar == Double.PositiveInfinity ? -1 : zFar/(zNear - zFar);
double zOffset = zNear * zScale;
*/
return new Point(screenX, screenY);
}
Su test tuttavia questa funzione restituisce coordinate dello schermo non corretti (verificata confrontando 2D del mouse coordinate contro una semplice forma 3D). A causa della mia mancanza di esperienza di programmazione 3D, sono confuso sul perché.
La sezione dei commenti del blocco contiene calcoli di ridimensionamento che possono essere essenziali, tuttavia non so come, e il libro continua con MatrixCamera utilizzando XAML. Inizialmente voglio solo ottenere un calcolo di base funzionante indipendentemente da quanto possa essere inefficiente rispetto a Matrici.
Qualcuno può consigliare cosa deve essere aggiunto o modificato?
X coordinata, positivo è destra coordinata, positivo è su coordinata z, positivo è fuori schermo (verso di voi) Credo che questo sia il sistema di coordinate della mano destra. L'origine è al centro. L'obiettivo è calcolare le coordinate X e Y come valori compresi tra -1,0 e 1,0, quindi * per larghezza/altezza. – Ash
Siamo spiacenti per la formattazione, i commenti non mi piacciono i ritorni a capo: coordinata X: il positivo è giusto. Coordinata Y: positivo è attivo. Coordinata Z: positivo è fuori dallo schermo (verso di te) – Ash