Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 03.03.2012, 21:16   #421
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.



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;
}
Нормаль к поверхности это косинусы углов этой поверхности к соотв осям, да? Дно у цилиндра и конуса имеет кривые текстурные координаты
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 01:44   #422
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

новую версию SDK я смогу собрать только 6-7 марта.
версия вышла значительно позже, но в ней зато есть теперь:
ХолиДел, а как мне получать данные о точках и полигонах поверхности?
+ я с твоего разрешения перенесу твои функции в ядро, ок? в список стандартных примитивов. а то кубов и плоскостей - мало.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (20.07.2012)
Старый 20.07.2012, 02:54   #423
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

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

А про ошибку в конструкторе я не допер за полгода с++ стал забываться Но сейчас кодинг вроде вновь интересен стал.
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Старый 21.07.2012, 15:16   #425
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

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

проблема с ресурсами в том - что он ищет файлы в папке проекта (при дебаге). я не нашел в кодеблоксах где настроить этот параметр.
поэтому теперь выбор - или складывать все ексешники и прочее барахло в папку с проектами (и в мсвс визарде также), соответственно переименовывать их, например coolsphere_d.exe (все ето будет ткже делать визардом), или возиться с путями.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (21.07.2012)
Старый 21.07.2012, 15:51   #426
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

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

Это в общем плоскость 1х2 и первая часть обернута вокруг полусферы с полюсом в (0.5 0.5), и вторая часть обернута по той же сфере. Это чтобы карту шума накладывать можно было без искажений у полюсов.
Если научусь массив флоатов переводить быстро в картинку то можно будет сразу автоматом считать текстуру по которой нормали отворачивать, чтобы рельеф имитировать, карту смещений и заодно текстуру делать наподобие той что была в последней версии генератора поверхности земли под хорс. В общем занятный примитив должен выйти, причем только кодом. А учитывая как я пишу код хрен кто скопировать сможет если даже захочет ))
(Offline)
 
Ответить с цитированием
Старый 21.07.2012, 15:54   #427
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

Если научусь массив флоатов переводить быстро в картинку
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);
как то так.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (21.07.2012)
Старый 21.07.2012, 21:27   #428
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

axmath.h
#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> не хочет почему то работать.
(Offline)
 
Ответить с цитированием
Старый 21.07.2012, 22:54   #429
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

а где аналог 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;
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (21.07.2012)
Старый 21.07.2012, 23:32   #430
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.



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

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

Последний раз редактировалось dsd, 13.08.2012 в 19:28.
(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 00:55   #431
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

вроде работает. только у тебя там какаие - то странные, неправильные стыки между полусферами.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (22.07.2012)
Старый 22.07.2012, 02:01   #432
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

я в курсе. это оно в черне заработало.
Теперь буду пилить и сам шум и геометрию сферы, надо ее по диагоналям более разреженной сделать, а шов из-за кривого генератора шума. там где смещения читаются для последней строки стоят немного не те значения. карта просто шире слегка чем количество точек в меше.
Плюс я тупее в с++ стал. сильно тупей. по этому и исходник пока не приложил, там такой ужас )))
(Offline)
 
Ответить с цитированием
Старый 26.07.2012, 02:37   #433
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.



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

Последний раз редактировалось dsd, 13.08.2012 в 19:28.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (26.07.2012)
Старый 28.07.2012, 22:14   #434
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

и ложу текстуру рядом с экзешником, в дебаге вообще почему то упало, а в релизе написало что файл найти не может после того как из кодеблокса запустил. Причем если экзешник из папки запускать находит. Что я делаю не так?
Сообщение от HolyDel Посмотреть сообщение
проблема с ресурсами в том - что он ищет файлы в папке проекта (при дебаге). я не нашел в кодеблоксах где настроить этот параметр.
поэтому теперь выбор - или складывать все ексешники и прочее барахло в папку с проектами (и в мсвс визарде также), соответственно переименовывать их, например 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();
}


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

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

пдф'ка про шейдеры жжет, я ожидал там чтото типа шагов для хорса ))
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (28.07.2012)
Старый 28.07.2012, 23:45   #435
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

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

причем иногда сразу после запуска показывает нормальные цифирки.
тут хз. попробуй шрифт явно грузить.
у меня такая фигня случается если окно удалить - и заново создать. в процессе фиксанья.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (28.07.2012)
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com