Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

Генерация ландшафта   Найти похожие ветки 

 
ОлегЪ ©   (2004-11-04 21:38) [0]

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


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

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

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


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

Тот пример у меня не компилируется. Кроме того, я это пытаюсь сделать сам, но не знаю как... Ну помогите же!
На этом коде я остановился:
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-05 10:08) [3]

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


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

Ну типа так :
{------------------------------}
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 16:06) [5]


> Shulkin

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


 
Shulkin   (2004-11-06 11:47) [6]

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

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

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 у тебя упадет ниже плинтуса.


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

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


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


> Shulkin

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



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
9-1099264534
Кто---то
2004-11-01 02:15
2005.02.06
Как в GLScene сделать рамочку выделения области ? Как в Фотошопе


3-1104425386
Domkrat
2004-12-30 19:49
2005.02.06
Передача параметров в процедуру


1-1106515128
Jilian
2005-01-24 00:18
2005.02.06
хочу сделать непрозрачной дочернюю форму


6-1100956805
XProger
2004-11-20 16:20
2005.02.06
идентификация в IRC


1-1106296299
sardox
2005-01-21 11:31
2005.02.06
Пролистать memo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский