C# 数学:如何将3D世界转换为2D屏幕坐标

C# 数学:如何将3D世界转换为2D屏幕坐标,c#,math,coordinate-systems,C#,Math,Coordinate Systems,我正在寻找一种将3D xyz坐标转换为2D xy(像素)坐标的方法。我得到了一个坐标列表,需要在二维平面上绘制 该平面始终为自顶向下视图宽度,以下尺寸宽度:800 px,高度400 px 3D世界坐标可以包含-4000到4000之间的负值。我在维基百科上读了几篇转换文章和几篇文章,但它们要么不符合我的需要,要么太复杂,不适合我有限的数学知识 我希望有人能帮助我。 谢谢你抽出时间 问候,, 标记你可以使用类似[(x/z),(y/z)]的东西将3d投影到2d-我认为这是一种相当粗糙的方法,我认为3d

我正在寻找一种将3D xyz坐标转换为2D xy(像素)坐标的方法。我得到了一个坐标列表,需要在二维平面上绘制

该平面始终为自顶向下视图宽度,以下尺寸宽度:800 px,高度400 px

3D世界坐标可以包含-4000到4000之间的负值。我在维基百科上读了几篇转换文章和几篇文章,但它们要么不符合我的需要,要么太复杂,不适合我有限的数学知识

我希望有人能帮助我。 谢谢你抽出时间

问候,,
标记

你可以使用类似[(x/z),(y/z)]的东西将3d投影到2d-我认为这是一种相当粗糙的方法,我认为3d到2d的谷歌搜索将返回一些相当标准的算法

你可能会发现这很有趣:。

Rob或多或少是正确的,只是通常需要使用比例因子(即[k*(x/z),k*(y/z)]). 如果你从未改变过你的观点或观点,那么你需要完全理解的数学就是截距定理

我认为这个的标准实现使用了所谓的同质坐标,这有点复杂。但是对于一个快速而肮脏的实现来说,仅仅使用“普通”3D坐标就可以了


在处理你观点背后的坐标时,你也需要小心一点。事实上,这就是我发现的(基于多边形的)3D图形中最难看的部分。

一些可能有用的东西:我正在编写的一些代码

// 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;
    }
}
//三维空间(x,y,z)中的位置,w=1用于仿射矩阵变换。。。
公共类位置3D:Vertex4d
{
//默认构造函数
公共场所3D()
{
这个.x=0;
这个。y=0;
这个.z=0;
this.w=1;//w=1用于仿射矩阵变换。。。
}
//初始化构造函数(dx、dy、dz)
公共位置3D(双dx、双dy、双dz)
{
这个。x=dx;
y=dy;
这个。z=dz;
this.w=1;//w=1用于仿射矩阵变换。。。
}
}
//二维空间中的点(x,y),屏幕坐标系?
公共类Point2d
{
公共int x{get;set;}//2D空间x,y
公共整数y{get;set;}
//默认构造函数
公共点2D()
{
这个.x=0;
这个。y=0;
}
}
//检查平面的法线顶点4d是否指向别处?
//z=朝屏幕看+1到-1
公共布尔检查可见(Vertex4d v)
{

如果(v.z)要转换为保留比例,例如,对于距离重要的工程图,或使用透视图,例如,距离越远的对象显示越小,距离越近的对象显示越大?