forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Странное. (http://forum.boolean.name/showthread.php?t=15405)

dsd 03.03.2012 21:16

Ответ: Странное.
 


Код:

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;
}

Нормаль к поверхности это косинусы углов этой поверхности к соотв осям, да? Дно у цилиндра и конуса имеет кривые текстурные координаты :)

HolyDel 20.07.2012 01:44

Ответ: Странное.
 
Цитата:

новую версию SDK я смогу собрать только 6-7 марта.
версия вышла значительно позже, но в ней зато есть теперь:
Цитата:

ХолиДел, а как мне получать данные о точках и полигонах поверхности?
+ я с твоего разрешения перенесу твои функции в ядро, ок? в список стандартных примитивов. а то кубов и плоскостей - мало.

dsd 20.07.2012 02:54

Ответ: Странное.
 
Цитата:

Сообщение от HolyDel (Сообщение 233396)
+ я с твоего разрешения перенесу твои функции в ядро, ок? в список стандартных примитивов. а то кубов и плоскостей - мало.

Я согласен:))))

А про ошибку в конструкторе я не допер :) за полгода с++ стал забываться :) Но сейчас кодинг вроде вновь интересен стал.

dsd 21.07.2012 02:27

Ответ: Странное.
 

Немножко другая сфера.
Код:

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;
}

прикол в том что у нее нет скоплений точек, то есть вершины по поверхности относительно равномерно разбросаны.

плюс не понял как правильно текстуры грузить
PHP код:

Texture *tex=eng->LoadTexture(L"tex0.png");
        
Entity *body s->Add(coolSphere(16));
        
body->SetShader(StandartShaders::Render::Texturing());
        
body->SetTexture(tex,0); 

и ложу текстуру рядом с экзешником, в дебаге вообще почему то упало, а в релизе написало что файл найти не может после того как из кодеблокса запустил. Причем если экзешник из папки запускать находит. Что я делаю не так?

HolyDel 21.07.2012 15:16

Ответ: Странное.
 
текстура как то странно натянута. так и задумывалось?

проблема с ресурсами в том - что он ищет файлы в папке проекта (при дебаге). я не нашел в кодеблоксах где настроить этот параметр.
поэтому теперь выбор - или складывать все ексешники и прочее барахло в папку с проектами (и в мсвс визарде также), соответственно переименовывать их, например coolsphere_d.exe (все ето будет ткже делать визардом), или возиться с путями.

dsd 21.07.2012 15:51

Ответ: Странное.
 
так и задумывалось :) плюс по диагоналям там чу-чуть бубном постучать надо(это на них максимальное искажение). К ночи может выйдет повторить тот генератор камней-планет.

Это в общем плоскость 1х2 и первая часть обернута вокруг полусферы с полюсом в (0.5 0.5), и вторая часть обернута по той же сфере. Это чтобы карту шума накладывать можно было без искажений у полюсов.
Если научусь массив флоатов переводить быстро в картинку то можно будет сразу автоматом считать текстуру по которой нормали отворачивать, чтобы рельеф имитировать, карту смещений и заодно текстуру делать наподобие той что была в последней версии генератора поверхности земли под хорс. В общем занятный примитив должен выйти, причем только кодом. А учитывая как я пишу код хрен кто скопировать сможет если даже захочет :)))

HolyDel 21.07.2012 15:54

Ответ: Странное.
 
Цитата:

Если научусь массив флоатов переводить быстро в картинку
Код:

float my_floats[512][512];
Texture::Desc desc();
desc.Size(512,512);
desc.Bpc(4); //4 байта на канал. для флоата
desc.Cpp(1); //один канал на пиксель
desc.Data(my_floats);
Texture *tex = eng->CreateTexture(desc);

как то так.

dsd 21.07.2012 21:27

Ответ: Странное.
 
axmath.h
PHP код:

#pragma once

#include "../axlib.h"

#include "vectormath.h"

