|
Xors3D Графический движок с поддержкой DirectX9 |
03.03.2012, 21:16
|
#421
|
Мастер
Регистрация: 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
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
новую версию SDK я смогу собрать только 6-7 марта.
|
версия вышла значительно позже, но в ней зато есть теперь:
ХолиДел, а как мне получать данные о точках и полигонах поверхности?
|
+ я с твоего разрешения перенесу твои функции в ядро, ок? в список стандартных примитивов. а то кубов и плоскостей - мало.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.07.2012, 02:54
|
#423
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от HolyDel
+ я с твоего разрешения перенесу твои функции в ядро, ок? в список стандартных примитивов. а то кубов и плоскостей - мало.
|
Я согласен )))
А про ошибку в конструкторе я не допер за полгода с++ стал забываться Но сейчас кодинг вроде вновь интересен стал.
|
(Offline)
|
|
21.07.2012, 02:27
|
#424
|
Мастер
Регистрация: 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
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
текстура как то странно натянута. так и задумывалось?
проблема с ресурсами в том - что он ищет файлы в папке проекта (при дебаге). я не нашел в кодеблоксах где настроить этот параметр.
поэтому теперь выбор - или складывать все ексешники и прочее барахло в папку с проектами (и в мсвс визарде также), соответственно переименовывать их, например coolsphere_d.exe (все ето будет ткже делать визардом), или возиться с путями.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.07.2012, 15:51
|
#426
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
так и задумывалось плюс по диагоналям там чу-чуть бубном постучать надо(это на них максимальное искажение). К ночи может выйдет повторить тот генератор камней-планет.
Это в общем плоскость 1х2 и первая часть обернута вокруг полусферы с полюсом в (0.5 0.5), и вторая часть обернута по той же сфере. Это чтобы карту шума накладывать можно было без искажений у полюсов.
Если научусь массив флоатов переводить быстро в картинку то можно будет сразу автоматом считать текстуру по которой нормали отворачивать, чтобы рельеф имитировать, карту смещений и заодно текстуру делать наподобие той что была в последней версии генератора поверхности земли под хорс. В общем занятный примитив должен выйти, причем только кодом. А учитывая как я пишу код хрен кто скопировать сможет если даже захочет ))
|
(Offline)
|
|
21.07.2012, 15:54
|
#427
|
☭
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.07.2012, 21:27
|
#428
|
Мастер
Регистрация: 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 min, int max); AXELYNX_API float FAST_CALL rnd(float max); AXELYNX_API float FAST_CALL rnd(float min, float max);
AXELYNX_API void sincos(float a,float & s,float & c );
AXELYNX_API bool LineSphereIntersect(const vec3& base, const vec3& dir, const vec4& sphere);
AXELYNX_API void CalcTriangleBasis( const axelynx::vec3& E, const axelynx::vec3& F, const axelynx::vec3& G, float sE, float tE, float sF, float tF, float sG, float tG, axelynx::vec3& tangentX, axelynx::vec3& tangentY ); AXELYNX_API axelynx::vec3 ClosestPointOnLine( const axelynx::vec3& a, const axelynx::vec3& b, const axelynx::vec3& p ); AXELYNX_API axelynx::vec3 Ortogonalize( const axelynx::vec3& v1, const axelynx::vec3& v2 ); }
а где аналог srand()? Нужен, однако, а rand() из <cmath> не хочет почему то работать.
|
(Offline)
|
|
21.07.2012, 22:54
|
#429
|
☭
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.07.2012, 23:32
|
#430
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
вроде получается по чучуть. теперь оно хотя бы запускается )
на стрелки можно двигать камеру
зы: терь не просит текстуру
Последний раз редактировалось dsd, 13.08.2012 в 19:28.
|
(Offline)
|
|
22.07.2012, 00:55
|
#431
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
вроде работает. только у тебя там какаие - то странные, неправильные стыки между полусферами.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.07.2012, 02:01
|
#432
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
я в курсе. это оно в черне заработало.
Теперь буду пилить и сам шум и геометрию сферы, надо ее по диагоналям более разреженной сделать, а шов из-за кривого генератора шума. там где смещения читаются для последней строки стоят немного не те значения. карта просто шире слегка чем количество точек в меше.
Плюс я тупее в с++ стал. сильно тупей. по этому и исходник пока не приложил, там такой ужас )))
|
(Offline)
|
|
26.07.2012, 02:37
|
#433
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Вроде бы искажения текстурных координат не столь чудовищны как раньше, швы теперь не видно и шум накладывается без искажений.
Последний раз редактировалось dsd, 13.08.2012 в 19:28.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.07.2012, 22:14
|
#434
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.07.2012, 23:45
|
#435
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
спасиб. просто поправлю проекты темплейта тогда.
причем иногда сразу после запуска показывает нормальные цифирки.
|
тут хз. попробуй шрифт явно грузить.
у меня такая фигня случается если окно удалить - и заново создать. в процессе фиксанья.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:55.
|