Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Сцена и объекты на ней


Автор: Reptor 8.10.2008, 13:41
вот... проблема у меня такого характера...
Я хочу нарисовать местность похожую на реальность.. тоесть чтоб было небо земля на земле дорогт и тротуары...а надороге например светофоры. Но я пока не могу понять как это сделать что б красиво выглядело..что б объекты были не очень большими и не очень маленькими.. ну как бы всё было в меру..

Вот у меня сейчас есть координаты дороги (это как бы структура дороги).
ну например вот будет одна сторона перекрёстка.

т1(400, 500, 0)
т1(600, 500, 0)
т1(600, 300, 0)
т1(400, 300, 0)

 вот перекрёсток я нарисовал.. таким образом...взял самую большую координату и сказал что это будет 1 в опенГЛ там же от -1 до 1 вот в примере это будет 600. И рисовал точки таким образом через GL_POLYGON. Тут как бы находил через пропорцию

600 - 1
400 - х  и значит точка с координатой  400, 500, 0 это будет (400/600, 500/600, 0) вот но тут этот перекрёсток рисеутся но по У вниз уежает надо его ловить.. сразу его не видно . Нарисовал светофор в виде куба получился какойто огромный размером с камаз...

Вот если ав играли в игры то видели как так если со стороны игрока смореть например GTA там какой город...

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


Помогите пожалуста с чего начать и как двигаться что б сделать сценку с нормальным видом.. ? smile 

Я всё понемногу знаю а вот как с этого сделать что то стоящие то пока не знаю ... и не знаю как поступить в том или 2-ом случаи

Автор: Rickert 8.10.2008, 14:32
И теперь у нас всё время шесть часов, и всё время пора пить чай smile

Добавлено через 3 минуты и 3 секунды
Уважаемый, давайте по пунктам перечислите проблемы. Медленно, обдумывая каждое слово, и перед постом перечитав свой текст несколько десятков раз. А то вот лично я понял что две проблемы:
0) Вы не знаете как сохранить соответствие пропорций. Тут ответ прост - вы выбираете некую меру, допустим 1 единица числа типа float = 1 метру. Исходя из этого вы делаете модели, экспортируете их, или же рисуете сами (я понял что вы вроде так светофор сделали).
1) Вы не знаете с какой стороны и за что взяться в вашем вопросе. В этом слуае опиши задачу чётко smile 

Автор: Reptor 8.10.2008, 15:20
Rickert, извеняюсь за некоректные посты просто у меня мысли все поперепутывались.. не знаю за что взяться...

Значит так.

Я хочу для начала сделать какойто пейзаж ну что б была какаято земля (ну обычный асвальт) и небо.  Потом на этом асвальте нарисовать дорогу ну мой перекрёсток который у меня задан вот теми координатами которые я привел в первом примере. И на этот перекрёсток добавить светофоры.

Вот я отыскал какуюто картинку (в атаче) там конесно всё красиво но мне вот не так уж клёво можно всё попроще но конечно в идеале было б неплохо и что то вроде этого.
Я не знаю с чего начать... как декомпозировать задачу и что за чем делать и как правильно делаь?

у меня всё какоето кривое выходит без соответствия размерам. Так как координаты экранные x=600 a y=500 то изображение кудато убегает и непонятно дн его искать.. Светофор большой (как камаз). Короче дурдом а не сцена и всё на какомто зелёном фоне.

Автор: Reptor 8.10.2008, 18:14
Ой только что посмотрел картинку и увидел что она поломана... странно.. то что у меня то тоже уже чорная.. може скачалась как то плохо..

Ну тогда без картинки... там собственно ничего такого просто местность нарисована.

Автор: Rickert 9.10.2008, 06:03
Короче я буду задавать вопросы, а вы отвечайте: вам нужно двухмерное изображение или трёхмерное?

Автор: Reptor 9.10.2008, 11:20
Rickert, спасибо огромное.

Мне нужно изображение 3-оьх мерное... но информация (точки) по которым будет происходить прорисовка дороги 2-ух мерные (экранные). Как в примере который я наводил. т1(400,500)....

Автор: Rickert 9.10.2008, 11:43
Значит так, тормозим и делаем всё последовательно.
Сначала небо. Проще всего его сделать через skyBox.
Берём в руки поисковик и пишем там что-нибудь типа "как реализовать skybox".
Также идём поиском на www.gamedev.ru
Вот вам одна прямая ссылка - http://sidvind.com/wiki/Skybox_tutorial

По сути skybox - Это коробка, внутри которой находится вся сцена. Текстура этой коробки - это текстра неба, либо ещё какого-то окружения. Коробка движется вместе с камерой.

Теперь остановитесь, не метайтесь, а сделайте сначала skybox, потом пойдём дальше. Буду вашим гидом в создании ВР smile 

Автор: Reptor 9.10.2008, 12:57
Rickert, это я посмотрел и понял идею... мы делаем просто коробку в которую потом всё поместим...
Но я взял тот код который по той ссылке.. и зделал но у меня не вышло иак красиво как там..

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

GLvoid LoadGLTextures(){
    
    AUX_RGBImageRec *texture1;
    texture1 = auxDIBImageLoad("Ground.bmp");
    glGenTextures(1,&texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, texture1->data);

    texture1 = auxDIBImageLoad("t1.bmp");
    glGenTextures(1,&texture[1]);
    glBindTexture(GL_TEXTURE_2D, texture[1]);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, texture1->data);


    texture1 = auxDIBImageLoad("t2.bmp");
    glGenTextures(1,&texture[2]);
    glBindTexture(GL_TEXTURE_2D, texture[2]);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, texture1->data);

    texture1 = auxDIBImageLoad("t3.bmp");
    glGenTextures(1,&texture[3]);
    glBindTexture(GL_TEXTURE_2D, texture[3]);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, texture1->data);

    texture1 = auxDIBImageLoad("t4.bmp");
    glGenTextures(1,&texture[4]);
    glBindTexture(GL_TEXTURE_2D, texture[4]);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, texture1->data);

    texture1 = auxDIBImageLoad("t5.bmp");
    glGenTextures(1,&texture[5]);
    glBindTexture(GL_TEXTURE_2D, texture[5]);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, texture1->data);

    texture1 = auxDIBImageLoad("t6.bmp");
    glGenTextures(1,&texture[6]);
    glBindTexture(GL_TEXTURE_2D, texture[6]);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, texture1->data);

}


а вот собственно то де я рисую. Координаты камеры я меняю при нажатии на кнопки и делаю к переменным +0.1 или -0.1

Код

int DrawGLScene(GLvoid)                                    // Here's Where We Do All The Drawing
{

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

      // Store the current matrix
    glPushMatrix();

    // Reset and transform the matrix.
    glLoadIdentity();
    gluLookAt(
        0,0,0,
        xtranslate,ytranslate,ztranslate,
        0,1,0);

    // Enable/Disable features
    glPushAttrib(GL_ENABLE_BIT);
    glEnable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glDisable(GL_BLEND);

    // Just in case we set all vertices to white.
    glColor4f(1,1,1,1);

    // Render the front quad
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
        glTexCoord2f(0, 1); glVertex3f(  0.5f,  0.5f, -0.5f );
    glEnd();

    // Render the left quad
    glBindTexture(GL_TEXTURE_2D, texture[2]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(  0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f,  0.5f, -0.5f );
        glTexCoord2f(0, 1); glVertex3f(  0.5f,  0.5f,  0.5f );
    glEnd();

    // Render the back quad
    glBindTexture(GL_TEXTURE_2D, texture[3]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f,  0.5f,  0.5f );
        glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f,  0.5f );

    glEnd();

    // Render the right quad
    glBindTexture(GL_TEXTURE_2D, texture[4]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 0); glVertex3f( -0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f( -0.5f,  0.5f,  0.5f );
        glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
    glEnd();

    // Render the top quad
    glBindTexture(GL_TEXTURE_2D, texture[5]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
        glTexCoord2f(0, 0); glVertex3f( -0.5f,  0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f,  0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f,  0.5f, -0.5f );
    glEnd();

    // Render the bottom quad
    glBindTexture(GL_TEXTURE_2D, texture[6]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
        glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
    glEnd();

    // Restore enable bits and matrix
    glPopAttrib();
    glPopMatrix();

    


    return TRUE;                                        // Everything Went OK
}




а вот картинка в атаче то что у меня получилось.  И добпавил картинки для коробки

Автор: Rickert 9.10.2008, 13:44
Reptor, А что тебя удивляет? Квадраты? Во-первых вы поставили такой тип фильтрации: GL_NEAREST.
Код
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);

Меняем на GL_LINEAR:
Код
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);

К тому же у вас изображения размером 64х64 - это вообще убийство. В современных графических проектах используется минимум 256х256.
После этого идём на www.progz.ru, в статьях по OpenGL глава 9 посвящена текстурированию. Вообще советую вам всем там статьи прочитать - очень многое узнаете. + к этому идите на http://pmg-ru.narod.ru/russian/nehe/index.html - здесь есть уроки по OpenGL последовательные. Для старта поможет сильно.


Автор: Reptor 9.10.2008, 15:53
Rickert, я понял про текстуры... мне не совсем понятно как мне использовать мой куб... как подбирать нужные мне картинки? и он у меня какойто ограниченый как  будто я в комнате нахожусь а не в какомто свободном пространстве границы котороге не достежимы..

 smile   не понимаю

вот как там на картинке с ящиками в статье про SkyBox

Автор: Reptor 9.10.2008, 16:47
http://www.gamedev.ru/articles/?id=60113&page=2

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

Автор: Reptor 9.10.2008, 23:30
Rickert,  до меня наконецто тугодума дошло что у меня всё верно выходило со SkyBox. Я отыскал ещё один хороший пример и разобрал его детально и понял что вотето всё пространство (что я не мог понять от куда оно) всего лиш илюзия и грамотно нарисованые картинки. 

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

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

Rickert, поправьте если что не так. И от сюда такие вопросы
Что делать дальше? Бокс мне подходит? делать его с нужными мне текстурами (более большим)? а потом к следующему этапу..

Автор: Rickert 10.10.2008, 03:45
Reptor, у тебя бокс будет двигаться вместе с камерой, таким образом получится, что пространство всё время будет находится вокруг тебя.
Вторая картинка - это тоже вариант создания среды. Как она сделана? Постоянно рисуется плоскость над тобой - небо и добавлен туман, чтобы не видеть конца горизонта.
SkyBox можно и не тоскать за камерой, а просто сделать его неприлично большим.
Если разобрался с ним можем переходить к следующему вопросу?

Автор: Reptor 10.10.2008, 12:18
Rickert, да я разобрался со SkyBox... вот только я пока не понимаю как я в него помещу свои объекты. Зделать его большим или тоскать за камерой... мне сложно всё пока представить..

Автор: Reptor 10.10.2008, 14:18
Rickert, в прикреплёном файле то что у меня получилось....

От сюда замечания такие что
1. плохое качество картинок (256х256) и когда фулскрин - не очень красиво...
2. и опять же проблема в том что я не понимаю как я тут размещу свои объекты... ведь это передо мной то на самом деле просто стены с грамотными текстурами..  smile 


ну собственно это наверно и будет следущий шаг. 

Цитата

Если разобрался с ним можем переходить к следующему вопросу?


да я думаю можно

Автор: Rickert 10.10.2008, 19:23
Reptor, я предлогаю тебе бросать мне скомпилированный файл, потому что ты используешь glaux, а у меня его нет. Зачем тебе подключать библиотеки сокетов и mysql?

Цитата(Reptor @  10.10.2008,  14:18 Найти цитируемый пост)
2. и опять же проблема в том что я не понимаю как я тут размещу свои объекты... ведь это передо мной то на самом деле просто стены с грамотными текстурами..

Я так понял у тебя куб сейчас размером [-0.5; 0.5] по всем координатам?
Естественно, это слишком малый куб. Делай его в интервале от [-100; 100] хотя бы.
+ кинь скомпилированный файл (с ресурсами, естественно - куртинками).
Дальше что нам надо добавить в сцену говори?

Автор: Reptor 11.10.2008, 12:50
Rickert, прикрепил экзешник.

Цитата

Зачем тебе подключать библиотеки сокетов и mysql?

а у меня а БД есть информацыия про объекты (координаты дороги)

Цитата

Я так понял у тебя куб сейчас размером [-0.5; 0.5] по всем координатам?
Естественно, это слишком малый куб. Делай его в интервале от [-100; 100] хотя бы.


он у меня сейчас -10 до 10. Я этот старый с плохими картинками переделал (там был  [-0.5; 0.5]). А сейчас отыскал картинки ... Во тут ещё вопрос есть ли какието проги что б самому рисовать SkyBox. так как готовые не всегда подходят. 

Переделаю куб.

Цитата

Дальше что нам надо добавить в сцену говори? 



вот тут и нужен MySQL. Rickert, теперь в БД у меня есть дорога которая кем то была нарисована в экранных координатах. 
Они имеют такой вид (как пример)

т1(400, 500, 0)
т2(300, 500, 0)
т3(300, 300, 0)
т4(400, 300, 0)

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

Достать из базы точки я их могу. Собственно теперь надо этот участок дороги добавить на сцену (нарисовать). Что б была дорога на земле.








 

Автор: Rickert 11.10.2008, 17:44
Цитата(Reptor @  11.10.2008,  12:50 Найти цитируемый пост)
Rickert, прикрепил экзешник.

Сразу дам совет: после сдвига камера, при движении мышью, позиционируй его в точку, от которой отталкиваешь в расчётках (как правило центр рабочего экрана окна) - курсовр будет фиксирован. + сделай его невидимым. Функция "ShowCursor(0);"

Цитата(Reptor @  11.10.2008,  12:50 Найти цитируемый пост)
он у меня сейчас -10 до 10. Я этот старый с плохими картинками переделал (там был  [-0.5; 0.5]). А сейчас отыскал картинки ... Во тут ещё вопрос есть ли какието проги что б самому рисовать SkyBox. так как готовые не всегда подходят. 

Привыкай, что программирование графики тесно связано с моделирование/анимацией и прочим из области 3D моделирования. Тебе нужна какая-нибудь программа по работе с моделированием (Maya, 3d studio, blender (бесплтаный и мощный)) + урок по созданию таких skyBox'ов. Бери поисковик и шустри, не найдёшь - помогу.

Цитата(Reptor @  11.10.2008,  12:50 Найти цитируемый пост)
Достать из базы точки я их могу. Собственно теперь надо этот участок дороги добавить на сцену (нарисовать). Что б была дорога на земле.

Отлично. Тут всё просто. Нас не устраивает две вещи:
0) Координаты в системе XY. Получая координаты дороги, указывай значение Y для Z - будем рисовать в плоскости XZ.
1) Они слишком большие по значения. Кастрируем на 100. Все приходящие значения. Давай, пробуй, жду ответов/приветов smile

Автор: Reptor 12.10.2008, 11:19
Rickert, хмм не выходит сделать куб больше....

Оставил границы видимыми и они не отдалились (я понимаю что они должны стать дальше) + на углах появились дыры.

Цитата

Сразу дам совет: после сдвига камера, при движении мышью, позиционируй его в точку, от которой отталкиваешь в расчётках (как правило центр рабочего экрана окна) - курсовр будет фиксирова


я тут не совсем использую камеру. У меня просто вот:
Код

    glRotated(rot_x, 1.0, 0.0, 0.0);    
    glRotated(rot_y, 0.0, 1.0, 0.0);    


да и ещё 2 exe: 1-ый [-10; 10] а 2-ой [-70; 70]

Что делать с этим кубом?

Автор: Rickert 12.10.2008, 12:48
Всё правильно. По пунктам:
0) Границы видны, потому что тебе надо установить особые параметры для текстрирования. Читай здесь - http://www.gamedev.ru/faq/?id=91
1) У тебя вылазят зелёный грани потому что это плоскости отсечения. Их две: дальняя и ближняя. Их значения регулируются в функции "gluPerspective()" - последние два параметра. Помни, что буффер глубины 24 битный, следовательно значение не может быть больше 256^3.
2) glRotate - Это очень - очень плохо. Нет, конечно, для небольшого само-проектика покатит, но по идее надо всё переводить на вектора и вычислять значения по формулам. Опять-таким могу тебе дать экскурс в это.

Автор: Reptor 12.10.2008, 13:50
Rickert, 

Цитата

0) Границы видны, потому что тебе надо установить особые параметры для текстрирования. Читай здесь - http://www.gamedev.ru/faq/?id=91

Это зделал.

Цитата

1) У тебя вылазят зелёный грани потому что это плоскости отсечения. Их две: дальняя и ближняя. Их значения регулируются в функции 
"gluPerspective()" - последние два параметра. Помни, что буффер глубины 24 битный, следовательно значение не может быть больше 256^3.

Это зделал.

Цитата

2) glRotate - Это очень - очень плохо. Нет, конечно, для небольшого само-проектика покатит, но по идее надо всё переводить на вектора и вычислять


если честно то мне самому совсем не нравилось как это работает. Переделал сейчас вот так (буду ещё эксперементировать).
Код


gluLookAt(
      xtranslate,ytranslate,ztranslate,
      0,0,0,
      0,1,0);

............................

    if(keys['P']){
                        xtranslate+=0.5f;
                    }
                    if(keys['O']){
                        xtranslate-=0.5f;
                    }
                    if(keys['I']){
                        ytranslate+=0.5f;
                    }
                    if(keys['U']){
                        ytranslate-=0.5f;
                    }
                    if(keys['Y']){
                        ztranslate+=0.5f;
                    }
                    if(keys['T']){
                        ztranslate-=0.5f;
                    }


Да и зделал как вы говорили ShowCursor(0);

Цитата

0) Координаты в системе XY. Получая координаты дороги, указывай значение Y для Z - будем рисовать в плоскости XZ.
1) Они слишком большие по значения. Кастрируем на 100. Все приходящие значения.


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

Кастрируемый на 100
).

Код

glColor3f(1.0f,0.0f,0.0f);

        glBegin(GL_POLYGON);
            glVertex3d (4.0f,-0,5.0f);
            glVertex3d (2.0f,-0,5.0f);
            glVertex3d (2.0f,-0,3.0f);
            glVertex3d (4.0f,-0,3.0f);

            glVertex3d (4.0f,-0,1.0f);
            glVertex3d (6.0f,-0,1.0f);
            glVertex3d (6.0f,-0,3.0f);
            glVertex3d (6.5f,-0,4.0f);

            glVertex3d (5.0f,-0,5.5f);

        glEnd();


Там правда его сразу не видно но попробуйте понажимать кнопочки (перемещать камеру и он там есть)


Теперь как то дорогу надо вписать в общий вид. Сейчас она както оторвана от общей сцены.

Автор: Rickert 12.10.2008, 17:32
Цитата(Reptor @  12.10.2008,  13:50 Найти цитируемый пост)
Это зделал.

Сделал пишется через "с" smile
Цитата(Reptor @  12.10.2008,  13:50 Найти цитируемый пост)
Это зделал.

Сделал пишется через "С"  smile 
Код
glVertex3d (4.0f,-0,5.0f);

Почему по y = (-0) ?  smile 
Цитата(Reptor @  12.10.2008,  13:50 Найти цитируемый пост)
Теперь как то дорогу надо вписать в общий вид. Сейчас она както оторвана от общей сцены.

А почему вы её не из базы данных дёргаете. Давайте сразу уже смотреть чего там есть на выходе.
Перенестие кнопки движения либо на стрелки, либо на стандартные "WASD" - а то не ясно smile

Автор: Reptor 12.10.2008, 21:16
Цитата

Сделал пишется через "с"


 smile . Исправлюсь.

Цитата

Почему по y = (-0)


это я просто пробовал опустить дорогу и забыл убрать "-";

Цитата

А почему вы её не из базы данных дёргаете. Давайте сразу уже смотреть чего там есть на выходе.


просто я хотел что б вы посмотрели.. если б из БД брал то у вас бы ошибка была так как БД нет. 

ok тогда сделаю из БД и выложу скрины того что вышло.

Автор: Rickert 13.10.2008, 03:01
Reptor, логично, не подумал smile

Автор: Reptor 13.10.2008, 11:28
Rickert,  посмотрите я выложил скриншоты. Перекрёсток из БД. 

Ну теперь надо что то с ним делать.. что дальше? Теперь это всё надо привести к красивому и реалистичному виду. 

Автор: Rickert 13.10.2008, 14:36
Reptor
0) Давайте на "ты", мы уже и так близки  smile 
1) В следующий раз, когда буду отправлять картинки, сохраняйте их в JPG формате, а то у меня adsl'я мало пока что. У нас тут ещё безлимиток не организовали нормальных smile 
2) Что дальше? Сейчас нам нужна местность на которой будет лежать эта дорога. Местность больших размеров. Как будем делать? Есть два варианта: генерировать исходя из дороги автоматически и случайно, или сделать модель местности заранее подогнав под дорогу, или ещё вариант: сделать через карту высот. Выбирайте.

Автор: Reptor 13.10.2008, 15:16
Цитата

0) Давайте на "ты", мы уже и так близки 

