在3D中渲染点或平面

时间:2014-05-01 12:02:12

标签: c# .net 3d xna

虽然我目前的项目是XNA,但这个问题是关于3D到2D映射的基本数学。事实上,出于同样的原因,让我们假设一个WinForms图形表面可以使用。

我有以下配置:

  • 相机位置(x = 0,y = 0,z = 0)和方向矢量(x = 0,y = 0,z = 0)。
  • 3D中具有以下几点的线段:(10,10,10),(100,100,100)。

我想转换这些坐标并在2D表面上绘制它们。因此,根据相机,线段应从(x1,y1,z1),(x2,y2,z2)变换为(x1,y1),(x2,y2)。

1 个答案:

答案 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形状的方法。

Form

当然,如果您想使用OpenGL,请查看here以查找类似问题。