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

Вниз

OpenGL нужна помощь   Найти похожие ветки 

 
anat   (2005-04-06 16:59) [0]

Имеем регулярную сетку
TXYZ = array[0..2] of single (X,Y,Z)
a: array[0..99,0..99] of TXYZ - обственно сетка

Как построить поверхность этой сетки с помощью OpenGL


 
ancara ©   (2005-04-06 17:26) [1]

заранее строим дисплейный список:

glNewList(1, GL_COMPILE);
 for j:=0 to 99-1 do
   for i:=0 to 99-1 do
   begin
   glBegin(GL_TRIANGLE_STRIP);
     glVertex3fv(@a[i+0, j+0]);
     glVertex3fv(@a[i+1, j+0]);
     glVertex3fv(@a[i+0, j+1]);
     glVertex3fv(@a[i+1, j+1]);
   glEnd;
   end;
glEndList;


в процедуре отрисовки окна его вызываем:

glCallList(1);


 
ancara ©   (2005-04-06 17:28) [2]

да, по-умолчанию OpenGL нарисует сплошные треугольники,
чтобы эта сетка выглядела сеткой можно нарисовать только грани этих треугольников:

 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

или вершины

 glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);


 
ancara ©   (2005-04-06 17:39) [3]

и кстати треугольники вовсе не обязательно рисовать, можно четырехугольники, чтоб больше похоже было
glNewList(1, GL_COMPILE);
for j:=0 to 99-1 do
  for i:=0 to 99-1 do
  begin
  glBegin(GL_QUADS);
    glVertex3fv(@a[i+0, j+0]);
    glVertex3fv(@a[i+1, j+0]);
    glVertex3fv(@a[i+1, j+1]);
    glVertex3fv(@a[i+0, j+1]);
  glEnd;
  end;
glEndList;


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


 
anat   (2005-04-06 17:43) [4]

спасибо
Сетку надо нормализовывать -1..1


 
anat   (2005-04-06 19:13) [5]

Как раскрасить треугольники


 
ancara ©   (2005-04-07 12:12) [6]

если нужны только лишь однотонные заливки (без освещения, светотени и пр.)
то можно включить режим GL_COLOR_MATERIAL
glEnable(GL_COLOR_MATERIAL);
 и перед рисованием каждой вершины назначать текущий цвет:
 glColor3f(1, 0, 0);  //красный, в формате float
 glVertex....
 glColor3b(0, 255, 0);  //зеленый, в формате byte

лучше стараться использовать float (или double)везде где, возможно, т.к. OpenGL все равно все к нему приведет в конечном итоге, зачем ей лишнюю работу давать?

а если нужно больше фотореалистичности то придется
 врубить освещение:
glEnable(GL_LIGHTING);
потом включить хотя бы один источник света:
glEnable(GL_LIGHT0);
затем командами glLightf, glLighti и  glLightfv настроить его параметры (положение, диффузный, амбиентный и спекулярный цвета, тип, угол освещения для SPOT-типа, коэффициенты затухания и еще чего-то там, см.хелп).
А потом для каждого треугольника задать материал:

   glMaterialfv(GL_FRONT, GL_AMBIENT,   @MyAmbient);
   glMaterialfv(GL_FRONT, GL_DIFFUSE,   @MyDiffuse);
   glMaterialfv(GL_FRONT, GL_SPECULAR,  @MySpecular);
   glMaterialfv(GL_FRONT, GL_EMISSION,  @MyEmission);
   glMaterialf (GL_FRONT, GL_SHININESS, FFrontMaterial.Shininess);


 Да, и конечно для этого варианта нужно отключить режим GL_COLOR_MATERIAL в самом начале
glDisable(GL_COLOR_MATERIAL);


 
anat   (2005-04-07 15:09) [7]

СПАСИБО


 
parovoZZ ©   (2005-04-10 20:17) [8]

А как по этой сетке перемещаться? Что-то я никак не въеду. Что делать с мировой системой координат - сделать её фиксированной и поворачивать (перемещать) систему координат набдюдателя и всё строить относительно начала мировой СК? А если что-то типа флайт симулятора - тогда от начала можно удалиться настолько далеко, что 32 бит может не хватить. Как быть?


 
ancara ©   (2005-04-11 15:40) [9]

