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


Немножко другая сфера.
Surface* coolSphere(int segments){
Engine *eng = Engine::Instance();

//подсчет индексов для поверхности

    //считаю количество точек

    //высота меша в точках segments+1, ширина меша 2*segments+1
    int count_vertices = (segments+1)*(2*segments+1);
    //считаю трианглы
    int count_indices = 3*segments*2*(segments+1);

//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();

//ставлю точки куда следует
int index=0;
for(int i=0;i<=segments;i++){
    for(int j=0;j<=2*segments;j++){
        if(j<=segments){float M_PI=3.14159265358979323846f;

        //определяю точку которая есть полюс
        vec2 pole(0.5f*(segments),0.5f*(segments));
        vec2 radius=vec2(0.5f*(segments)-i,0.5f*(segments)-j);
        float forz=0.0f;
        if(fabs(radius.x)>=fabs(radius.y)){forz=fabs(radius.x);}else{forz=fabs(radius.y);}
        float zc=cos(0.5f*M_PI*forz/pole.x);
        float zs=sin(0.5f*M_PI*forz/pole.x);
        float l=sqrt(radius.x*radius.x+radius.y*radius.y);
        if(l>0){radius=vec2(radius.x/l,radius.y/l);}

    vec3 position(radius.x*zs,radius.y*zs,zc);
    surf->SetVertexPosition(index,position);
    surf->SetVertexNormal(index,position);
    surf->SetVertexTexCoord(index,4*i/(float)segments,2*j/(float)segments,0);
    }
    if(j>segments){

    /*а тут типа просто копирую позицию из уже сделанной части поверхности, ибо не осилил как сделать одной поверхностью идеологически верным способом*/
    int magic_number=2*segments-j;
    //теперь ищу точку симметричную данной
    int index0=i*(2*segments+1)+magic_number;
    vec3 position;
    surf->GetVertexPosition(index0,position);

    surf->SetVertexPosition(index,position.x,position.y,-position.z);
    surf->SetVertexNormal(index,position.x,position.y,-position.z);
    surf->SetVertexTexCoord(index,4*i/(float)segments,2*j/(float)segments,0);
    }

    index++;
    }}
//ставлю полигоны
int trian_index=0;
for(int i=0;i<segments;i++){
    for(int j=0;j<2*segments;j++){
    //вычисляю для текущей клетки индексы точек в углах
    int v0,v1,v2,v3;
    //i - текущий ряд // j-текущий столбец
    v0=i*(2*segments+1)+j;
    v1=v0+1;
    v2=v0+2*segments+1;
    v3=v2+1;
    surf->SetTriangle(trian_index,v1,v0,v2);
    trian_index++;
    surf->SetTriangle(trian_index,v3,v1,v2);
    trian_index++;
    }}


surf->RecalcTangents();
surf->UnLock();
return surf;
}
прикол в том что у нее нет скоплений точек, то есть вершины по поверхности относительно равномерно разбросаны.

плюс не понял как правильно текстуры грузить
Texture *tex=eng->LoadTexture(L"tex0.png");
        
Entity *body s->Add(coolSphere(16));
        
body->SetShader(StandartShaders::Render::Texturing());
        
body->SetTexture(tex,0); 
и ложу текстуру рядом с экзешником, в дебаге вообще почему то упало, а в релизе написало что файл найти не может после того как из кодеблокса запустил. Причем если экзешник из папки запускать находит. Что я делаю не так?

Последний раз редактировалось dsd, 13.08.2012 в 19:28.
(Offline)
 
Ответить с цитированием