Давайте....оо давай на "ты"

Цитата

1) В следующий раз, когда буду отправлять картинки, сохраняйте их в JPG формате, а то у меня adsl'я мало пока что. У нас тут ещё безлимиток не организовали нормальных

Хорошо.

Цитата

2) Что дальше? Сейчас нам нужна местность на которой будет лежать эта дорога. Местность больших размеров. Как будем делать? Есть два варианта: генерировать исходя из дороги автоматически и случайно, или сделать модель местности заранее подогнав под дорогу, или ещё вариант: сделать через карту высот. Выбирайте.


Вот тут я б хотел выслушать тот вариант который ты считаеш правильным или более простым для начала. Просто пока высот у меня нет - дорога ровная (но они потом буду это 100%). Мне кажется сначало надо сделать без карты высот и местность сделать наверно хмм... - подогнав заранее под дорогу... или нет наверно....да наверно под дорогу подогнав.

Автор: Rickert 14.10.2008, 03:46
Reptor, значит твоя задача состоит из двух этапов:
0) Ты берёшь любой редактор для 3D моделирования: Maya, 3D studio, blender.
1) Сохраняешь данные о дороге в тот же OBJ файл.
2) Импортируешь данные в редактор, через этот OBJ файл. Благо его все понимают.
3) Рисуешь местность, глядя на свою дорогу.
4) Эскпортируешь полученную модель в любой формат.
5) Грузишь эту модель в своём проекте.
Это если самому руками делать. Если ты возьмёшься делать через Maya, то я тебя могу провести по всем пунктам, от и до, включая само создание местсноти.

Автор: Reptor 14.10.2008, 15:27
Rickert, 

Цитата

если ты возьмёшься делать через Maya, то я тебя могу провести по всем пунктам, от и до, включая само создание местсноти.


хорошо давай так и поступим.

Только если честно я пока мало что понял как это всё будет происходить... Ведь дорога может быть разной...  Это мне надо будет что б в Maya всё автоматически это выполнялась.. или как?

Цитата

2) Импортируешь данные в редактор, через этот OBJ файл. Благо его все понимают.
3) Рисуешь местность, глядя на свою дорогу.
4)  Эскпортируешь полученную модель в любой формат.


как например эти пункты автоматизировать мне пока не ясно совсем... smile 


Хорошо с чего начинать....??

Да и ещё какой версии Maya мне нужна (я никогда с ней не работал). И где её можно скачать?






Автор: Rickert 14.10.2008, 16:59
А, так дорога у тебя разная будет? В таком случае тебе только автоматическая генерация местности нжна, иначе никак. Пока шутсри поиском по гуглу и gamedev.ru "генерация ландшафта"

Автор: Reptor 14.10.2008, 22:14
Цитата

А, так дорога у тебя разная будет? 


Да, разная.

Цитата

Пока шутсри поиском по гуглу и gamedev.ru "генерация ландшафта" 



Rickert,  я посмотрел про ландшафты в уроках Nehe  и идею понял. Только вот как мне это поможет? я пока не понимаю.
Это ж мне надо генерить этот raw-файл?

Одним словом я пока не понимаю как это связать с моими дорогами и skyBox.  smile 
 

Автор: Rickert 15.10.2008, 04:13
Reptor, пока научись просто открывать raw файл и формировать поверхность.
Мы будем генерировать ландшафт случайным образом, а затем подгонять его под дорогу.

Автор: Reptor 15.10.2008, 14:29
Rickert, я не могу понять как создавать raw файл. Есть в примере но там какаято абра кодабра. Как им пользоваться я понял а вот как свой сделать пока мне не ясно. Отыскал какойто редактор -  терагон вроде... но он тоже мне не подходит... хотя редактор меня и не интересует... мне ж надо автоматом генерить файл..

Цитата

Reptor, пока научись просто открывать raw файл и формировать поверхность.


Это я понял как делать.. что дальше делать?

я так понимаю сейчас как раз таки и надо мне создать этот raw-файл... Исходя из того какая у меня дорога? 

Автор: Rickert 16.10.2008, 09:32
Хорошо, ладно. Забудь про raw файл.
Сделай следующее: напиши функцию, которая будет принимать четыре значения:
0, 1) Длинна и ширина поверхности.
2, 3) Длинна и ширина каждой клеточки.
Каждая клеточка - это полигон -  два треугольника (6 вершин).
Функция должна создавать плоскую поверхность.
Справишься?

Автор: Reptor 16.10.2008, 10:17
Rickert, ну постараюсь... 

Автор: Reptor 16.10.2008, 11:02
Rickert,  вот функция 

Код

void landscape(GLfloat length, GLfloat width, GLfloat step_length, GLfloat step_width){
    
    float X = 0;
    float Y = 0;
    float x, y;

    X = length/2;
    Y = width/2;

    glBegin(GL_TRIANGLES);

    glColor3f(1.0f, 0.0f, 0.0f);
    for(x=-X; x<=X; x+=step_length){
        for(y=-Y; y<=Y; y+=step_width){
            glVertex3f(x, 0, y); 
            glVertex3f(x, 0, y+step_length); 
            glVertex3f(x+step_length, 0, y+step_length); 


            glVertex3f(x+step_length, 0, y+step_length);
            glVertex3f(x+step_length, 0, y); 
            glVertex3f(x, 0, y);

        }
    }

    glEnd();

}

.....................

landscape(64.0f, 64.0f, 8.0f, 8.0f);





и в атаче результат работы.


Автор: Rickert 16.10.2008, 16:03
Reptor, не-не-не!
Ты должен создать массив вершин, который будешь модифицировать и отображать. А сейчас ты просто в цикле вывел координаты.

Автор: Reptor 16.10.2008, 18:25
Rickert, ага во как надо. Хорошо переделаю. 

Автор: Reptor 17.10.2008, 10:54
Rickert, вот я переделал.

Код

int** landscape_mas;

..........................................

void createLandscape(int length, int width){
    int i,j;

    landscape_mas = new int *[length];
    for(i=0; i<length; i++){
        landscape_mas[i] = new int[width];
    }

    for(i=0; i<length; i++){
        for(j=0; j<width; j++){
            landscape_mas[i][j] = 0;
        }
    }
}

void drawLandscape(int length, int width, int step_length, int step_width){
    
    int X = 0;
    int Y = 0;
    int x, y;

//    X = length/2;
//    Y = width/2;

    /*glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);
    for(x=-X; x<=X; x+=step_length){
        for(y=-Y; y<=Y; y+=step_width){
            glVertex3f(x, 0, y); 
            glVertex3f(x, 0, y+step_width); 
            glVertex3f(x+step_length, 0, y+step_width); 

            glVertex3f(x+step_length, 0, y+step_width);
            glVertex3f(x+step_length, 0, y); 
            glVertex3f(x, 0, y);
        }
    }
    glEnd();*/

    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);

    for(x=0; x<length-step_length; x+=step_length){
        for(y=0; y<width-step_width; y+=step_width){            

            glVertex3i(x, landscape_mas[x][y], y); 
            glVertex3i(x, landscape_mas[x][y+step_width], y+step_width); 
            glVertex3i(x+step_length, landscape_mas[x+step_length][y+step_width], y+step_width); 

            glVertex3i(x+step_length, landscape_mas[x+step_length][y+step_width], y+step_width);
            glVertex3i(x+step_length, landscape_mas[x+step_length][y], y); 
            glVertex3i(x, landscape_mas[x][y], y);
        }
    }
    glEnd();
}

.........................................


createLandscape(64,64);
drawLandscape(64, 64, 8, 8);

....................................................



картинка в атаче 

Автор: Rickert 17.10.2008, 11:50
Reptor, уже лучше. Немного поправь код: что тебе мешает в первой функции, сразу же расчитать позиции вершин и потом их только выводить в "drawLandscape()" ?
Теперь ещё усложним. Добавь третью координату. И пусть значение по Y будет случайным.
Смотри описание функций "srand()" и "rand()" Пусть интервал значений будет  от (-1.0) до (1.0)

Автор: Reptor 17.10.2008, 12:39
Rickert, вот смотри сделал случайные высоты.

Код

#define random_init() srand((unsigned int)time(NULL))
#define random_gen(min, max) ((rand()%(max-min+1))+min)

..........................................

float** landscape_mas;

...........................................................

void createLandscape(int length, int width){
    int i,j;
    float x;

    random_init();    

    landscape_mas = new float *[length];
    for(i=0; i<length; i++){
        landscape_mas[i] = new float[width];
    }

    for(i=0; i<length; i++){
        for(j=0; j<width; j++){
            x =  (float)(random_gen((-10), 10))/10;
            landscape_mas[i][j] = x;
        }
    }
}

void drawLandscape(int length, int width, int step_length, int step_width){
    
    int X = 0;
    int Y = 0;
    int x, y;

//    X = length/2;
//    Y = width/2;

    /*glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);
    for(x=-X; x<=X; x+=step_length){
        for(y=-Y; y<=Y; y+=step_width){
            glVertex3f(x, 0, y); 
            glVertex3f(x, 0, y+step_width); 
            glVertex3f(x+step_length, 0, y+step_width); 

            glVertex3f(x+step_length, 0, y+step_width);
            glVertex3f(x+step_length, 0, y); 
            glVertex3f(x, 0, y);
        }
    }
    glEnd();*/


    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);

    for(x=0; x<length-step_length; x+=step_length){
        for(y=0; y<width-step_width; y+=step_width){

            glVertex3f(x, landscape_mas[x][y], y); 
            glVertex3f(x, landscape_mas[x][y+step_width], y+step_width); 
            glVertex3f(x+step_length, landscape_mas[x+step_length][y+step_width], y+step_width); 

            glVertex3f(x+step_length, landscape_mas[x+step_length][y+step_width], y+step_width);
            glVertex3f(x+step_length, landscape_mas[x+step_length][y], y); 
            glVertex3f(x, landscape_mas[x][y], y);
        }
    }

    glEnd();
}


Картинка в атаче.



Rickert, 

 
Цитата

Немного поправь код: что тебе мешает в первой функции, сразу же расчитать позиции вершин и потом их только выводить в "drawLandscape()" ?


Вот тут я не совсем понял..... тоесть надо делать масив например не 64x64 (к примеру) а как то исходя из шага?

Добавлено через 4 минуты и 50 секунд
или наоборот просто в масив писать вотету информацию 

Код

landscape_mas[x+step_length][y+step_width]


а там просто брать и все подряд выводить?

Автор: Rickert 17.10.2008, 18:50
Цитата(Reptor @  17.10.2008,  12:39 Найти цитируемый пост)
Вот тут я не совсем понял..... тоесть надо делать масив например не 64x64 (к примеру) а как то исходя из шага?

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

Теперь значит смотри: в raw файле смысл такой же - это картинка, а значение цвета этой картинки - значение высоты точки. Сообразил?

Итак, у нас сейчас должен получится случайно сгенерированный ландшафт. Он у нас топорный как ты можешь заметить. Надо бы его, наверное сгладить?
Есть такая вещь "кривые безье". Кури общую информацию тут - http://ru.wikipedia.org/wiki/Кривые_Безье
Потом иди на тот же gamedev.ru и смотри как их применяют. Также в поисковиках пошустри.

И найди какую - нибудь текстурку, да наложи на сгенерированную повехность. Для этого, естественно, тебе понадобиться расчитать uv координаты. Но так как у нас простая плоскость, по сути, то проблем думаю не будет.

Автор: Reptor 17.10.2008, 21:43
Цитата

Ну у тебя там хоть проясняется всё по-немногу: по полкам раскладывается?


Да немного проясняется, но всеровно как выйти на конечный результат пока не до конца ясно (как это всё потом в купу собрать), а так до  этого времени всё ясно.

Цитата

теперь значит смотри: в raw файле смысл такой же - это картинка, а значение цвета этой картинки - значение высоты точки. Сообразил?


да это я понял. 


Хорошо попробую разобраться с "кривые безье".. вот что б сгладить ландшафт и потом текстура.

Автор: Rickert 18.10.2008, 05:28
Цитата(Reptor @  17.10.2008,  21:43 Найти цитируемый пост)
Да немного проясняется, но всеровно как выйти на конечный результат пока не до конца ясно (как это всё потом в купу собрать), а так до  этого времени всё ясно.

А мы разве не выходим на него по-тихоньку?
Сделали окружающую среду, сейчас добавим местноть и дорогу. Что там ещё надо будет?

Автор: Reptor 18.10.2008, 10:23
Цитата

А мы разве не выходим на него по-тихоньку?



Rickert, конечно выходим.

Цитата

Сделали окружающую среду, сейчас добавим местноть и дорогу. Что там ещё надо будет? 


Хотелось бы ещё потом какойто светофор добавить и домик(дерево)   smile 



Вернёмся к кривые безье.... я почитал и разобрался с ними... вот.. и попробовал их применить но не вышло (результат в атаче).

Вот код. 

Код


typedef struct tagBEZIEPOINT{
    float x;
    float y;
    float z;
} BEZIEPOINT;


..................................................


BEZIEPOINT calc(float t, BEZIEPOINT p1, BEZIEPOINT p2, BEZIEPOINT p3){
    BEZIEPOINT p;
    
    float kof1 = pow((1-t),2);
    float kof2 = 2*t*(1-t)*t;
    float kof3 = pow(t,2);

    p.x = kof1*p1.x + kof2*p2.x + kof3*p3.x;
    p.y = kof1*p1.y + kof2*p2.y + kof3*p3.y;
    p.z = kof1*p1.z + kof2*p2.z + kof3*p3.z;
    

    return p;

}

.......................

void drawLandscape(int length, int width, int step_length, int step_width){
    
    int X = 0;
    int Y = 0;
    int x, y;
    


//    X = length/2;
//    Y = width/2;

    /*glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);
    for(x=-X; x<=X; x+=step_length){
        for(y=-Y; y<=Y; y+=step_width){
            glVertex3f(x, 0, y); 
            glVertex3f(x, 0, y+step_width); 
            glVertex3f(x+step_length, 0, y+step_width); 

            glVertex3f(x+step_length, 0, y+step_width);
            glVertex3f(x+step_length, 0, y); 
            glVertex3f(x, 0, y);
        }
    }
    glEnd();*/



//glBegin(GL_TRIANGLES);
//    glBegin(GL_LINES);
//    glColor3f(1.0f, 0.0f, 0.0f);

/*    for(x=0; x<length-step_length; x+=step_length){
        for(y=0; y<width-step_width; y+=step_width){

                glColor3f(1.0f, 0.0f, 0.0f);

            glVertex3f(x, landscape_mas[x][y], y); 
            glVertex3f(x, landscape_mas[x][y+step_width], y+step_width); 
            glVertex3f(x+step_length, landscape_mas[x+step_length][y+step_width], y+step_width); 

            glVertex3f(x+step_length, landscape_mas[x+step_length][y+step_width], y+step_width);
            glVertex3f(x+step_length, landscape_mas[x+step_length][y], y); 
            glVertex3f(x, landscape_mas[x][y], y);


            glColor3f(0.0f, 1.0f, 0.0f);
            glVertex3f(x, landscape_mas[x][y], y); 
            glVertex3f(x+step_length, landscape_mas[x+step_length][y+step_width], y+step_width); 
        }
    }

    glEnd();*/


    for(x=0; x<length-step_length*2; x+=step_length*2){
        for(y=0; y<width-step_width*2; y+=step_width*2){

            float t;
            glColor3f(1.0f, 0.0f, 0.0f);
            
            BEZIEPOINT p1;
            p1.x = float(x);
            p1.y = landscape_mas[x][y];
            p1.z = float(y);

            BEZIEPOINT p2;
            p2.x = float(x);
            p2.y = landscape_mas[x][y+step_width];
            p2.z = float(y+step_width);

            BEZIEPOINT p3;
            p3.x = float(x);
            p3.y = landscape_mas[x][y+step_width*2];
            p3.z = float(y+step_width*2);

            glBegin(GL_LINE_STRIP);
            for(t=0.0f; t<=1.0f; t+=0.1f){
                BEZIEPOINT res = calc(t,p1,p2,p3);
                glVertex3f(res.x, res.y, res.z);
            }
            glEnd();


            BEZIEPOINT p4;
            BEZIEPOINT p5;
            BEZIEPOINT p6;

            p4.x = float(x);
            p4.y = landscape_mas[x][y];
            p4.z = float(y);

            
            p5.x = float(x+step_length);
            p5.y = landscape_mas[x+step_length][y];
            p5.z = float(y);

        
            p6.x = float(x+step_length*2);
            p6.y = landscape_mas[x+step_length*2][y];
            p6.z = float(y);

            glBegin(GL_LINE_STRIP);
            for(t=0.0f; t<=1.0f; t+=0.1f){
                BEZIEPOINT res = calc(t,p4,p5,p6);
                glVertex3f(res.x, res.y, res.z);
            }
            glEnd();

        
        }
    }

}





я раньше делал треугольники а сейчас при помощи кривых безье сгладить переломы там де переход с одного прямоугольника (2 треугольника) на 2-ой. Но получились какието петли.... одним словом не получилось так как думал что получится..((((




Автор: Rickert 18.10.2008, 18:00
Reptor
Значит так: делаешь пустой проект, в котором идёт только инициализация OpenGL и отображение. И реализовываешь в нём простой вариант кривой безье. Если хочешь, я могу прислать тебе уже готовый код с ныне платного gametutorials.com - покопаешься: там всё так писалось, чтобы исходник служил неким уроком в определённой области.
Кинуть или сам повозишься?

Автор: Reptor 18.10.2008, 20:44
Цитата

Кинуть или сам повозишься? 


Да скинь пожалуйста если можно. 

И сейчас ещё зделаю сам простой вариант кривой безье.

Автор: Reptor 18.10.2008, 21:29
Rickert, я сделал пустой проект в котором реализовал простой вариант кривой безье.

Вот код  и атач.

Код

struct BEZIE{
    float x;
    float y;
    float z;
};

................

BEZIE calc(float t, BEZIE p1, BEZIE p2, BEZIE p3){
    BEZIE p;
    
    float kof1 = pow((1-t),2);
    float kof2 = 2*t*(1-t)*t;
    float kof3 = pow(t,2);

    p.x = kof1*p1.x + kof2*p2.x + kof3*p3.x;
    p.y = kof1*p1.y + kof2*p2.y + kof3*p3.y;
    p.z = kof1*p1.z + kof2*p2.z + kof3*p3.z;
    

    return p;

}

int DrawGLScene(GLvoid)                                    
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     
    glLoadIdentity();                        
    glTranslatef(0.0f,0.0f,-12.0f);

    glBegin(GL_LINE_STRIP);

    BEZIE p0;
    p0.x = -3.0f;
    p0.y = -5.0f;
    p0.z = -1.0f;


    BEZIE p1;
    p1.x = 0.0f;
    p1.y = 3.0f;
    p1.z = -1.0f;

    BEZIE p2;
    p2.x = 3.0f;
    p2.y = -4.0f;
    p2.z = -1.0f;

    for(float t=0.0; t<=1.0f; t+=0.05f){        
        BEZIE res = calc(t,p0,p1,p2);
        glVertex3f(res.x, res.y, res.z);            
    }


    glEnd();



    return TRUE;                                        // Everything Went OK
}

Автор: Rickert 19.10.2008, 05:58
Reptor, ну так правильно работает или нет?
В понедельник с рабочей машины сдёрну безье и вышлю.

Автор: Reptor 19.10.2008, 09:29
Цитата

Reptor, ну так правильно работает или нет?



Rickert, ну да, правильно работает.

Что ж у меня там напутано.... smile   буду смотреть..   

Автор: Reptor 19.10.2008, 11:37
Rickert, в атаче то что получилоь... (правда с кривыми безье не до конца понял что получилось но пока пусть так будет).... Сделал текстуру... ну вроде не плохо..

Что дальше? Теперь надо как то дорогу положить на этот ландшафт?.. она сейчас телипается немного ниже и с самого краю + оня ещё какаято очень маленькая..


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

Автор: Rickert 19.10.2008, 14:10
Цитата(Reptor @  19.10.2008,  09:29 Найти цитируемый пост)
Rickert, ну да, правильно работает.

Пойми, я не стану за тебя писать код smile
Это самое важное качество программиста - найти неисправность и починить, тренируйся - это не лёгкий путь smile

Цитата(Reptor @  19.10.2008,  11:37 Найти цитируемый пост)
Rickert, знаеш что я не могу до конца себе представить... -  как всё это будет в конце... просто сейчас есть SkyBox, дорога, ландшафт и эти 3 компонента как то оторваны друг от друга...

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

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

Автор: Reptor 19.10.2008, 14:37
Цитата

А какая целостность требуется? Нет, ну конечно ты можешь создать классы, разбить всё это дело по функциям, оптимизировать....


Нет Rickert,   ты меня не понял наверно..   smile  я говорю о картинке... что на взгляд как  то ландшафт и SkyBox отдельно друг от друга.. ландшафт как ковёр-самолт летает  в воздухе.

Автор: Rickert 19.10.2008, 15:09
Reptor, А ну так естественно smile
Давай, подумай, как от этого избавиться?
0) Во-первых сделать ограничение на движениее камеры как-то. Может сделать имитацию человеческого движения по поверхности: прыжок, вперёд, назад и всё такое.
1) Можно генерировать большой ландшафт и отображать его по кускам: те, которые видны.
2) Можно добавить туман, чтобы не было видно конца горизонта и опять-таки генерировать большой ландшафт.
Это всё то, что пришло первое на ум.
Поразмышляй smile

