【发布时间】:2018-01-30 01:04:49
【问题描述】:
我正在使用 GDI+ 来实现一些简单的图形,我已经从这个示例 http://www.vcskicks.com/3d_gdiplus_drawing.php 中获取了代码,并且可以让它做我想做的事情,但我不明白它是如何从 3D 数据进行转换的指向二维数据点:
//Convert 3D Points to 2D
Math3D.Point3D vec;
for (int i = 0; i < point3D.Length; i++)
{
vec = cubePoints[i];
if (vec.Z - camera1.Position.Z >= 0)
{
point3D[i].X = (int)((double)-(vec.X - camera1.Position.X) / (-0.1f) * zoom) + drawOrigin.X;
point3D[i].Y = (int)((double)(vec.Y - camera1.Position.Y) / (-0.1f) * zoom) + drawOrigin.Y;
}
else
{
tmpOrigin.X = (int)((double)(cubeOrigin.X - camera1.Position.X) / (double)(cubeOrigin.Z - camera1.Position.Z) * zoom) + drawOrigin.X;
tmpOrigin.Y = (int)((double)-(cubeOrigin.Y - camera1.Position.Y) / (double)(cubeOrigin.Z - camera1.Position.Z) * zoom) + drawOrigin.Y;
point3D[i].X = (float)((vec.X - camera1.Position.X) / (vec.Z - camera1.Position.Z) * zoom + drawOrigin.X);
point3D[i].Y = (float)(-(vec.Y - camera1.Position.Y) / (vec.Z - camera1.Position.Z) * zoom + drawOrigin.Y);
point3D[i].X = (int)point3D[i].X;
point3D[i].Y = (int)point3D[i].Y;
}
}
我找到了一些讨论从 3d 数据点转换为 2d 数据点的资源:
- https://amycoders.org/tutorials/3dbasics.html
- https://en.wikipedia.org/wiki/Isometric_projection
- https://en.wikipedia.org/wiki/3D_projection
但是,这些资源似乎都没有详细说明上述示例中使用的数学。
如果有人能指出数学的推导和/或解释上述代码的工作原理,我将不胜感激。
【问题讨论】:
-
/ (vec.Z - camera1.Position.Z)therm 只是透视除以Z到相机的距离(越远的点被划分得越多,所以物体越远越小)。然而,代码不会转换到相机坐标系,所以相机不能旋转只是移动......
标签: c# graphics 3d linear-algebra gdi