C ++高级3D坐标到2D坐标

时间:2013-12-31 17:43:29

标签: c++ math view 3d 2d

我的问题:如何在2D屏幕上转换3D坐标? 我对此有很多了解,但我所有的研究只显示了一半回答,甚至没有回复,有些是错误的(测试过它们),所以我再次提出要求并尝试添加尽可能多的细节。 以下是我们将要使用的结构:

struct COORD3D
{
    int X;
    int Y;
    int Z;
};
struct PAN3D//Rotate around these axis
{
    float X;
    float Y;
    float Z;
};
    struct COLOR
{
    Uint8 R;//RED
    Uint8 G;//GREEN
    Uint8 B;//BLUE
    Uint8 A;//ALPHA
};
struct CAMERA
{
    COORD3D Pos;
    PAN3D   Rot;
    float   angle;
    int RESX;//X Resolution
    int RESY;//Y Resolution
};
struct POI
{
    COORD3D Pos;
    COLOR   Col;
};
struct OBJECT
{
    COORD3D Pos;//absolute position
    list<POI> dots;//relative to object position
    list<pair<POI*, POI*>> lines;//Pointers to the dots to connect them
    PAN3D Rot;//absolute rotation
};

现在我需要的是一个看起来像这样的函数:

POI Convert3dTo2d(CAMERA cam,POI point);

(由于颜色必须是“POI”;)) 我已经有了一个贯穿所有对象和所有要点的alogythm 事实上,有一个相机告诉你,这不是一个正统的视觉,而是一个视角。

请将您在此处写的代码评论为ropperly,以便每个人都能理解。 如果你不知道如何做到这一点或只是得到方法或非直接的解决方案,请不要回答,这并没有真正帮助我们。 http://sta.sh/0de60ynp9id&lt; - 此图片应该稍微描述一下

Os(Windows 7),Microsoft Visual Studio 2013(我只是使用它的c ++部分) 我为x64构建它(如果它很重要;)) 但我不认为这对于一点点数学算法很重要

如果您有任何疑问,请随时问我

好吧,我想我有一个新的(对我而言)这样做的方法,明天会尝试它并会告诉你它是否有效(这是每个人忘记的部分,但我尽量不要忘记它)

3 个答案:

答案 0 :(得分:2)

您需要将您的点乘以视图和投影矩阵。

视图矩阵将点转换为相机空间。 Aka,相对于CAMERA。

投影矩阵将点从3D空间转换为投影空间。你需要决定你想要什么样的投影。例如,正投影或透视投影。

有关这些矩阵的布局,请参见这些页面底部的矩阵。

LookAtLH或视图矩阵: http://msdn.microsoft.com/en-us/library/windows/desktop/bb281710(v=vs.85).aspx

OrthoLH,或使用正交投影的投影矩阵: http://msdn.microsoft.com/en-us/library/windows/desktop/bb281723(v=vs.85).aspx

您还需要了解如何执行矩阵乘法。

答案 1 :(得分:1)

我能解释这个问题的唯一方法是你想将一个3d点投射到一个二维平面上。如果那不是您想要的,请澄清您的问题。如果这就是你想要的,那么3D投影的无数资源就在附近:http://en.wikipedia.org/wiki/3D_projection

您需要将您的点乘以投影矩阵,以便在2d平面上投射(或“转换”?)您的点。

答案 2 :(得分:0)

我建议您查看以下链接,了解将3D坐标转换为2D坐标的解释,

The OpenGL transform pipeline

OpenGL transform