Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Генерация ландшафта


ОлегЪ ©   (2004-11-04 21:38:00) 

Здравствуйте, мастера!
У меня никак не получается решить такую задачу. Допустим, имеется bmp-файл произвольных размеров. И нужно сгенерировать ландшафт и наложить текстуру на него. Это надо реализовать средствами OpenGL API. Я перекопал много ресурсов, в Сети, но так и нашёл то, что мне нужно. Много примеров на Си, а я как не старался конвертировать это в Delphi, но так ничего и не получилось :( Пробовал составлять свой алгоритм - у меня полусалось всё что угодно, но только не то, что я хотел :( Подскажите пожалуйста как это реализовать. Хотелось бы посмотреть на рабочий код (теоретический материалов я пересмотрел очень много, а вот как это делается на практике - таких материалов не было найдено).
Вы - моя последняя надежда!
Заранее благодарю. С уважением, Николаев Олег.


ОлегЪ   (2004-11-06 17:12:00) [1]


> Shulkin

Ещё раз спасибо! Дело в том, что я пишу свой графический движок - а какой это движок без генерации ландшафтов... Спасибо!


П7   (2004-11-06 14:58:00) [2]

Какая разница, компилируется или нет... Кодто есть, посмотри, как умные дядьки делают и не изобретай велосипед...


Shulkin   (2004-11-06 11:47:00) [3]

Извини, парень, я ступил не по детски, лучше делать так :

{------------------------------}

Procedure SetHeightAndColor ( x , y : integer ) ;
begin
R:=(BmpMap[x, y, 0])/255;
G:=(BmpMap[x, y, 1])/255;
B:=(BmpMap[x, y, 2])/255;
glColor3f(R, G, B);
Height := (R+G+B) / 3 ;
end ;

for i:=0 to Length-1 do {-Длина ландшафта-}
for j:=0 to Width-1 do {-Ширина ландшафта-}
begin
    glBegin ( GL_TRIANGLES) ;
      SetHeightAndColor ( i,j ) ;
      glVertex3f ( i   , j   , Height ) ;
      SetHeightAndColor ( i+1,j ) ;
      glVertex3f ( i+1 , j   , Height ) ;
      SetHeightAndColor ( i,j+1 ) ;
      glVertex3f ( i   , j+1 , Height ) ;

      SetHeightAndColor ( i+1,j+1 ) ;
      glVertex3f ( i+1 , j+1 , Height ) ;
      SetHeightAndColor ( i+1,j ) ;
      glVertex3f ( i+1 , j   , Height ) ;
      SetHeightAndColor ( i,j+1 ) ;
      glVertex3f ( i   , j+1 , Height ) ;
    glEnd ;
end;
{------------------------------}

Да и вообще, заведи матрицу, где ячейка - (Color,Height,Normal
(вектор) и т.д), заполняй эту матрицу при загрузке, а потом
отрисовывай. Ландшафт без Smooth-нормалей - не ландшафт, а
если ты будешь эти нормали на каждом кадре расчитывать заново,
то FPS у тебя упадет ниже плинтуса.


ОлегЪ   (2004-11-05 16:06:00) [4]


> Shulkin

Огромное Вам спасибо!


Shulkin   (2004-11-05 13:43:00) [5]

Ну типа так :
{------------------------------}
for i:=0 to Length-1 do {-Длина ландшафта-}
for j:=0 to Width-1 do {-Ширина ландшафта-}
 begin
     R:=(BmpMap[i, j, 0])/255;
     G:=(BmpMap[i, j, 1])/255; {-Здесь у тебя было 2, нужно 1-}
     B:=(BmpMap[i, j, 2])/255;
     glColor3f(R, G, B);
     Height := (R+G+B) / 3 ; {-Высота каждой вершин-}
     glBegin ( GL_TRIANGLES) ;
       glVertex3f ( i   , j   , Height ) ;
       glVertex3f ( i+1 , j   , Height ) ;
       glVertex3f ( i   , j+1 , Height ) ;

       glVertex3f ( i+1 , j+1 , Height ) ;
       glVertex3f ( i+1 , j   , Height ) ;
       glVertex3f ( i   , j+1 , Height ) ;
     glEnd ;
 end;
{------------------------------}

По идее должно работать.


ОлегЪ   (2004-11-05 10:08:00) [6]

И никто не поможет?


ОлегЪ   (2004-11-04 23:19:00) [7]

Тот пример у меня не компилируется. Кроме того, я это пытаюсь сделать сам, но не знаю как... Ну помогите же!
На этом коде я остановился:
procedure TMainForm.Svat(FileName: String{; n : integer} );
var
 r, g, b: Real;
 i, j: integer;
 BitMap: TBitmap;
 BMPMap: Array[0..99, 0..49, 0..2] of GLUByte;
begin
 BitMap:= TBitMap.Create;
 BitMap.LoadFromFile(FileName);
 for i:=0 to 99 do
   for j :=0 to 49 do
   begin
     BmpMap[i, j, 0]:=GetRValue(BitMap.Canvas.Pixels[i, j]);
     BmpMap[i, j, 1]:=GetGValue(BitMap.Canvas.Pixels[i, j]);
     BmpMap[i, j, 2]:=GetBValue(BitMap.Canvas.Pixels[i, j]);
   end;
 for i:=0 to 99 do
   for j:=0 to 49 do
   begin
     R:=(BmpMap[i, j, 0])/255;
     G:=(BmpMap[i, j, 2])/255;
     B:=(BmpMap[i, j, 2])/255;
     glColor3f(R, G, B);
     glBegin(GL_POINTS);
       glVertex3f(i/255, j/255, r);
     glEnd;
   end;
end;

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


Колбасьев   (2004-11-04 22:07:00) [8]

Есть демка на эту тему на GameDev.ru -> раздел Samples (Примеры).

А вообще, когда мне надо было, я сам сделал. За вышену вершины треугольника в сетке брал обработанный цвет соответствующей точки в bmp.


Наверх

Титульная страница Поиск, карта сайта Написать письмо