Basado en información en el Capítulo 7 de 3D Programming For 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) :Proyectando un punto 3D a una coordenada de pantalla 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);
}
en las pruebas sin embargo, esta función devuelve las coordenadas de pantalla incorrectas (comprobado mediante la comparación de las coordenadas 2D de ratón contra una sencilla forma 3D). Debido a mi falta de experiencia en programación en 3D, estoy confundido sobre por qué.
La sección de comentario del bloque contiene cálculos de escalado que pueden ser esenciales, sin embargo no estoy seguro de cómo, y el libro continúa con MatrixCamera utilizando XAML. Inicialmente, solo quiero que funcione un cálculo básico, independientemente de cuán ineficiente sea en comparación con Matrices.
¿Alguien puede aconsejar qué se debe agregar o cambiar?
de coordenadas X, es positivo derecho y coordenada y, positivo está arriba coordenada z, positivo está fuera de la pantalla (hacia usted) Creo que este es el sistema de coordenadas de la derecha. El origen está en el centro. El objetivo es calcular la coordenada X e Y como valores entre -1.0 y 1.0, luego * por widht/height. – Ash
Disculpa por el formateo, a los comentarios no les gustan los retornos de carro: Coordenada X: positivo es correcto. Coordenada Y: positivo está arriba. Coordenada Z: positivo está fuera de la pantalla (hacia usted) – Ash