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

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

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

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

Ответ
 
Опции темы
Старый 13.02.2012, 18:56   #406
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

да. это правильно.

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

при этом ему надо назначить шейдер. то что щас работает - это глюк.

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

нормали пока считать не умеем.

вобщем чтобы хоть что то увидеть надо сделать такое:

* инициализировать окно
* создать сцену
* создать в сцене камеру
* создать геометрию
* добавить геометрию в сцену
* назначить шейдер объекту
* отрендерить сцену
* флипнуть буфера

как в блице одним CreateCube():Flip() не обойтись ((
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (13.02.2012)
Старый 14.02.2012, 19:19   #407
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.



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



//*****************************************************
        Surface *user_surface = eng->CreateSurface(26,15*3);
    {

        user_surface->Lock();
        float fat=0.7f;
        //звезда
        vec3 v0(0,1,0);
        vec3 v1(0.309,0.809,0.5);
        vec3 v2(0.809,0.5,0.309);
        vec3 v3(0.809,0.5,-0.309);
        vec3 v4(0.309,0.809,-0.5);
        vec3 v5(0.447,0.724,0.0);
        //межзвездье
        vec3 v00=vec3(0.0,0.873,0.333)*fat;
        vec3 v01=vec3(0.539,0.539,0.539)*fat;
        vec3 v02=vec3(0.873,0.333,0.0)*fat;
        vec3 v03=vec3(0.539,0.539,-0.539)*fat;
        vec3 v04=vec3(0.0,0.873,-0.333)*fat;
        //полигон звезды
        {
            user_surface->SetVertexPosition(0,v0);
            user_surface->SetVertexPosition(1,v1);
            user_surface->SetVertexPosition(2,v2);
            user_surface->SetVertexPosition(3,v3);
            user_surface->SetVertexPosition(4,v4);
            user_surface->SetVertexPosition(5,v5);

            vec3 norm=((v0-v1).cross(v0-v2)).normalize();

            user_surface->SetVertexNormal(0,norm);
            user_surface->SetVertexNormal(1,norm);
            user_surface->SetVertexNormal(2,norm);
            user_surface->SetVertexNormal(3,norm);
            user_surface->SetVertexNormal(4,norm);
            user_surface->SetVertexNormal(5,norm);

            user_surface->SetTriangle(0,5,0,2);
            user_surface->SetTriangle(1,5,3,0);
            user_surface->SetTriangle(2,5,1,3);
            user_surface->SetTriangle(3,5,4,1);
            user_surface->SetTriangle(4,5,2,4);
        }

        //бортик
        int i=0;
        int b=0;
        {
            user_surface->SetVertexPosition(6+i,v0);
            user_surface->SetVertexPosition(7+i,v2);
            user_surface->SetVertexPosition(8+i,v00);
            user_surface->SetVertexPosition(9+i,v01);

            vec3 norm=((v0-v2).cross(v00-v0)).normalize();

            user_surface->SetVertexNormal(6+i,norm);
            user_surface->SetVertexNormal(7+i,norm);
            user_surface->SetVertexNormal(8+i,norm);
            user_surface->SetVertexNormal(9+i,norm);

            user_surface->SetTriangle(5+b,6+i,8+i,7+i);
            user_surface->SetTriangle(6+b,8+i,9+i,7+i);
        }
        i=i+4;
        b=b+2;
        {
            user_surface->SetVertexPosition(6+i,v2);
            user_surface->SetVertexPosition(7+i,v4);
            user_surface->SetVertexPosition(8+i,v02);
            user_surface->SetVertexPosition(9+i,v03);

            vec3 norm=((v2-v4).cross(v02-v2)).normalize();

            user_surface->SetVertexNormal(6+i,norm);
            user_surface->SetVertexNormal(7+i,norm);
            user_surface->SetVertexNormal(8+i,norm);
            user_surface->SetVertexNormal(9+i,norm);

            user_surface->SetTriangle(5+b,6+i,8+i,7+i);
            user_surface->SetTriangle(6+b,8+i,9+i,7+i);
        }
        i=i+4;
        b=b+2;
        {
            user_surface->SetVertexPosition(6+i,v4);
            user_surface->SetVertexPosition(7+i,v1);
            user_surface->SetVertexPosition(8+i,v04);
            user_surface->SetVertexPosition(9+i,v00);

            vec3 norm=((v4-v1).cross(v04-v4)).normalize();

            user_surface->SetVertexNormal(6+i,norm);
            user_surface->SetVertexNormal(7+i,norm);
            user_surface->SetVertexNormal(8+i,norm);
            user_surface->SetVertexNormal(9+i,norm);

            user_surface->SetTriangle(5+b,6+i,8+i,7+i);
            user_surface->SetTriangle(6+b,8+i,9+i,7+i);
        }

        i=i+4;
        b=b+2;
        {
            user_surface->SetVertexPosition(6+i,v1);
            user_surface->SetVertexPosition(7+i,v3);
            user_surface->SetVertexPosition(8+i,v01);
            user_surface->SetVertexPosition(9+i,v02);

            vec3 norm=((v1-v3).cross(v01-v1)).normalize();

            user_surface->SetVertexNormal(6+i,norm);
            user_surface->SetVertexNormal(7+i,norm);
            user_surface->SetVertexNormal(8+i,norm);
            user_surface->SetVertexNormal(9+i,norm);

            user_surface->SetTriangle(5+b,6+i,8+i,7+i);
            user_surface->SetTriangle(6+b,8+i,9+i,7+i);
        }
        i=i+4;
        b=b+2;
        {
            user_surface->SetVertexPosition(6+i,v3);
            user_surface->SetVertexPosition(7+i,v0);
            user_surface->SetVertexPosition(8+i,v03);
            user_surface->SetVertexPosition(9+i,v04);

            vec3 norm=((v3-v0).cross(v03-v3)).normalize();

            user_surface->SetVertexNormal(6+i,norm);
            user_surface->SetVertexNormal(7+i,norm);
            user_surface->SetVertexNormal(8+i,norm);
            user_surface->SetVertexNormal(9+i,norm);

            user_surface->SetTriangle(5+b,6+i,8+i,7+i);
            user_surface->SetTriangle(6+b,8+i,9+i,7+i);
        }

        user_surface->RecalcTangents();
        user_surface->UnLock();
    }


        Entity *body = s->Add(user_surface);
        StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));
        body->SetShader(StandartShaders::Render::OnlyNormals());
        body->SetPosition(0,0,-6);

        Entity *star = s->Add(user_surface);
        {star->SetParent(body);
        star->SetShader(StandartShaders::Render::OnlyNormals());
        star->SetPosition(0,0,0);
        star->Turn(180,0,0);

        star=star->Copy();
        star->Turn(90,90,0);

        star=star->Copy();
        star->Turn(270,90,0);

        star=star->Copy();
        star->Turn(90,0,90);

        star=star->Copy();
        star->Turn(90,0,270);
        // зеркало
        star=star->Copy();
        star->Turn(0,180,0);

        star=star->Copy();
        star->Turn(180,180,0);

        star=star->Copy();
        star->Turn(90,270,0);

        star=star->Copy();
        star->Turn(270,270,0);

        star=star->Copy();
        star->Turn(90,180,90);

        star=star->Copy();
        star->Turn(90,180,270);
        }
//****************************************************


Это черезжопный способ или пойдет?
А шейдером который на уровне полигонов работает нормали сложно считать?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (14.02.2012)
Старый 14.02.2012, 19:40   #408
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

Это черезжопный способ или пойдет?
способ как способ. только это ни одна поверхность а 11. соотвественно рисоваться они будут за 11 дипов. Если надо - могу в следующий сдк добавить пересчет нормалей и работу с сюрфейсами. Типа скейла, перемещения, поворота и аттача.

А шейдером который на уровне полигонов работает нормали сложно считать?
только не сглаженные. считать просто - тупой crossproduct. А вот сглаженные уже не получится.

если тебе нравится генерировать примитивы, почему бы тебе не помочь проекту, и не написать генерацию сферы, конуса, торусов и т.д. (на свое усмотрение) в виде стандартной библиотеки примитивов. Я могу дать тебе доступ к SVN-ке на запись.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (14.02.2012)
Старый 14.02.2012, 19:56   #409
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Сообщение от HolyDel Посмотреть сообщение
способ как способ. только это ни одна поверхность а 11. соотвественно рисоваться они будут за 11 дипов. Если надо - могу в следующий сдк добавить пересчет нормалей и работу с сюрфейсами. Типа скейла, перемещения, поворота и аттача.
Я сомневаюсь, что нормальным людям такие функции потребуются хотя бы раз А маньяки и сами справятся

если тебе нравится генерировать примитивы, почему бы тебе не помочь проекту, и не написать генерацию сферы, конуса, торусов и т.д. (на свое усмотрение) в виде стандартной библиотеки примитивов. Я могу дать тебе доступ к SVN-ке на запись.
Я слишком тупой и ленивый для того, чтобы SVN пользоваться. Так что доступа мне лучше не давать. Но торы пружинки и прочую херь сделать смогу и скорее всего сделаю.
(Offline)
 
Ответить с цитированием
Старый 18.02.2012, 23:14   #410
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Сфера.


Surface* sphere(int seg,float radius, Engine *eng){

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

        int index=(resol+1)*i+j;
        float M_PI=2.0f*3.14159265358979323846f;
        float x=cos(M_PI*i/(float)resol);
        float y=sin(M_PI*i/(float)resol);
        float zc=cos(M_PI*j/(float)resol);
        float zs=sin(M_PI*j/(float)resol);
        vec3 position(x*zs,y*zs,zc);
        surf->SetVertexPosition(index,position*radius);
        surf->SetVertexNormal(index,position);
        surf->SetVertexTexCoord(index,i/(float)resol,j/(float)resol);
    }}

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

    }}
surf->RecalcTangents();
surf->UnLock();
return surf;
}
Как мне в подобного вида функциях использовать cSurface чтоб в функцию указатель на двиг не передавать?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (18.02.2012)
Старый 19.02.2012, 02:10   #411
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

Как мне в подобного вида функциях использовать cSurface чтоб в функцию указатель на двиг не передавать?
не передавать можно так:
Engine *eng = Engine::Instance();

чтобы пользоваться CSurface - надо писать в Cube.cpp например. Чтобы код оставался в длл-ке. Проще всего было бы использовать SVN-ку (благо, тебе надо лишь поставить tortoiseSVN и мне зарегить тебя) ибо в последних версиях sdk информация для системы контроля версий катается вместе с движком. Либо ты можешь включить какой нибудь файл, скажем, dsd_surfaces.cpp в движок, и писать код там. Тестируя на каком-нибудь сэмпле. А как наиграешься. передать его любым способом мне
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (19.02.2012)
Старый 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)
Старый 21.02.2012, 02:00   #413
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

Почему границы полигонов проявляются?
честно говоря хз. да и странные они какие-то. больше похоже на глюк в шейдере освещения, чем глюк в расчетах нормали.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (21.02.2012)
Старый 22.02.2012, 16:58   #414
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

ХолиДел, а как мне получать данные о точках и полигонах поверхности?


int q_vert=surf->CountVertices();
int q_tris=surf->CountTriangles();
Это я узнал количество точек и полигонов.
А как мне узнать какому полигону какие точки принадлежат и как мне
из VertexInfo данные точек читать?
(Offline)
 
Ответить с цитированием
Старый 22.02.2012, 17:38   #415
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

в текущем SDK нет такого функционала к сожалению ((
в той версии, что в СВН-ке, уже есть:

for(int i=0;i<cube->CountTriangles();++i)
		{
			int index0,index1,index2;
			cube->GetTriangle(i,index0,index1,index2);
			std::cout<<"tris "<<i<<" ("<<index0<<","<<index1<<","<<index2<<")"<<std::endl;
		}

		for(int i=0;i<cube->CountVertices();++i)
		{
			vec2 uv0;
			vec2 uv1;

			vec3 position;
			vec3 normal;
			vec3 tangent;
			vec4 color;

			cube->GetVertexPosition(i,position);
			cube->GetVertexNormal(i,normal);
			cube->GetVertexTangent(i,tangent);
			cube->GetVertexColor(i,color);
			cube->GetVertexTexCoord(i,uv0,0);
			cube->GetVertexTexCoord(i,uv1,1);
			std::cout<<"vertex "<<i<<std::endl;
			std::cout<<"    position ("<<position.x<<","<<position.y<<","<<position.z<<")"<<std::endl;
			std::cout<<"    normal   ("<<normal.x<<","<<normal.y<<","<<normal.z<<")"<<std::endl;
			std::cout<<"    tangent  ("<<tangent.x<<","<<tangent.y<<","<<tangent.z<<")"<<std::endl;
			std::cout<<"    color    ("<<color.x<<","<<color.y<<","<<color.z<<")"<<std::endl;

			std::cout<<"    uv0      ("<<uv0.x<<","<<uv0.y<<")"<<std::endl;
			std::cout<<"    uv1      ("<<uv1.x<<","<<uv1.y<<")"<<std::endl;
		}
новую версию SDK я смогу собрать только 6-7 марта.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (22.02.2012)
Старый 22.02.2012, 18:03   #416
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Тогда уж и обновление нормалей добавить надо. Я как раз такую функцию и хотел запилить.
(Offline)
 
Ответить с цитированием
Старый 22.02.2012, 19:11   #417
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

такие функции лучше все же внутри движка пилить. даже лучше внутри класса, чтобы не тратить время на лишних виртаульных вызовах.
(Offline)
 
Ответить с цитированием
Старый 24.02.2012, 23:34   #418
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

А сегодня в моем бложике день петросяна.

Подходит зебра к гаишнику, и, смущаясь, говорит: - Простите, а где вы это взяли?

Настойчивый верблюд 3 часа переплевывался с гопником.

- Когда ты понял что она пьяная?
-Когда мне пришла смска "Позвони мне, я немогу найти свой телефон"

Заходит студент,препод его спрашивает:
-Ты едешь в маршрутке там очень жарко,твои действия?
Студент:
-Я открою окно.
Препод:
-Правильно,а теперь рассчитай изменение в аэродинамике маршрутки в результате открытого окна!
Студент:
-Ээээээээээээ...
Препод:
-Идите, два.
И так он еще несколько человек завалил,после чего заходит девушка!
Он задает ей тот же самый вопрос:
-Вы едете в маршрутке,там жарко,ваши действия?
Девушка:
-Блузку сниму.
Препод:
-Вы не поняли,там жарко.
Девушка:
-Ну тогда лифчик сниму.
Препод:
-Вы снова не поняли..ТАМ ОЧЕНЬ ЖАРКО!
Девушка:
-ДА ПУСТЬ МЕНЯ ХОТЬ ВСЯ МАРШРУТКА ВЫЕБЕТ,ОКНО Я НЕ ОТКРОЮ!!


Солдат стоит на посту. К нему подходит полковник и спрашивает:
- Звание, фамилия?
- Рядовой Петров
- Сколько человек в роте?
- 75
- Сколько человек в батальоне?
- 250
- А ты чего же это военную тайну выдаёшь? Вдруг я шпион!
Раздаётся выстрел... Солдат:
- Ты посмотри какая наглая сволочь


Армянские ЭМО отращивают чёлку на груди.


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


Маленькая девочка подходит к маме заплаканная:
- Мама, моя черепашка умерла.
- Ну, доченька, не горюй, мы положим ее в картонную коробку, закопаем во дворе, положим на могилку цветочки, купим кока-колы, большой торт, позовем твоих друзей и устроим пышные похороны.
В это время черепаха высунула голову из панциря.
- Эй, дочка, так ведь она живая!
Дочка радостно:
- Ой, мама, а можно я ее придушу?!

Самолет American Airlines терпит крушение. Ну выходит стюардесса, и говорит: — Дамы и господа, минуточку внимания. Наш самолет падает. Поэтому, чтобы облегчить борт, мы уже выкинули весь багаж, а сейчас начнем выкидывать пассажиров. Однако, для обеспечения принципов справедливости, равенства и демократии, пассажиров будем выкидывать по алфавиту. Итак, я начинаю.
A — afroamericans…
B — black people…
C — coloured people…
В хвосте сидят два негра — папа и сын.
— dad, why don't we go, she allready called on us three times?
— Shut the fuck up, boy!! Today we are niggers and go right after mexicans!


-Я не был пьян.
-Чувак,ты кидал моего хомяка по комнате и орал:"Пикачу,я выбираю тебя".


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


Купил мужик петуха. В первый день он всех кур трахнул, на второй всех гусей. Мужик думает, пиздец петуху придет, если и дальше всех так трахать будет. На третий день видит мужик лежит петух по среди двора, а вокруг него зерно. Мужик подошел и говорит: — Ах ты петух.. так и знал, что сдуешься! Петух приоткрыл один глаз и говорит:
— Сука, спугнешь ворон, я тебя выебу!

Положил детскую соску-пустышку рядом с плитой, она pасплавилась и пристала к столу. Набрал в Яндексе: как отодрать соску?... забыл, что искал...
(Offline)
 
Ответить с цитированием
Старый 25.02.2012, 12:35   #419
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,853 пользователей)
Ответ: Странное.

__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 02.03.2012, 23:27   #420
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.




Surface* Cyle(int capSeg, int heightSeg, float radius, float height){
Engine *eng = Engine::Instance();


//подсчет индексов для поверхности
int count_vertices =(heightSeg+3)*(capSeg+1)+2;
int count_indices = 3*(2*(heightSeg*capSeg)+2*capSeg);
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//расстановка точек.
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 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);

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

        position=vec3(x,y,0).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 x=radius*cos(M_PI*i/(float)capSeg);
        float y=radius*sin(M_PI*i/(float)capSeg);
        float zc=0;
        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);
}

//Затычка №2
for(int i=0;i<=capSeg;i++){
    int index=(heightSeg+2)*(capSeg+1)+i+1;
    float M_PI=2.0f*3.14159265358979323846f;
        float x=radius*cos(M_PI*i/(float)capSeg);
        float y=radius*sin(M_PI*i/(float)capSeg);
        float zc=height;
        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);
}
centerPoint=(heightSeg+3)*(capSeg+1)+1;
//постановка центральной точки
        vec3 position=vec3(0,0,height);
        surf->SetVertexPosition(centerPoint,position);
        position=vec3(0,0,1);
        surf->SetVertexNormal(centerPoint,position);
        surf->SetVertexTexCoord(centerPoint,0.5,0.5);
//палигоны

for(int i=0;i<capSeg;i++){
int index=2*(heightSeg*capSeg)+i+capSeg;
int v0=centerPoint;
int v1=v0+i-capSeg-1;
int v2=v1+1;
surf->SetTriangle(index,v0,v1,v2);
}
surf->RecalcTangents();
surf->UnLock();
return surf;
}
Оказалось цилиндр сложней тора
Имел странные глюки Получилось почему-то только с 4 раза. И то осталось впечатление, что я движок где-та наебал )
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (03.03.2012)
Ответ


Опции темы

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

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


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


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