C++ 将二维地图坐标打印到OpenGL三维投影
我正在尝试使用OpenGL将在地图编辑器中创建的2D地图转换为3D打印。这是在地图编辑器中生成的地图: 这些顶点是相对于我的笛卡尔原点世界坐标(图片顶部)的,我正在应用此公式将其转换为OpenGL对象坐标: 世界尺寸:800x600C++ 将二维地图坐标打印到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
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