>что 32 бит может не хватить
32 бит чего, Z-буфера?
В OpenGL есть понятие так называемого конуса видимости (да оно вообще много где есть), у этого конуса есть боковые, верхняя и нижняя плоскости отсечения, но самое главное есть БЛИЖНЯЯ и ДАЛЬНЯЯ. Параметры этого конуса задаются функцией gluPerspective (или glFrustum, кому что...). Ближняя плоскость, как правило ближе к камере (например 0.1), дальняя - дальше (например 1000). Расстояние между ними: 1000 - 0.1 = 999.9
Так вот, если видеокарта может держать 32-битный Z-буффер, это значит одна "ячейка" этого буфера может принимать 2 в 32-ой степени разных значений, т.е. 4 294 967 296.
OpenGL "делит" расстояние 999.9 на кол-во значений 4 294 967 296 и получает "шаг Z-буфера" = 0.00000023280. Вот и все.
А перемещаеться по сцене можно как душе угодно. Обычно перемещается камера (вместе с конусом видимости, хотя он больше похож на усеченную пирамиду), используя gluLookAt (лично я к этой функции отношусь резко отрицательно, глючная она какая-то, не разобрался в свое время и не хочу уже..) или другим методом:
 - инициализируем матрицу проекций (gluPerspective), на этом этапе система координат можно рассматривать как "наблюдателя";
 - поворачиваем и перемещаем сист. координат на отрицательные координаты камеры (glTransfer), после этого систему координат можно рассматривать как "мировую";
 - рисуем остальные объекты в мировых координатах;


 
parovoZZ ©   (2005-04-11 17:19) [10]

скачал исходник Terrain_del с этого сайта. Там камера перемещается с помощью glTranslatef (x, 0, z), где x и у изменяются от 0 до 1. Получается, что начало координат "едет" по карте вместе с камерой, а сама карта рисуется с дискретностью в 1 шаг. Гы. не укладывается в голове никак.
Ещё вопрос: сколько полигонов можно выделить для видимой части карты?


 
anat   (2005-04-12 10:25) [11]

Сетку нарисовал.

А можно ли на эту сетку наложить BMP или JPG
и как


 
anat   (2005-04-12 16:45) [12]

Сделал.
*.BMP (128,32)

Накладываю всю текстуру(одну) на поверхность- она растягивается

А как сделать, чтобы исходный *.BMP не растягивался.


 
Sapersky   (2005-04-13 13:57) [13]

OpenGL "делит" расстояние 999.9 на кол-во значений 4 294 967 296 и получает "шаг Z-буфера" = 0.00000023280. Вот и все.

Рапределение там нелинейное. На ближние объекты точность больше. Особенно сильно это проявляется, если поставить nearplane < 1.

http://www.mvps.org/directx/articles/using_w-buffers.htm

(DX или OGL в данном случае - без разницы).


 
anat   (2005-04-15 12:55) [14]

1.   Handle = Panel.Handle

    DC:=GetDC (Handle);
    SetDCPixelFormat(DC);
    hrc := wglCreateContext(DC);
    wglMakeCurrent(DC, hrc);
    Создаю списки - ВСЕ ОК

2.   Хочу рисовать на BitMap
    InternalBmp:=TBitMap.Create;
    InternalBmp.HandleType:=BmDib;
    InternalBmp.Height:=Screen.Height;
    InternalBmp.Width:=Screen.Width;
    DC:=InternalBmp.Canvas.Handle;

    SetDCPixelFormat(DC);
    hrc := wglCreateContext(DC);
    wglMakeCurrent(DC, hrc);
    списки не создаются

    Как дечить



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

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

Наверх




Память: 0.49 MB
Время: 0.037 c
1-1122640151
mazepa
2005-07-29 16:29
2005.08.21
io error 53


1-1123048026
ZSegrey
2005-08-03 09:47
2005.08.21
почему исчезает текст в СтатусБаре?


1-1122368423
Dust
2005-07-26 13:00
2005.08.21
Создание логов


1-1122845326
AIms
2005-08-01 01:28
2005.08.21
Как получить размер property ?


3-1121250621
TAN_K
2005-07-13 14:30
2005.08.21
Отчет QuickRep





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