Форум: "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_MATERIALglEnable(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