Математика: как преобразовать 3D-мир в координаты 2D-экрана

Я ищу способ преобразовать 3D-координаты xyz в 2D-координаты xy (пиксели). Я получаю список координат, которые мне нужно построить на 2D-плоскости.

Плоскость всегда будет шириной вида сверху вниз со следующими размерами ширины: 800 пикселей, высота 400 пикселей.

Трехмерные мировые координаты также могут содержать отрицательные значения в диапазоне от -4000 до 4000. Я прочитал несколько статей о преобразовании в Википедии и пару потоков SO, но они либо не соответствовали моим потребностям, либо были слишком сложными для моих ограниченных математических знаний. .

Я надеюсь, что кто-то может мне помочь. Спасибо за уделенное время.

С уважением, Марк


person Mark    schedule 17.02.2011    source источник
comment
Вы хотите, чтобы он был преобразован с сохранением масштаба, то есть для чего-то вроде инженерных чертежей, где расстояние имеет значение, или с использованием перспективы, то есть объекты, находящиеся дальше, кажутся меньше, а более близкие — больше?   -  person Ted Elliott    schedule 17.02.2011


Ответы (4)


вы можете использовать что-то вроде [(x/z),(y/z)] для проецирования 3d в 2d - я считаю, что это довольно грубый метод, и я думаю, что 3d в 2d Googlings вернет некоторые довольно стандартные алгоритмы

person Rob    schedule 17.02.2011

Роб более или менее прав, просто обычно необходимо использовать коэффициент масштабирования (т.е. [k*(x/z), k*(y/z)]). Если вы никогда не меняете свою точку или направление взгляда, вся математика, которая вам нужна, чтобы полностью понять, почему это работает, — это теоремы о перехвате.

Я думаю, что стандартная реализация этого использует так называемые однородные координаты, что немного сложнее. Но для быстрой и грязной реализации просто использование «обычных» 3D-координат отлично работает.

Вы также должны быть немного осторожны, имея дело с координатами, которые находятся за вашей точкой зрения. На самом деле, это то, что я нашел самой уродливой частью (на основе полигонов) 3D-графики.

person toochin    schedule 17.02.2011

Вам может быть интересно: Библиотека трехмерных графиков на C#.

person makes    schedule 17.02.2011

Что-то, что может помочь: некоторый код, над которым я работаю...

// 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;
    }
}

Некоторая обрезка должна быть сделана, если вершины находятся за пределами области экрана !!!

person Marc    schedule 20.05.2011