根据3D Programming For Windows (Charles Petzold)第7章中的信息,我试图编写一个辅助函数,将Point3D投影到包含相应屏幕坐标(x,y)的标准2D点上, :将3D点投影到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);
}
但在测试时,此函数返回不正确的屏幕坐标(通过比较2D鼠标坐标与简单的3D形状进行检查)。由于缺乏3D编程经验,我对此感到困惑。
块注释部分包含缩放计算可能是必不可少的,但我不知道如何,本书继续使用XAML的MatrixCamera。最初,我只想得到一个基本的计算工作,不管它与矩阵相比可能有多低效。
任何人都可以建议需要添加或更改什么吗?
X坐标,正面是右 y坐标,正向上 z坐标,正面向外(朝着你) 我相信这是右手坐标系。 原产地位于中心。目标是将X和Y坐标计算为-1.0和1.0之间的值,然后通过widht/height计算*。 – Ash 2009-02-06 06:00:09
对不起格式化,评论不喜欢回车:X坐标:正确是正确的。 Y坐标:正向上。 Z坐标:正面不在屏幕上(朝着你) – Ash 2009-02-06 06:01:44