namespace axelynx
{
    
AXELYNX_API int FAST_CALL rand(int max);
    
AXELYNX_API int FAST_CALL rand(int minint max);
    
AXELYNX_API float FAST_CALL rnd(float max);
    
AXELYNX_API float FAST_CALL rnd(float minfloat max);

    
AXELYNX_API void sincos(float a,float s,float );

    
AXELYNX_API bool LineSphereIntersect(const vec3base, const vec3dir, const vec4sphere);



    
AXELYNX_API void CalcTriangleBasis( const axelynx::vec3E, const axelynx::vec3F, const axelynx::vec3Gfloat sE,
            
float tEfloat sFfloat tFfloat sGfloat tGaxelynx::vec3tangentX,
            
axelynx::vec3tangentY );
    
AXELYNX_API axelynx::vec3 ClosestPointOnLine( const axelynx::vec3a, const axelynx::vec3b, const axelynx::vec3);
    
AXELYNX_API axelynx::vec3 Ortogonalize( const axelynx::vec3v1, const axelynx::vec3v2 );


а где аналог srand()? Нужен, однако, а rand() из <cmath> не хочет почему то работать.

HolyDel 21.07.2012 22:54

Ответ: Странное.
 
Цитата:

а где аналог srand()? Нужен, однако, а rand() из <cmath> не хочет почему то работать.
только он в cstdlib, в не cmath. а так srand из cmath-а отлично работает с акселевской математикой.
Код:

srand(42);
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;

                srand(42);
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;

                srand(42);
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;


dsd 21.07.2012 23:32

Ответ: Странное.
 


вроде получается по чучуть. теперь оно хотя бы запускается :))
на стрелки можно двигать камеру

зы: терь не просит текстуру

HolyDel 22.07.2012 00:55

Ответ: Странное.
 
вроде работает. только у тебя там какаие - то странные, неправильные стыки между полусферами.

dsd 22.07.2012 02:01

Ответ: Странное.
 
я в курсе. это оно в черне заработало.
Теперь буду пилить и сам шум и геометрию сферы, надо ее по диагоналям более разреженной сделать, а шов из-за кривого генератора шума. там где смещения читаются для последней строки стоят немного не те значения. карта просто шире слегка чем количество точек в меше.
Плюс я тупее в с++ стал. сильно тупей. по этому и исходник пока не приложил, там такой ужас :))))

dsd 26.07.2012 02:37

Ответ: Странное.
 


Вроде бы искажения текстурных координат не столь чудовищны как раньше, швы теперь не видно и шум накладывается без искажений.

dsd 28.07.2012 22:14

Ответ: Странное.
 
Цитата:

и ложу текстуру рядом с экзешником, в дебаге вообще почему то упало, а в релизе написало что файл найти не может после того как из кодеблокса запустил. Причем если экзешник из папки запускать находит. Что я делаю не так?
Цитата:

Сообщение от HolyDel (Сообщение 233665)
проблема с ресурсами в том - что он ищет файлы в папке проекта (при дебаге). я не нашел в кодеблоксах где настроить этот параметр.
поэтому теперь выбор - или складывать все ексешники и прочее барахло в папку с проектами (и в мсвс визарде также), соответственно переименовывать их, например coolsphere_d.exe (все ето будет ткже делать визардом), или возиться с путями.


вот тут это фиксится




Код:

int main()
{
        Engine *eng = Engine::Init();
        Window *wnd = eng->AddWindow(800,600);
        wnd->VSync(false);
        //TODO: Place your resource loading and scene creating code here
        Scene *s = eng->AddScene();
        Canvas *c = eng->GetCanvas();

        my_Cam *cam= new my_Cam(s,800,600);

        StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));

        Planet *something = new Planet(s,                      //сцена
                                      64,                    //разрешение меша
                                      vec3(2,0,-8)            //позиция объекта
                                      );




        while(wnd->isRunning())
        {
                Turn_it_by_wasd(something->body,0.5);
                cam->Update();
                c->Clear();
                s->Render();

                c->SetPosition(10,10);
                c->Print(L"fps: %d",eng->GetStatistics()->GetFPS());
                wnd->Flip();
        }
        //TODO: Place your deinitalize code here
        eng->Free();
}



причем иногда сразу после запуска показывает нормальные цифирки.

как мне починить это? И есть ли какой редактор с подсветкой синтаксиса шейдеров?

пдф'ка про шейдеры жжет, я ожидал там чтото типа шагов для хорса :)))

HolyDel 28.07.2012 23:45

Ответ: Странное.
 
Цитата:

вот тут это фиксится
спасиб. просто поправлю проекты темплейта тогда.

Цитата:

причем иногда сразу после запуска показывает нормальные цифирки.
тут хз. попробуй шрифт явно грузить.
у меня такая фигня случается если окно удалить - и заново создать. в процессе фиксанья.


Часовой пояс GMT +4, время: 01:15.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot