0

3Dxyz座標を2Dxy(ピクセル)座標に変換する方法を探しています。2D平面にプロットする必要のある座標のリストを取得しています。

平面は常にトップダウンビューの幅になり、次の寸法になります幅:800ピクセル、高さ400ピクセル

3Dワールド座標には、-4000から4000の範囲の負の値を含めることができます。ウィキペディアのいくつかの変換記事といくつかのSOスレッドを読みましたが、ニーズに合わなかったか、数学の知識が限られているため複雑すぎました。 。

誰かが私を助けてくれることを願っています。お時間をいただきありがとうございます。

よろしく、マーク

4

4 に答える 4

1

[(x / z)、(y / z)]のようなものを使用して3dから2dを投影できます-これはかなり大雑把な方法であり、3dから2dのグーグルはかなり標準的なアルゴリズムを返すと思います

于 2011-02-17T03:26:04.913 に答える
1

ロブは多かれ少なかれ正しいですが、通常は倍率を使用する必要があります (つまり、[k*(x/z), k*(y/z)])。視点や視点の方向を決して変えない場合、これが機能する理由を完全に理解するために必要なすべての数学は切片定理です。

これの標準的な実装は、いわゆる同次座標を使用していると思いますが、これはもう少し複雑です。しかし、「通常の」3D 座標を使用するだけで簡単に実装できます。

視点の後ろにある座標を扱う場合も、少し注意する必要があります。実際、これは (ポリゴンベースの) 3D グラフィックスの最も醜い部分だと私が見つけたものです。

于 2011-02-17T13:22:31.773 に答える
0

これは興味深いかもしれません: A 3D Plotting Library in C# .

于 2011-02-17T03:28:03.557 に答える
-1

役立つかもしれない何か:私が取り組んでいるいくつかのコード...

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

頂点が画面領域外にある場合は、クリッピングが行われます!!!

于 2011-05-20T12:32:09.003 に答える