Projetar um ponto 3D em uma coordenada da tela 2D
Com base nas informações do capítulo 7 doProgramação 3D para Windows (Charles Petzold), Tentei escrever como função auxiliar que projeta um Point3D em um ponto 2D padrão que contém as coordenadas da tela correspondentes (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);
}
No entanto, no teste, essa função retorna coordenadas incorretas da tela (verificadas comparando coordenadas 2D do mouse com uma forma 3D simples). Devido à minha falta de experiência em programação 3D, estou confuso sobre o porquê.
A seção comentada em bloco contém cálculos de escala que podem ser essenciais, mas não sei como, e o livro continua com a MatrixCamera usando XAML. Inicialmente, só quero que um cálculo básico funcione, independentemente de quão ineficiente possa ser comparado às matrizes.
Alguém pode aconselhar o que precisa ser adicionado ou alterado?