我有一个随机生成的点,有一些随机方向(随机lat和随机lon),我用这些数学方程计算:
dirX = cos(lat * DEG_TO_RAD) * sin(lon * DEG_TO_RAD);
dirY = sin(lat * DEG_TO_RAD);
dirZ = cos(lat * DEG_TO_RAD) * cos(lon * DEG_TO_RAD);
我想要的是采取这一点,并绘制金字塔。这个金字塔的正方形底座位于球体的一半,生成的点应该是该正方形的中心。
然后根据该点的方向,我想生成这个金字塔的坐标,该坐标应位于半径为r的球体的球形外围,其随机点为中心。 / p>
金字塔顶部指向随机点的方向,其他点应分别绘制。这张图片可以帮助您想象我想要做的事情。
这就是我在做的事情:
//A
v[0][0][0]= radius * (cos(lat) * sin(lon));
v[0][0][1]= radius * sin(lat);
v[0][0][2]= radius * (cos(lat) * cos(lon));
//B
v[0][2][0]= radius * (cos(lat+(90*DEG_TO_RAD)) * sin(lon));
v[0][3][1]= radius * sin(lat+(90*DEG_TO_RAD));
v[0][4][2]= radius * (cos(lat+(90*DEG_TO_RAD)) * cos(lon));
//D
v[0][2][0]= radius * (cos(lat) * sin(lon+(90*DEG_TO_RAD)));
v[0][2][1]= radius * sin(lat);
v[0][2][2]= radius * (cos(lat) * cos(lon+(90*DEG_TO_RAD)));
// Side ABD
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_POLYGON); // Start drawing a quad primitive
glVertex3f(v[0][0][0], v[0][0][1], v[0][0][2]); //A
glVertex3f(v[0][5][0], v[0][6][1], v[0][7][2]); //B
glVertex3f(v[0][2][0], v[0][2][1], v[0][2][2]); //D
//A
v[1][0][0]= radius * (cos(lat) * sin(lon));
v[1][0][1]= radius * sin(lat);
v[1][0][2]= radius * (cos(lat) * cos(lon));
//D
v[1][8][0]= radius * cos(lat) * sin(lon+(90*DEG_TO_RAD));
v[1][9][1]= radius * sin(lat);
v[1][10][2]= radius * (cos(lat) * cos(lon+(90*DEG_TO_RAD)));
//C
v[1][2][0]= radius * (cos(lat-(90*DEG_TO_RAD)) * sin(lon));
v[1][2][1]= radius * sin(lat-(90*DEG_TO_RAD));
v[1][2][2]= radius * (cos(lat-(90*DEG_TO_RAD)) * cos(lon));
// Side ADC
glColor3f(1, 1, 1);
glVertex3f(v[1][0][0], v[1][0][1], v[1][0][2]); //A
glVertex3f(v[1][11][0], v[1][12][1], v[1][13][2]); //D
glVertex3f(v[1][2][0], v[1][2][1], v[1][2][2]); //C
//A
v[2][0][0]= radius * (cos(lat) * sin(lon));
v[2][0][1]= radius * sin(lat);
v[2][0][2]= radius * (cos(lat) * cos(lon));
//C
v[2][14][0]= radius * (cos(lat-(90*DEG_TO_RAD)) * sin(lon));
v[2][15][1]= radius * sin(lat-(90*DEG_TO_RAD));
v[2][16][2]= radius * (cos(lat-(90*DEG_TO_RAD)) * cos(lon));
//E
v[2][2][0]= radius * (cos(lat) * sin(lon-(90*DEG_TO_RAD)));
v[2][2][1]= radius * sin(lat);
v[2][2][2]= radius * (cos(lat) * cos(lon-(90*DEG_TO_RAD)));
// Side ACE
glColor3f(0.5, 0.3, 0.1);
glVertex3f(v[2][0][0], v[2][0][1], v[2][0][2]); //A
glVertex3f(v[2][17][0], v[2][18][1], v[2][19][2]); //C
glVertex3f(v[2][2][0], v[2][2][1], v[2][2][2]); //E
//A
v[3][0][0]= radius * (cos(lat) * sin(lon));
v[3][0][1]= radius * sin(lat);
v[3][0][2]= radius * (cos(lat) * cos(lon));
//E
v[3][20][0]= radius * (cos(lat) * sin(lon-(90*DEG_TO_RAD)));
v[3][21][1]= radius * sin(lat);
v[3][22][2]= radius * (cos(lat) * cos(lon-(90*DEG_TO_RAD)));
//B
v[3][2][0]= radius * (cos(lat+(90*DEG_TO_RAD)) * sin(lon));
v[3][2][1]= radius * sin(lat+(90*DEG_TO_RAD));
v[3][2][2]= radius * (cos(lat+(90*DEG_TO_RAD)) * cos(lon));
// Side AEB
glColor3f(1.0, 0.8, 0.7);
glVertex3f(v[3][0][0], v[3][0][1], v[3][0][2]); //A
glVertex3f(v[3][23][0], v[3][24][1], v[3][25][2]); //E
glVertex3f(v[3][2][0], v[3][2][1], v[3][2][2]); //B
glEnd();
/*
//Square BECD
glColor3f(0.1, 0.3, 0.1);
glVertex3f((radius * cos(lat+(90*DEG_TO_RAD)) * sin(lon)), (radius * sin(lat+(90*DEG_TO_RAD)) * sin(lon)), (radius * cos(lon))); //headB
glVertex3f((radius * cos(lat) * sin(lon-(90*DEG_TO_RAD))), (radius * sin(lat) * sin(lon-(90*DEG_TO_RAD))), (radius * cos(lon-(90*DEG_TO_RAD)))); //headE
glVertex3f((radius * cos(lat-(90*DEG_TO_RAD)) * sin(lon)), (radius * sin(lat-(90*DEG_TO_RAD)) * sin(lon)), (radius * cos(lon))); //headC
glVertex3f((radius * cos(lat) * sin(lon+(90*DEG_TO_RAD))), (radius * sin(lat) * sin(lon+(90*DEG_TO_RAD))), (radius * cos(lon+(90*DEG_TO_RAD)))); //headD
glEnd();
*/
我们不考虑画出金字塔的方形底座,问题已经存在了!由于某种原因,它只会造成混乱!我没有得到理想的结果。
答案 0 :(得分:1)
GL_POLYGON
使用您提供的所有顶点绘制单,凸多边形。
由于您只是绘制三角形,因此应切换到GL_TRIANGLES
。
答案 1 :(得分:0)
嗯有趣的问题,如果我理解你的问题,这就是我将如何做到这一点。让您在单位范围内生成的点为(a,b,c)
a^2 + b^2 + c^2 = 1
,其中球体以原点为中心,然后我们在(a,b,c)
及其对面(-a,-b,-c)
绘制一条直线。很容易确定这条线的方程。接下来我们在垂直于此线的3d中找到一条线,有无数的选择。通过这两条线,我们可以找到由这两条线确定的2个平面,它们与球体的交点将为您提供金字塔的坐标。同样,根据您选择的第二条线,可以有无数多种选择(将其视为固定一条线,另一条线在其中点垂直并自由旋转)