Автор: Reptor 19.10.2008, 16:41
Rickert, а как мне добавить лёгкий туман на углах skyBox... так что б было всё видно но с легкой серостью...У меня сильно затуманено выходит... картинка в атаче.

я уже использую glFogf(GL_FOG_DENSITY, 0.01f); 

Автор: Rickert 19.10.2008, 17:15
http://www.progz.ru/articles.php?issue=5
Глава 6, пункт 6.3 и дальше. Изучай...

Автор: Reptor 19.10.2008, 19:51
Rickert, а как нанести текстуру на мою дорогу... она рисуется как glBegin(GL_POLYGON);??

1-ое что мне приходит на ум так это отказаться от POLYGON

Автор: Rickert 20.10.2008, 03:56
Цитата(Reptor @  19.10.2008,  19:51 Найти цитируемый пост)
Rickert, а как нанести текстуру на мою дорогу... она рисуется как glBegin(GL_POLYGON);??

Что значит "как"? А как ты её наложил на ландшафт?

Автор: Reptor 20.10.2008, 11:04
Цитата

Что значит "как"? А как ты её наложил на ландшафт? 


ну брал и кусочками вырезал пошагово... но там проще там же треугольниками... а тут много вершин..


Rickert,  и ещё я не совсем понял что такое z в формуле с туманом... я тут сам пытаюсь считать....ну и не совсеп понял что за z?

Автор: Rickert 20.10.2008, 11:18
Reptor, z - обычно под ней подразумевают либо отдалённость от смотрящего, либо глубину.
Цитата(Reptor @  20.10.2008,  11:04 Найти цитируемый пост)
ну брал и кусочками вырезал пошагово... но там проще там же треугольниками... а тут много вершин..

Всмысле "вырезал"?
У тебя должно было бы быть так: ландшафт из треугольников. Если смотреть на него в плоскости XZ, то самая нижняя левая вершина будет иметь UV координаты(0.0, 0.0), а самая верхняя правая (1.0, 1.0), а те, что между ними - промежуточные значения, исходя из их положения относительно крайних.
Теперь дорога. Оказывается она у нас с проблемой... Нет UV координат у плоского выпуклого тела. Если у нас дорога будет использовать текстуру например "асфальт", без разметок - то проблем не будет, а вот если нужны разделительные полосы, то тут мы ничего поделать не сможем - нам нужно заранее знать направления.
Вопрос такой: тебе данные о вершинах дороги поступают кучей, не какими - то опред. партиями, которые бы характеризовали: допустим некие дороги?

Автор: Reptor 20.10.2008, 11:29
Цитата

У тебя должно было бы быть так: ландшафт из треугольников. Если смотреть на него в плоскости XZ, то самая нижняя левая вершина будет иметь UV координаты(0.0, 0.0), а самая верхняя правая (1.0, 1.0), а те, что между ними - промежуточные значения, исходя из их положения относительно крайних.


Rickert,  Ну да так и сделал.

Цитата

Теперь дорога. Оказывается она у нас с проблемой... Нет UV координат у плоского выпуклого тела. Если у нас дорога будет использовать текстуру например "асфальт", без разметок - то проблем не будет, а вот если нужны разделительные полосы, то тут мы ничего поделать не сможем - нам нужно заранее знать направления.
Вопрос такой: тебе данные о вершинах дороги поступают кучей, не какими - то опред. партиями, которые бы характеризовали: допустим некие дороги?


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


Автор: Rickert 20.10.2008, 11:35
Давай пока забудем про полосы и решим проблему с генерацией uv карты. Сделай текстуру размером 256х256: чёрная стрелка на белом фоне и загрузи её в проект - это будет наша текстура для дороги на время дебага.
Теперь расскажи мне про
Цитата
последовательность ту по которой необходимо их соеденить

Автор: Reptor 20.10.2008, 13:40
Rickert,  идёт в базе просто последовательность точек... табличка такого вида

id | x       |   y
1  | 600   |  300
2 |  300   | 300
3 |  300   | 350

вот... и вот так их надо сондинять: 1->2->3  (попорядку).

Цитата

Сделай текстуру размером 256х256: чёрная стрелка на белом фоне 


вот тут я не совсем понял: будет белая область 256х256 и по середине будет просто чорная полоска?



Автор: Rickert 20.10.2008, 13:45
Reptor, не - не: белый квадрат размером 256х256, а по середине чёрная стрелку любым размером, но чтоб, есесно, влазила в квадрат.

Автор: Reptor 20.10.2008, 14:01
Rickert, сделал.

Автор: Reptor 20.10.2008, 14:57
Rickert, и ещё как можно избежать... сделать так что б не было видно границ моего ландшафта..а именно я ж рисую ландшафт треугольниками и из-за этого весь ландшафт в линиях... На картинке всё видно...я там для примера чорным цветом их обрисовал..Очень в глаза кидаются эти границы треугольников.

Автор: Rickert 20.10.2008, 15:56
Reptor, где там ландшафт? Там какая-то сливающаяся текстура?

Автор: Reptor 20.10.2008, 15:58
Rickert, ну да...а как сделать что б такого не было? я взял обычно зделал и наложил текстуры c координатами u,v на треугольники

Автор: Rickert 21.10.2008, 03:33
Reptor, так ты текстуру-то возьмите какую-нибудь другую, отличную от Skybox'а

Автор: Reptor 21.10.2008, 14:45
Rickert, ну если я возьму текстуру отличную от скайбокса тогда вид не очень красивый будет.... в дали один цвет гор а то что на земле 2-ой цвет... как то не очень выходит  smile 

и всеровно даже на 2-ой тектуре видны эти места склейки триугольников.

Автор: Rickert 22.10.2008, 07:57
Reptor, ты зря занялся сейчас вылизыванием картинки - это последнее дело. Оставь пока эти грани. Сейчас нам надо сгенерить uv карту для дороги. Так, точки короче идут одна за другой, создавая контур. Что ж - это легче уже.
Ты можешь показать мне дорогу вид сверху, с включёным отображением вершин и линий. Вершины - зелёные, линии - синие.
А лучше скомпиленную прогу кинь: надо узнать расположение вершин относительно друг друга.

Автор: Reptor 22.10.2008, 14:37
Rickert, я тебе скрин скинул...так как скомпиленая у тебя работать не будет.. база нужна...и отметил на ней точки.

Вот эти точки мне даны... причём дороги могуть быть разные... но все описываются так же просто каждая сторона 4 точками и эти точки соединяются.

Автор: Rickert 22.10.2008, 16:45
Reptor, т.е. правая полоса на скрине, и нижняя полоса на скрине состоят из 4 вершин? а та хрень что их соединяет - многоугольник: из скольки? smile 

