Математика: Как преобразовать 3D-мир в 2D-координату экрана - PullRequest
0 голосов
/ 17 февраля 2011

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 17 февраля 2011

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

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

1 голос
/ 17 февраля 2011

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

0 голосов
/ 20 мая 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;
    }
}

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

0 голосов
/ 17 февраля 2011

Вы можете найти это интересным: Библиотека 3D-печати в C # .

...