OpenGL 画圆球

OpenGL 画圆球

OpenGL 画圆球_第1张图片

只需要两个点,然后使用GL_TRIANGLE_STRIP(按顺序依次组成三角形)方式画三角形就可以了
从上至下,一圈一圈往下计算
球面点计算公式

//    x=x0+r sinθcosφ
//    y=y0+r sinθsinφ
//    z=z0+r cosθ

θ为yz平面

GLfloat * calculateBallVertex(GLfloat r)
{
//    x=x0+r sinθcosφ
//    y=y0+r sinθsinφ
//    z=z0+r cosθ

GLfloat radius = 0.8 * r;


// GLfloat delta = 2 * M_PI / 100;
GLfloat *dest = (GLfloat *) malloc(sizeof(GLfloat) * 2 * kRow * kCol * 3);

GLfloat k = kHeight * 1.0 / kWidth;

float step_z = M_PI / kRow ;  //z方向每次步进的角度(上下,纬度)
float step_xy = 2*M_PI/ kCol;  //x,y平面每次步进的角度(经度)
float x[2],y[2],z[2];  //用来存坐标

float angle_z = 0; //起始角度
float angle_xy = 0;
int i=0, j=0;

// 90 -->  -90
for(i = 0; i < kRow; i++)
{
angle_z = i * step_z;  //每次步进step_z

for(j = 0; j < kCol ; j++)
{
// j++;
angle_xy = j * step_xy;  //每次步进step_xy
//整个的过程可以想象3D打印机,一层一层的画出来
x[0] = k * radius * sin(angle_z) * cos(angle_xy);  //第一个小平面的第一个顶点坐标
y[0] = radius * sin(angle_z) * sin(angle_xy);
z[0] = radius * cos(angle_z);

x[1] = k * radius * sin(angle_z + step_z) * cos(angle_xy);  //第一个小平面的第二个顶点坐标,下面类似
y[1] = radius * sin(angle_z + step_z) * sin(angle_xy);
z[1] = radius * cos(angle_z + step_z);

//整个的过程可以想象3D打印机,一层一层的画出来
//            x[0] = k * radius * cos(angle_z) * sin(angle_xy);  //第一个小平面的第一个顶点坐标
//            y[0] = radius * sin(angle_z);
//            z[0] = radius * cos(angle_z) * cos(angle_xy);
//            
//            x[1] = k * radius * cos(angle_z + step_z) * sin(angle_xy);  //第一个小平面的第一个顶点坐标
//            y[1] = radius * sin(angle_z + step_z);
//            z[1] = radius * cos(angle_z + step_z) * cos(angle_xy);

//至此得到一个平面的3个顶点
for(int k=0; k<2; k++)
{
    dest[i * kCol * 2 * 3 + j * 2 * 3 +  k*3+0] = x[k];
    dest[i * kCol * 2 * 3 + j * 2 * 3 +  k*3+1] = y[k];
    dest[i * kCol * 2 * 3 + j * 2 * 3 +  k*3+2] = z[k];
}
} //循环画出这一层的平面,组成一个环
}  //z轴++,画出剩余层
return dest;
}

你可能感兴趣的:(OpenGL)