сфера без лишних точечек на полюсах... Правда из двух поверхностей...

Handle mCreateSphere(int segments) {
Handle mesh=xCreateMesh();
Handle surf=xCreateSurface(mesh);
//создание плоскости
for(int i=0;i<=2*segments;i++){
for(int j=0;j<=2*segments;j++){
int v0=xAddVertex(surf,i,j,0);
}}
int qvert=xCountVertices(surf);
for(int i=0;i<qvert-2*segments-1;i++){
int v0=i;
int v1=i+1;
int v2=i+2*segments+1;
int v3=v2+1;
if(v3<qvert && xMod(i,2*segments+1)!=2*segments){ xAddTriangle(surf,v1,v2,v3); xAddTriangle(surf,v0,v2,v1);}}
//теперь выгибание плоскости по полусфере
for(int i=0;i<qvert;i++){
double x=xVertexX(surf,i);
double y=xVertexY(surf,i);
double radius;
if(fabs(x-segments)>fabs(y-segments)){radius=fabs(x-segments);} else {radius=fabs(y-segments);}
x=x-segments;
y=y-segments;
double l=sqrt(x*x+y*y);
if (l!=0){x=x/l; y=y/l;}
y=y*sin(0.5*M_PI*radius/segments);
x=x*sin(0.5*M_PI*radius/segments);
double z=cos(0.5*M_PI*radius/segments);
xVertexCoords(surf,i,x,y,z);
xVertexNormal(surf,i,x,y,z);
//половинка сферы готова
}
// вторая часть.
Handle surf2=xCreateSurface(mesh);
//создание плоскости
for(int i=0;i<=2*segments;i++){
for(int j=0;j<=2*segments;j++){
int v0=xAddVertex(surf2,i,j,0);
}}
for(int i=0;i<qvert-2*segments-1;i++){
int v0=i;
int v1=i+1;
int v2=i+2*segments+1;
int v3=v2+1;
if(v3<qvert && xMod(i,2*segments+1)!=2*segments){ xAddTriangle(surf2,v2,v1,v3); xAddTriangle(surf2,v2,v0,v1);}}
//теперь выгибание плоскости по полусфере
for(int i=0;i<qvert;i++){
double x=xVertexX(surf2,i);
double y=xVertexY(surf2,i);
double radius;
if(fabs(x-segments)>fabs(y-segments)){radius=fabs(x-segments);} else {radius=fabs(y-segments);}
x=x-segments;
y=y-segments;
double l=sqrt(x*x+y*y);
if (l!=0){x=x/l; y=y/l;}
y=y*sin(0.5*M_PI*radius/segments);
x=x*sin(0.5*M_PI*radius/segments);
double z=-cos(0.5*M_PI*radius/segments);
xVertexCoords(surf2,i,x,y,z);
xVertexNormal(surf2,i,x,y,z);}
return mesh;
}