虽然我目前的项目是XNA,但这个问题是关于3D到2D映射的基本数学。事实上,出于同样的原因,让我们假设一个WinForms图形表面可以使用。
我有以下配置:
我想转换这些坐标并在2D表面上绘制它们。因此,根据相机,线段应从(x1,y1,z1),(x2,y2,z2)变换为(x1,y1),(x2,y2)。
答案 0 :(得分:1)
我认为您正在寻找正交或透视投影。如果你搜索它,网上有很多信息,但这里是要点。
观察原点的相机,沿z轴距离d
将(x,y,z)
处的一个点投影到一个平面上:
// Orthogonal
planar_x = x
planar_y = y
// Perspective
planar_x = x*d/(d-z)
planar_y = y*d/(d-z)
(10,10,10)
处相机与z轴距离为500
的点将具有平面坐标(10*500/(500-10), 10*500/(500-10)) = (10.204, 10.204)
(10,10,100)
处相机与z轴距离为500
的点将具有平面坐标(10*500/(500-100), 10*500/(500-100)) = (12.5, 12.5)
因此,形状越接近相机,它就越大。
要将平面模型坐标转换为像素坐标,请使用以下缩放
scale = max_model_size/Math.Min(Height,Width);
pixel_x = Width/2 + x/scale;
pixel_y = Height/2- y/scale;
这就是我可以使用GDI
在Windows窗体上绘制3D形状的方法。
当然,如果您想使用OpenGL
,请查看here以查找类似问题。