|
Xors3D Графический движок с поддержкой DirectX9 |
13.02.2012, 18:56
|
#406
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
да. это правильно.
когда сюрфейс заполнен - это лишь заполненная область видеопамяти.
чтобы сюрфейс рендерился - его надо добавить в сцену. сюрфейс можно добавить тыщу раз в сцену. это будет тысяча инстанций одного сюрфейса. У них может быть свой материал, своя матрица трансформации. Но единая геометрия.
при этом ему надо назначить шейдер. то что щас работает - это глюк.
скорее всего для каждого типа геометрии будут свои шейдеры по умолчанию. Чтобы снизить кол-во кода для вывода одного кубика.
нормали пока считать не умеем.
вобщем чтобы хоть что то увидеть надо сделать такое:
* инициализировать окно
* создать сцену
* создать в сцене камеру
* создать геометрию
* добавить геометрию в сцену
* назначить шейдер объекту
* отрендерить сцену
* флипнуть буфера
как в блице одним CreateCube():Flip() не обойтись ((
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.02.2012, 19:19
|
#407
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.02.2012, 19:40
|
#408
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
Это черезжопный способ или пойдет?
|
способ как способ. только это ни одна поверхность а 11. соотвественно рисоваться они будут за 11 дипов. Если надо - могу в следующий сдк добавить пересчет нормалей и работу с сюрфейсами. Типа скейла, перемещения, поворота и аттача.
А шейдером который на уровне полигонов работает нормали сложно считать?
|
только не сглаженные. считать просто - тупой crossproduct. А вот сглаженные уже не получится.
если тебе нравится генерировать примитивы, почему бы тебе не помочь проекту, и не написать генерацию сферы, конуса, торусов и т.д. (на свое усмотрение) в виде стандартной библиотеки примитивов. Я могу дать тебе доступ к SVN-ке на запись.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.02.2012, 19:56
|
#409
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от HolyDel
способ как способ. только это ни одна поверхность а 11. соотвественно рисоваться они будут за 11 дипов. Если надо - могу в следующий сдк добавить пересчет нормалей и работу с сюрфейсами. Типа скейла, перемещения, поворота и аттача.
|
Я сомневаюсь, что нормальным людям такие функции потребуются хотя бы раз А маньяки и сами справятся
если тебе нравится генерировать примитивы, почему бы тебе не помочь проекту, и не написать генерацию сферы, конуса, торусов и т.д. (на свое усмотрение) в виде стандартной библиотеки примитивов. Я могу дать тебе доступ к SVN-ке на запись.
|
Я слишком тупой и ленивый для того, чтобы SVN пользоваться. Так что доступа мне лучше не давать. Но торы пружинки и прочую херь сделать смогу и скорее всего сделаю.
|
(Offline)
|
|
18.02.2012, 23:14
|
#410
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.02.2012, 02:10
|
#411
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
Как мне в подобного вида функциях использовать cSurface чтоб в функцию указатель на двиг не передавать?
|
не передавать можно так:
Engine *eng = Engine::Instance();
чтобы пользоваться CSurface - надо писать в Cube.cpp например. Чтобы код оставался в длл-ке. Проще всего было бы использовать SVN-ку (благо, тебе надо лишь поставить tortoiseSVN и мне зарегить тебя) ибо в последних версиях sdk информация для системы контроля версий катается вместе с движком. Либо ты можешь включить какой нибудь файл, скажем, dsd_surfaces.cpp в движок, и писать код там. Тестируя на каком-нибудь сэмпле. А как наиграешься. передать его любым способом мне
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.02.2012, 01:05
|
#412
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.02.2012, 02:00
|
#413
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
Почему границы полигонов проявляются?
|
честно говоря хз. да и странные они какие-то. больше похоже на глюк в шейдере освещения, чем глюк в расчетах нормали.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.02.2012, 16:58
|
#414
|
Мастер
Регистрация: 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
|
☭
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.02.2012, 18:03
|
#416
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Тогда уж и обновление нормалей добавить надо. Я как раз такую функцию и хотел запилить.
|
(Offline)
|
|
22.02.2012, 19:11
|
#417
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
такие функции лучше все же внутри движка пилить. даже лучше внутри класса, чтобы не тратить время на лишних виртаульных вызовах.
|
(Offline)
|
|
24.02.2012, 23:34
|
#418
|
Мастер
Регистрация: 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
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Странное.
__________________
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
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:06.
|