Модераторы: Rickert, Alexeis, BorisVorontsov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сцена и объекты на ней 
:(
    Опции темы
Reptor
Дата 14.10.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Цитата

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


Да, разная.

Цитата

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



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

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

Это сообщение отредактировал(а) Reptor - 14.10.2008, 22:42
PM MAIL ICQ   Вверх
Rickert
Дата 15.10.2008, 04:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Reptor
Дата 15.10.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



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

Цитата

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


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

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

PM MAIL ICQ   Вверх
Rickert
Дата 16.10.2008, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Reptor
Дата 16.10.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Rickert, ну постараюсь... 

PM MAIL ICQ   Вверх
Reptor
Дата 16.10.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



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);





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



Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  untitled.rar 28,88 Kb
PM MAIL ICQ   Вверх
Rickert
Дата 16.10.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



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


Это сообщение отредактировал(а) Rickert - 16.10.2008, 16:03


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Reptor
Дата 16.10.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Rickert, ага во как надо. Хорошо переделаю. 
PM MAIL ICQ   Вверх
Reptor
Дата 17.10.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



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);

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



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


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  untitled.rar 34,31 Kb
PM MAIL ICQ   Вверх
Rickert
Дата 17.10.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Reptor
Дата 17.10.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



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]


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

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  untitled.rar 37,09 Kb
PM MAIL ICQ   Вверх
Rickert
Дата 17.10.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



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

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

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

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

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

Это сообщение отредактировал(а) Rickert - 17.10.2008, 18:53


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Reptor
Дата 17.10.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Цитата

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


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

Цитата

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


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


Хорошо попробую разобраться с "кривые безье".. вот что б сгладить ландшафт и потом текстура.
PM MAIL ICQ   Вверх
Rickert
Дата 18.10.2008, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



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

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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Reptor
Дата 18.10.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Цитата

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



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-ой. Но получились какието петли.... одним словом не получилось так как думал что получится..((((





Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  __________.rar 47,44 Kb
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.