Proyectando un punto 3D a una coordenada de pantalla 2D
Basado en la información del Capítulo 7 de Programación 3D para Windows (Charles Petzold), He intentado escribir como función auxiliar que proyecta un Point3D a un punto 2D estándar que contiene las coordenadas de pantalla correspondientes (x, y):
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);
}
Sin embargo, en las pruebas, esta función devuelve coordenadas de pantalla incorrectas (verificadas comparando las coordenadas 2D del mouse con una forma 3D simple). Debido a mi falta de experiencia en programación 3D, no sé por qué.
La sección de comentarios de bloque contiene cálculos de escala que pueden ser esenciales, sin embargo, no estoy seguro de cómo, y el libro continúa con MatrixCamera usando XAML. Inicialmente, solo quiero que un cálculo básico funcione independientemente de cuán ineficiente pueda ser comparado con Matrices.
Alguien puede aconsejar qué se debe agregar o cambiar?