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

Вниз

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 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.051 c
14-1122466533
Lexer
2005-07-27 16:15
2005.08.21
Кляп удаленному компьютеру


1-1123129963
dreamse
2005-08-04 08:32
2005.08.21
Проблема с пониманием программы пути


14-1122752153
Michael5
2005-07-30 23:35
2005.08.21
Объясните, что с поиском на этом сайте???


14-1122357632
GOOD90
2005-07-26 10:00
2005.08.21
Где найти программы для Motorola c650.


1-1122645251
ctranik
2005-07-29 17:54
2005.08.21
Вопрос по TreeView-ву