Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

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

 
ОлегЪ ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.038 c
14-1105778142
Шишкин Илья
2005-01-15 11:35
2005.02.06
delphibase.endimus.ru


1-1106289423
NewDelpher
2005-01-21 09:37
2005.02.06
как найти причину AV в vcl50.bpl?


1-1106472512
FFFFFFQE
2005-01-23 12:28
2005.02.06
Как через Form1.Components[i] получить размеры компонента


14-1105772075
Чеширский_Кот
2005-01-15 09:54
2005.02.06
Жизненно важный софт


4-1103178046
Dr. Genius
2004-12-16 09:20
2005.02.06
Инфо о модеме





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский