C++ 将二维地图坐标打印到OpenGL三维投影

C++ 将二维地图坐标打印到OpenGL三维投影,c++,opengl,math,graphics,tesselation,C++,Opengl,Math,Graphics,Tesselation,我正在尝试使用OpenGL将在地图编辑器中创建的2D地图转换为3D打印。这是在地图编辑器中生成的地图: 这些顶点是相对于我的笛卡尔原点世界坐标(图片顶部)的,我正在应用此公式将其转换为OpenGL对象坐标: 世界尺寸:800x600 x = (X / 800) -0.5 y = (Y / 600) -0.5 获得此结果: (第一个对象面) 在OpenGL中绘制这个顶点缓冲区,我得到了一个非常奇怪的结果。那么,如何从这些顶点位置获得三维模型呢?就像这张照片: 我正在三角形模式下渲染OpenG

我正在尝试使用OpenGL将在地图编辑器中创建的2D地图转换为3D打印。这是在地图编辑器中生成的地图:

这些顶点是相对于我的笛卡尔原点世界坐标(图片顶部)的,我正在应用此公式将其转换为OpenGL对象坐标:

世界尺寸:800x600

x = (X / 800) -0.5
y = (Y / 600) -0.5
获得此结果:

(第一个对象面)

在OpenGL中绘制这个顶点缓冲区,我得到了一个非常奇怪的结果。那么,如何从这些顶点位置获得三维模型呢?就像这张照片:

我正在三角形模式下渲染OpenGL,并使用此示例作为起点:

使用转换公式+Earcut细分(),我终于在OpenGL中正确地绘制了这个矩形。由于两个平面的Z轴不同,现在的问题是如何渲染其侧面,因为Earcut仅适用于二维坐标


很难确定,但您的对象似乎只渲染了两个面,因为您没有将其他面添加到索引中

因为你有你的顶点,但你也需要告诉我边上有一个三角形。如果它们是三角形,你应该画16个三角形。 如果不使用索引,则需要为每个三角形复制顶点,并最终绘制48个顶点


为了使耳环算法在3D中工作,如果您确定多边形的所有点都在同一平面中,您可以选取3个顶点,推导其平面,并创建一个变换矩阵,以将所有这些点转换为(x,y,0)这就像是二维坐标。

如果我做对了,你会得到一些平面的2D多边形,以及如何给它添加一些恒定的厚度(作为三维网格)。这是相当容易做到的。正如您正确地假设的,您需要首先进行三角测量。因此,您应该有以下输入:

  • 积分表
    pnt[pnts]

    对象的所有点的列表

  • 多边形
    pol[pols]
    (对象的周长)

    刚排序的点列表引用点表索引

  • 三角测量结果
    fac[facs]

    表示所有三角形的3个点索引的有序列表

  • 现在要从中生成网格,我们需要执行以下操作:

  • 复制所有点并通过一些转换将其挤出。

    所有这些新点都将添加到当前的
    pnt[pnts]
    表中。不要忘记记住原始表格大小
    pnts0
    ,因为以后需要它

  • 复制/反转三角测量。

    三角形多边形的另一侧将与反向多边形缠绕相同。所以只要把它复制到
    fac[facs]
    中,作为新的三角形,按相反的索引顺序。。。不要忘记将原始点表大小添加到所有新面。这将使用新的点。。。从你的照片你已经到了这一点

  • 创建缺少的侧面。

    为此,我们可以利用原始多边形。因为我们刚刚复制了这些点,所以我们知道
    pnt[3*i]
    pnt[pnts0+3*i]
    相反。所以我们只需要创建三角形面来连接多边形的对边

  • 这里我为这个小的C++例子破例:

    //---------------------------------------------------------------------------
    #包括
    #包括
    #布拉格语hdrstop
    #包括“Unit1.h”
    #包括“gl_simple.h”
    //---------------------------------------------------------------------------
    #pragma包(智能初始化)
    #pragma资源“*.dfm”
    TForm1*Form1;
    //---------------------------------------------------------------------------
    常数int N=128;
    int pnts=6*3;//3*点数
    浮点pnt[N]=//每个点的x,y
    {
    -0.5,-0.5,0.0,              //   6 ------ 9
    -0.4, 0.0,0.0,              //    +      +
    -0.5,+0.5,0.0,              //     3   12
    +0.5,+0.5,0.0,              //    +      +
    +0.4, 0.0,0.0,              //   0 ----- 15
    +0.5,-0.5,0.0,
    };
    int pol[N]={0,3,6,9,12,15},pols=6;//原始多边形(3*pnt索引),其顶点数
    int fac[N]=//三角测量结果(3*pnt索引)
    {
    0,3,15,
    3,12,15,
    3,6,12,
    6,9,12,
    },facs=4*3;//三角形数*3
    //---------------------------------------------------------------------------
    空隙挤出(浮动dz)
    {
    int i,i0,pnts0=pnts;
    //复制和反向三角测量
    
    对于(i=0;iI有点不清楚你在问什么。是如何放置和调整代表你的地图的四边形以覆盖屏幕?还是如何从一些2D地图阵列(空白空间或纹理立方体)创建基于立方体的网格为什么你需要耳朵剪辑?因为耳朵可以画出4个顶点,形成了比C++多的其他东西。比如,一个六边形,但是它是由用户在二维空间中绘制的。它能在3D中挤出这个2D网格吗?我看到了
    −0.48625, 0.068333333
    0.12625, 0.07
    0.12875, −0.481666667
    −0.4875, −0.486666667