我正在寻找一种将 3D xyz 坐标转换为 2D xy(像素)坐标的方法。我正在获取需要在 2d 平面上绘制的坐标列表。
该平面将始终是自上而下的视图宽度,尺寸如下宽度:800 像素,高度 400 像素
3D 世界坐标可以包含从 -4000 到 4000 的负值。我已经阅读了维基百科上的一些转换文章和一些 SO 线程,但它们要么不符合我的需求,要么对于我有限的数学知识来说太复杂了.
我希望有一个人可以帮助我。感谢您的时间。
问候,马克
我正在寻找一种将 3D xyz 坐标转换为 2D xy(像素)坐标的方法。我正在获取需要在 2d 平面上绘制的坐标列表。
该平面将始终是自上而下的视图宽度,尺寸如下宽度:800 像素,高度 400 像素
3D 世界坐标可以包含从 -4000 到 4000 的负值。我已经阅读了维基百科上的一些转换文章和一些 SO 线程,但它们要么不符合我的需求,要么对于我有限的数学知识来说太复杂了.
我希望有一个人可以帮助我。感谢您的时间。
问候,马克
Rob 或多或少是正确的,只是通常需要使用缩放因子(即 [k*(x/z), k*(y/z)])。如果你从不改变你的观点或方向,那么你需要完全理解为什么这有效的所有数学都是截距定理。
我认为它的标准实现使用所谓的同质坐标,这有点复杂。但是对于快速而肮脏的实现,只需使用“正常”3D 坐标就可以了。
在处理视点后面的坐标时,您还需要小心一点。事实上,这是我发现(基于多边形的)3D 图形中最丑陋的部分。
您可以使用 [(x/z),(y/z)] 之类的东西将 3d 投影到 2d - 我相信这是一种相当粗糙的方法,我认为 3d 到 2d 谷歌搜索会返回一些相当标准的算法
您可能会觉得这很有趣:A 3D Plotting Library in C#。
可能有帮助的东西:我正在处理的一些代码......
// Location in 3D space (x,y,z), w = 1 used for affine matrix transformations...
public class Location3d : Vertex4d
{
// Default constructor
public Location3d()
{
this.x = 0;
this.y = 0;
this.z = 0;
this.w = 1; // w = 1 used for affine matrix transformations...
}
// Initiated constructor(dx,dy,dz)
public Location3d(double dx, double dy, double dz)
{
this.x = dx;
this.y = dy;
this.z = dz;
this.w = 1; // w = 1 used for affine matrix transformations...
}
}
// Point in 2d space(x,y) , screen coordinate system?
public class Point2d
{
public int x { get; set; } // 2D space x,y
public int y { get; set; }
// Default constructor
public point2d()
{
this.x = 0;
this.y = 0;
}
}
// Check if a normal vertex4d of a plane is pointing away?
// z = looking toward the screen +1 to -1
public bool Checkvisible(Vertex4d v)
{
if(v.z <= 0)
{
return false; // pointing away, thus invisible
}
else
{
return true;
}
}
// Check if a vertex4d is behind you, out of view(behinde de camera?)
// z = looking toward the screen +1 to -1
public bool CheckIsInFront(Vertex4d v)
{
if(v.z < 0)
{
return false; // some distans from the camera
}
else
{
return true;
}
}
如果顶点在屏幕区域之外,则需要进行一些剪辑!!!