![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Большие сцены в OpenGL [Delphi, Windows]
VitaWED © (2006-08-22 13:37:00)Доброго времени суток! Сейчас занимаюсь разработкой 3d сцен для больших участков территории (город целиком). Начал использовать под это дело OpenGL 2.0 и столкнулся с такой проблемой: сцена с большим числом полигонов не прорисовывается, получить картинку удается только при большом приближении. То бишь не получается красивое приближение/удаление/полет над городом, хотя ресурсов системы вроде достаточно. Вопрос: это такое ограничение OpenGL или мои кривые руки? И вообще,если не OpenGL, то какой инструмент порекомендуют уважаемые мастера под это дело?
НовичекОпенГЛ (2006-09-22 08:38:00) [1]Всем ОГРОМНОЕ спасибо. Все наладилось! Очевидно, последние ответы читал уже через строку...
MeF Dei Corvi (2006-09-21 16:28:00) [2]
> Русские доки - зло и попса! Даешь первоисточники! Гы-гы
> :))
Может просто версия русского дока старая? :) Хотя с точки зрения элементарной логики, отрицательного расстояния не бывает.
ancara (2006-09-21 15:02:00) [3]балин, тока ведь выше говорили, что в gluPerspective zNear должно быть больше нуля, а не ноль.
НовичекОпенГЛ (2006-09-21 14:00:00) [4]Где-то в начале:
var x0, y0, z0: GLFloat;
x0 := 1.0; // Начальная позиция глаза
y0 := -8.0;
z0 := -4.0;
a := 97.0; // Начальные углы
b := +30.0;
...
procedure Tfm3D.FormResize(Sender: TObject);
begin
glViewPort (0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(10.0, ClientWidth / ClientHeight, 0.0, 50.0);
gluLookAt (
x0, y0, z0,
x0+10*cos(a*pi/180), y0+10*sin(a*pi/180), z0+10*sin(b*pi/180),
0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
InvalidateRect(Handle, nil, False); // там прорисовка
end;
Координаты и габариты всех объектов нормализованы в кубик (-1,-1,-1) (1,1,1)
В проц-е прорисовки:
glEnable (GL_DEPTH_TEST);
...
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Далее рисуются стены с помощью GL_QUADS, крыши с помощью gluTessBeginPolygon. Высота зданий отрицательная (примерно от 0 до -0.01).
Повторяю, без GL_DEPTH_TEST все рисуется нормально. glDepthFunc пробовал разные.
XProger (2006-09-21 11:00:00) [5]НовичекОпенГЛ, чему равны zNear, zFar и общий размер сцены?
НовичекОпенГЛ (2006-09-21 10:20:00) [6]У меня примерно тоже самое с 3-D городом. Все рисуется при отключенном буфере глубины с неверным наложением (по поряку рисования). Если включаю GL_DEPTH_TEST начинается всякая ерунда (хаотичные куски труегольников). Плоские объекты имеют Z=0, остальные пробовал и +Height и -Height - не помогает. Использую gluPerspective и gluLookAt. Видео карты разные, в т.ч. Geforce. ПОМОГИТЕ, Профессионалы 3D-графики !!! З.Ы. Краснова М. читал...
JohnJ (2006-09-01 16:09:00) [7]2RzCoDer
>>Параметры near и far представляют
>> дистанции от точки наблюдения до ближней и дальней плоскостей
>> отсечения вдоль отрицательного направления оси z.
>
>И ни слова про отрицательность
"дистанция от точки наблюдения" не может быть отрицательной, это заведомо положительное число.
Pa5ha (2006-08-30 22:02:00) [8]К слову ближняя плоскость отсечения должна быть все же больше нуля строго. Краснов в книге д3д так и говорит. В этом плане ОпенГЛ не должен отличаться от д3д. А при нуле з-буффер должен отключаться. В д3д отключается, проверял, в опенГЛ не проверял, поверил наслово :)
VitaWED (2006-08-23 14:22:00) [9]Все точно. Разобрался. Спасиба всем.
ancara (2006-08-23 12:12:00) [10]P.S. значения 0.0001 и 1.0 - это я образно, автору вопроса следует самому определить какие значения ему больше подходят.
ancara (2006-08-23 12:09:00) [11]Вотцитата из RedBook:
void gluPerspective(GLdouble fovy, GLdouble aspect,
GLdouble near, GLdouble far);
Creates a matrix for a symmetric perspective-view frustum and multiplies the current matrix by it.
fovy is the angle of the field of view in the x-z plane; its value must be in the range [0.0,180.0].
aspect is the aspect ratio of the frustum, its width divided by its height. near and far values the
distances between the viewpoint and the clipping planes, along the negative z-axis. They should always be positive.
Русские доки - зло и попса! Даешь первоисточники! Гы-гы :))
По теме: действительно очень похоже, что дальняя плоскость отсечения не достаточно далеко. И если ее поставить на 100000, то ближнюю не обязательно на 0.0001, лучше на 1.0. Z-буфер ведь не резиновый, 24 бита небось?
RzCoDer (2006-08-23 11:49:00) [12]Хм, я кстати тоже:
Вот цитата из редбук
> void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble
> near, GLdouble far);
>
>
> Создает матрицу для пирамиды симметричного перспективного
> вида и умножает на нее текущую матрицу. Параметр fovy задает
> угол визуального охвата в плоскости yz, его значение должно
> лежать в диапазоне [0.0, 180.0]. Параметр aspect – это отношение
> ширины пирамиды к ее высоте. Параметры near и far представляют
> дистанции от точки наблюдения до ближней и дальней плоскостей
> отсечения вдоль отрицательного направления оси z.
И ни слова про отрицательность
Zo (2006-08-23 11:25:00) [13]кстати, никогда не слышал что он должен быть сторго больше нуля
RzCoDer (2006-08-23 11:09:00) [14]Chemodan, последние два параметра ограничивают область в которой ogl прорисовывает полигоны, -0.01 - ближняя стенка, не обязательно отрицательная, 99999999.0 - дальняя стенка, соответсвенно если объект от "камеры" будет дальше чем 99999999.0 то отрисовываться он не будет. Я так подумал что у тебя этот параметр может быть относительно небольшим при больших размерах сцены, по этому и не отрисовываестя.
> XProger © (23.08.06 05:59) [5]
Ты это про меня?
tButton (2006-08-23 10:31:00) [15]
> сцена с большим числом полигонов не прорисовывается, получить
> картинку удается только при большом приближении
вот про это подробнее
XProger (2006-08-23 05:59:00) [16]Chemodan, понимаешь, человек не может сказать что-нибудь по делу, а сказать ведь надо... вот он и ненашёл ничего умнее тупого стеба над автором темы ;)
Chemodan (2006-08-23 04:40:00) [17]>gluPerspective(60.0, Resolution.Width/Resolution.Height, -0.01, 99999999.0);
Что такое -0.01? Этот параметр должен быть строго больше нуля!!!
RzCoDer (2006-08-22 18:23:00) [18]А если так:
gluPerspective(60.0, Resolution.Width/Resolution.Height, -0.01, 99999999.0);
?
@!!ex (2006-08-22 15:38:00) [19]Ерунда какая то......
OpenGL - это средсто рисования треугольников. Ни больше, ни меньше.
И ему плевать, сколько этих самых треугольников ты собираешся нарисовать.
Скрин давай.
DeadMeat (2006-08-22 15:12:00) [20]Вот не совсем впитал, что значит "не прорисовывается" в данном контексте. Чистый экран чтоли виден только?