
Surface* Cone(int capSeg, int heightSeg, float radius, float height){
Engine *eng = Engine::Instance();
//подсчет индексов для поверхности
int count_vertices =(heightSeg+2)*(capSeg+1)+1;
int count_indices = 3*(2*(heightSeg*capSeg)+capSeg);
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//расстановка точек.
float something=sqrt(radius*radius+height*height);
float cSomething=radius/something;
for(int i=0;i<=capSeg;i++){
for(int j=0;j<=heightSeg;j++){
int index=(heightSeg+1)*i+j;
float M_PI=2.0f*3.14159265358979323846f;
float zc=height*j/heightSeg;
float zs=1-zc/height;
float x=zs*radius*cos(M_PI*i/(float)capSeg);
float y=zs*radius*sin(M_PI*i/(float)capSeg);
vec3 position(x,y,zc);
surf->SetVertexPosition(index,position*radius);
//определение нормали
x=cos(M_PI*i/(float)capSeg);
y=sin(M_PI*i/(float)capSeg);
position=(vec3(x,y,cSomething)).normalize();
surf->SetVertexNormal(index,position);
surf->SetVertexTexCoord(index,i/(float)capSeg,j/(float)heightSeg);
}}
//натяжка полигонов
for(int i=0;i<capSeg;i++){
for(int j=0;j<heightSeg;j++){
int index=2*(heightSeg*i+j);
int v00=(heightSeg+1)*i+j;
int v10=v00+1;
int v01=v00+heightSeg+1;
int v11=v01+1;
surf->SetTriangle(index,v10,v00,v01);
surf->SetTriangle(index+1,v11,v10,v01);
}}
//Затычка №1
for(int i=0;i<=capSeg;i++){
int index=(heightSeg+1)*(capSeg+1)+i;
float M_PI=2.0f*3.14159265358979323846f;
float zc=0;
float x=radius*cos(M_PI*i/(float)capSeg);
float y=radius*sin(M_PI*i/(float)capSeg);
vec3 position(x,y,zc);
surf->SetVertexPosition(index,position*radius);
position=vec3(0,0,-1);
surf->SetVertexNormal(index,position);
surf->SetVertexTexCoord(index,i/(float)capSeg,0);
}
int centerPoint=(heightSeg+2)*(capSeg+1);
//постановка центральной точки
surf->SetVertexPosition(centerPoint,0,0,0);
surf->SetVertexNormal(centerPoint,0,0,-1);
surf->SetVertexTexCoord(centerPoint,0.5,0.5);
//палигоны
for(int i=0;i<capSeg;i++){
int index=2*(heightSeg*capSeg)+i;
int v0=centerPoint;
int v1=v0+i-capSeg-1;
int v2=v1+1;
surf->SetTriangle(index,v1,v0,v2);
}
surf->RecalcTangents();
surf->UnLock();
return surf;
}
Нормаль к поверхности это косинусы углов этой поверхности к соотв осям, да? Дно у цилиндра и конуса имеет кривые текстурные координаты
