Тема: Странное.
Показать сообщение отдельно
Старый 02.03.2012, 23:27   #420
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.




Surface* Cyle(int capSeg, int heightSeg, float radius, float height){
Engine *eng = Engine::Instance();


//подсчет индексов для поверхности
int count_vertices =(heightSeg+3)*(capSeg+1)+2;
int count_indices = 3*(2*(heightSeg*capSeg)+2*capSeg);
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//расстановка точек.
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 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);

        //определение нормали
        x=(radius)*cos(M_PI*i/(float)capSeg);
        y=(radius)*sin(M_PI*i/(float)capSeg);

        position=vec3(x,y,0).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 x=radius*cos(M_PI*i/(float)capSeg);
        float y=radius*sin(M_PI*i/(float)capSeg);
        float zc=0;
        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);
}

//Затычка №2
for(int i=0;i<=capSeg;i++){
    int index=(heightSeg+2)*(capSeg+1)+i+1;
    float M_PI=2.0f*3.14159265358979323846f;
        float x=radius*cos(M_PI*i/(float)capSeg);
        float y=radius*sin(M_PI*i/(float)capSeg);
        float zc=height;
        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);
}
centerPoint=(heightSeg+3)*(capSeg+1)+1;
//постановка центральной точки
        vec3 position=vec3(0,0,height);
        surf->SetVertexPosition(centerPoint,position);
        position=vec3(0,0,1);
        surf->SetVertexNormal(centerPoint,position);
        surf->SetVertexTexCoord(centerPoint,0.5,0.5);
//палигоны

for(int i=0;i<capSeg;i++){
int index=2*(heightSeg*capSeg)+i+capSeg;
int v0=centerPoint;
int v1=v0+i-capSeg-1;
int v2=v1+1;
surf->SetTriangle(index,v0,v1,v2);
}
surf->RecalcTangents();
surf->UnLock();
return surf;
}
Оказалось цилиндр сложней тора
Имел странные глюки Получилось почему-то только с 4 раза. И то осталось впечатление, что я движок где-та наебал )
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (03.03.2012)