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




Surface* torus(int resol, int vresol, float radius, float inradius){
Engine *eng = Engine::Instance();


//подсчет индексов для поверхности
int count_vertices =(resol+1)*(vresol+1);
int count_indices = resol * vresol * 6;
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//расстановка точек.
for(int i=0;i<=resol;i++){
    for(int j=0;j<=vresol;j++){

        int index=(vresol+1)*i+j;
        float M_PI=2.0f*3.14159265358979323846f;
        float zc=inradius*cos(M_PI*j/(float)vresol);
        float zs=inradius*sin(M_PI*j/(float)vresol);
        float x=(radius+zs)*cos(M_PI*i/(float)resol);
        float y=(radius+zs)*sin(M_PI*i/(float)resol);

        vec3 position(x,y,zc);
        surf->SetVertexPosition(index,position*radius);

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

        position=(position-vec3(x,y,0)).normalize();

        surf->SetVertexNormal(index,position);
        surf->SetVertexTexCoord(index,i/(float)resol,j/(float)vresol);
    }}

//натяжка полигонов
for(int i=0;i<resol;i++){
    for(int j=0;j<vresol;j++){
        int index=2*(vresol*i+j);
        int v00=(vresol+1)*i+j;
        int v10=v00+1;
        int v01=v00+vresol+1;
        int v11=v01+1;
        surf->SetTriangle(index,v00,v10,v01);
        surf->SetTriangle(index+1,v10,v11,v01);

    }}
surf->RecalcTangents();
surf->UnLock();
return surf;
}
Почему границы полигонов проявляются? Какой то косяк при интерполяции значения нормали, так и надо, у dsd кривые руки?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (21.02.2012)