Автор: Reptor 22.10.2008, 19:13
Rickert, 
Цитата

Reptor, т.е. правая полоса на скрине, и нижняя полоса на скрине состоят из 4 вершин? а та хрень что их соединяет - многоугольник: из скольки? 


а там это просто 2 точки... это не отдельный многоугольник а просто последние 2 какието контрольные точки что б соеденить обе части.. если будет 3 полосы то будет  так как на картинке в атаче...

Автор: Rickert 23.10.2008, 06:52
Reptor
Я предлогаю так: у нас есть четыре точки для полосы. Значит мы можем измерить размеры полосы. Теперь предположим, что наша текстура 256х256 будет расчитана на 1 ед. Т.е., если взять размеры полосы такими (5.0, 1.0), то получается что наша текстура должна быть наложена по длинне (U координата) - 5 раз, а по V - 1 раз. Следовательно, у левой (левая - меньшая по значению по длинне) точки будет координата U = 0.0, а у правой - U = 5.0. Таким образом текстура наложится 5 раз по длинне. А по V - 1.
Сообразил?

Автор: Reptor 23.10.2008, 16:02
Rickert, ну не совсем...это мне надо всё время длину и высоту прямоугольника вычеслять.. а потом в цикле налаживать текстуру...а как потом отдельно текстуру налаживать.. не что то я запутался.

Автор: Rickert 23.10.2008, 17:32
Reptor, в чём проблема? У тебя данные о дороги поступают постоянно в процессе выполнения программы?

Автор: Reptor 23.10.2008, 18:12
Rickert, 
Цитата

в чём проблема? У тебя данные о дороги поступают постоянно в процессе выполнения программы? 


да.. так и есть..

я беру первую точку и мне надо приписать ей координату с текстуры u,v. Нет что то я не понимаю... Есть тукстура это та стрелочка на белом фоне?... так а там же есть белые области.. не что то я всеровно не понимаю..

Автор: Rickert 24.10.2008, 01:39
Reptor
Вот какими должны быть действия:
0) Приходит 4 точки - полоса дороги.
1) Мерим длинну и высоту.
2) Считаем UV координаты.
3) Присваиваем их полосе.

Тебе надо составить нормальный класс дороги, где были бы данные о полосах и их внутренние параметры (координаты вершин, UV карта, длинна, высота, ссылка на текстуру).
Нам пока без разницы какую текстуру накладывать и мы будем брать ту, что со стрелкой. Я тебя просил её сделать чтобы было проще ориентироваться с направлением, если бы потребовалось добавлять разделительные полосы.

Автор: Reptor 24.10.2008, 11:43
Rickert, да я понял... теперь..сначала надо подготовить всю информацию а потом уже с ней что то делать...буду делать класс

Автор: Reptor 25.10.2008, 17:22
Rickert, сделал классы.. что то даже и получилось... вот теперь мне б пока хотелось порядок навести... так как преподу показывать надо уже....и хотелось что б вид какойто имело то что дорогу окружает.

Автор: Rickert 25.10.2008, 17:54
Reptor, предлогаешь вылезать картинку или просто хочешь порядок в коде и голове навести?

Автор: Reptor 26.10.2008, 10:29
Цитата

Reptor, предлогаешь вылезать картинку или просто хочешь порядок в коде и голове навести?



Rickert, предлагаю вылезать картинку  smile ... ну и заодно порядок а голове..а в коде уже попоже - после первой демонстрации так как уже не успею всё поменять. Думаю если будет порядок в голове то код это уже дело техники  smile 

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




Автор: Reptor 1.11.2008, 19:55
Rickert, привет  smile  есть вопрос... а могу ли я используя glBegin(GL_LINE_STRIP);  залить цветом полученную фигуру?

Автор: Rickert 1.11.2008, 20:49
Reptor, Нет, тебе надо сначала вывести фигуру через GL_POLYGON, GL_TRIANGLES, а затем вывести фигуру через GL_LINE_STRIP - тогда ты отобразишь и "заливку" и конутр полигонов. Ты ведь именно этого добиваешься?

Автор: Reptor 2.11.2008, 11:57
Rickert, та дело в том что через GL_POLYGON у меня дорога выходит как то не совсем так...в атаче картинки..

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

Вот код. 
Код


//    glBegin(GL_LINE_STRIP);
    glBegin(GL_POLYGON);

    float tx = 0.0f;
    float ty = 0.0f;

    
    for(int i=0; i<crossroad1.numpoints; i++){

            glVertex3f(crossroad1.point[i].x, crossroad1.point[i].y, crossroad1.point[i].z);        
        

    }
    glEnd();




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

Автор: mes 2.11.2008, 12:11
Цитата(Reptor @  2.11.2008,  11:57 Найти цитируемый пост)
Да и ещё так и не решил проблему с ландшафтом...как сделать что б не было видно границ.. выходит что он как то из кубиков состоит.

Сделать подходящую текстуру, такую которая стыкуется без шва.  smile 
поиши в гугле как, вот пример : http://chain2k.blogspot.com/

Автор: Reptor 3.11.2008, 17:52
Так а почему через полигон так страно рисуется? что можно сделать что б дорога рисовалась нормально? так как линиями всё точно но без заливки а полигоном криво но зато заливка есть.

Автор: Rickert 3.11.2008, 19:26
Странно. Попробуй включить вместо GL_LINES_STRIP - GL_LINES.
По всей видимости порядок перечисления вершин нарушен, при выводе через полигон.

Автор: Reptor 3.11.2008, 23:48
Rickert, в атаче картинка с линиями. 

Автор: Rickert 4.11.2008, 08:59
Reptor, всё верно. Тогда остаётся одно: выводить по 2 - 3 вершины от всего кол-ва полгонов: сначала 1 - 3, потом с 3 - 6 и т.д. Смотреть результат, как они соединяются.

Автор: Gongex 15.2.2009, 00:50
я сделал трехмерную квартиру ,аналогию той в которой живу.На опенгл.И знаю как эта твоя местность должна рисоваться.
Вот екзешник хаты:http://unlater.narod.ru/OpenGl.html
могу кинуть код.Такая квартира писалась 10 часов непрерывно,я представляю сколько ты будешь делать квартал.

Добавлено через 4 минуты и 45 секунд
вы лажу пишете что координаты вашего 3Дмира надо вычислять при перемещении.Для этого просто рисуете мир через glTranslatef и потом меняете позицию gluLookAt,и надо прописать перемещение камеры от мышки и от клавы.Все это у меня есть-пример,в коде моей проги 3D_Flat

Автор: Rickert 15.2.2009, 07:35
Gongex, я описал способы, которые используются при разработке игр. Пусть автор сам оценит какой вариант лучше: вращать мир вокруг себя, или действительно перемещаться в нём.

Автор: Gongex 15.2.2009, 14:09
Rickert, 
Думаю лучше перемещаться в мире,я подозреваю что Экшены именно так пишутся.

Автор: sawtooth 19.2.2009, 23:55
Gongex

Реализация непосредственно от предпочтений разработчика. Каждый сам решает, как ему удобнее. Стандартов не существует (и не будет, ибо это процесс созидательно-творческий)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)