![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как рисовать 3D и 2D объекты в одной сцене? [Delphi, Windows]
Creative © (2006-12-12 16:05:00)Есть процедура
procedure RenderScene:
begin
A.Render; // А и В - произвольные объекты
B.render;
end;
Метод Render объектов А и В обычную процедуру рисования
glPushMatrix;
...// трансформации
....//рисование
glPopMatrix;
НО: Объект А должен находиться в двумерном пространстве и иметь фиксированный размер и координату(например это какое то системное окошко, индикатор, кнопка и так далее), а объект B - находиться в трехмерном пространстве и подвергаться различного рода трансформациям (собственно объекты, которые видит пользователь).
Как совместить рисование первого и второго?
Мне кажется, что проблема в том, что в Resize можно описать только ОДНУ систему координат - либо glOrtho, либо gluPerspective, хотя возможно я и ошибаюсь.
Creative (2006-12-13 17:34:00) [21]
> MeF Dei Corvi © (13.12.06 16:49) [9]
> > А почему?Потому, что при определенном стечении обстоятельств(например,
> при включенном DepthTest) 3д объект может перекрыть 2д,
> несмотря на то, что 2д нарисован позднее. Если я не прав,
> поправьте :)
Вот кстати и вопрос на тему, что за чем рисовать: Я рисую 3D объект, потом 2D объект (квадрат), а потом хочу вывести надписть поверх квадрата (с помощью glPrint('Caption')). Но надпись явно лежит ПОД кнопкой. Почему и как с этим бороться?
MeF Dei Corvi (2006-12-13 17:31:00) [22]
> Меня очень волнует реакция на вот это утверждение:
Что именно волнует? :) Смену проекции в Resize помещают только затем, чтобы уменьшить количество вычислений, производимых процессором и видеокартой, т.к. Resize вызывается только при смене размеров окна, когда Draw вызывается при перерисовке, а перерисовка обычно происходит во много раз чаще, чем Resize. В данном случае, менять проекцию придётся в любом случае. Если производительность - не критичный фактор(т.е. если пара миллисекунд не важна), то можно оставить как есть.
Creative (2006-12-13 16:54:00) [23]Меня очень волнует реакция на вот это утверждение:
я заметила, что в Resize вообще можно не ставить теперь пересчет матриц, кажется и так все ресайзится
MeF Dei Corvi (2006-12-13 16:49:00) [24]
> А почему?
Потому, что при определенном стечении обстоятельств(например, при включенном DepthTest) 3д объект может перекрыть 2д, несмотря на то, что 2д нарисован позднее. Если я не прав, поправьте :)
> есть такой стиль окна, чтобы оно могло масштабироваться
> только пропорционально, или это самому задавать нало?
Насколько я знаю, такого стиля нет, хотя могу и ошибаться. Скорее всего, придётся регулировать это программно.
Creative (2006-12-13 16:39:00) [25]
> лучше сначало рисовать 3D объект а после него уже всё 2D
А почему? Это единственная претензия?
RzCoDer (2006-12-13 16:18:00) [26]лучше сначало рисовать 3D объект а после него уже всё 2D
Creative (2006-12-13 16:03:00) [27]Я на правах примера поступила проще: написала процедуру DrawScene:
glPushMatrix;
glOrtho();
// манипуляции над матрицами
//отрисовка объекта
glPopMatrix;
glPushMatrix;
gluPerspective();
// манипуляции над матрицами
//отрисовка объекта
glPopMatrix;
Все рисуется именно так как надо, и я заметила, что в Resize вообще можно не ставить теперь пересчет матриц, кажется и так все ресайзится. Скажите - я что-то не упустила, это глупо?
И еще вопрос: не могу найти в документации - есть такой стиль окна, чтобы оно могло масштабироваться только пропорционально, или это самому задавать нало?
Vga (2006-12-13 14:20:00) [28]> Я извиняюсь за тупой вопрос, я правильно понимаю, что на
> экране будет отображаться и объект, нарисованный в перспективе,
> и объект, нарисованный в орто? Загрузка последующей матрицы
> не стирает предыдущую?
Стирает, но все, что нарисовано с помощью первой матрицы останется. А с новой матрицей будет рисоваться поверх.
> А как в таком случае будет выглядеть ResizeScene? Ему ведь
> пофигу какие объекты и в какой момент нарисованы, он ведь
> просто пересчитывает размер области вывода и утанавливает
> какую-то одну проекцию. Не ставить же прорисовку в Resize?
Он даже не влияет на то, что уже нарисовано (не считая изменения вьюпорта). Resize влияет только на то, что будет нарисовано после него (если я правильно понял, как у тебя сделано). Тебе предлагают в Resize посчитать матрицы для данного разрешения и сохранить их в переменные. А потом при отрисовке грузить нужную матрицу (загрузил 3D, отрисовал трехмерные объекты, загрузил 2D, отрисовал двухмерные объекты).
Creative (2006-12-13 10:32:00) [29]
> Теперь по мере необходимости загружаем нужные матрицы.
Я извиняюсь за тупой вопрос, я правильно понимаю, что на экране будет отображаться и объект, нарисованный в перспективе, и объект, нарисованный в орто? Загрузка последующей матрицы не стирает предыдущую?
А как в таком случае будет выглядеть ResizeScene? Ему ведь пофигу какие объекты и в какой момент нарисованы, он ведь просто пересчитывает размер области вывода и утанавливает какую-то одну проекцию. Не ставить же прорисовку в Resize?
RzCoDer (2006-12-12 20:11:00) [30]glOrtho
Rial (2006-12-12 19:58:00) [31]glOrtho или gluPerspective всего лишь выполняют
некоторые операции с матрицами OpenGL.
Надо сначала сделать
glLoadIdentify(), настроить все как надо
для Ortho, запомнить все текущие матрицы в
некоторую область памяти.
Теперь опять грузим единичную, настраиваем
все для режима перспективы и тоже ее сохраняем.
Теперь по мере необходимости загружаем нужные матрицы.
Вот и все, все просто :)
Вот вырезанный кусок кода, который может навести на
умную мысль:
TGLMatrix = Array [0..3, 0..3] of GLFloat;
TGLMatrixes = record
Model : TGLMatrix;
Proj : TGLMatrix;
Tex : TGLMatrix;
end;
PGLMatrixes = ^ TGLMatrixes;
procedure riglSaveMatrix(Const PMatrixes : PGLMatrixes);
begin
With PMatrixes^ do begin
glGetFloatv(GL_PROJECTION_MATRIX, @Proj);
glGetFloatv(GL_MODELVIEW_MATRIX, @Model);
glGetFloatv(GL_TEXTURE_MATRIX, @Tex);
end;//With
end;
procedure riglLoadMatrix(Const PMatrixes : PGLMatrixes);
Var MatrixMode : GLInt;
begin
glGetIntegerv (GL_MATRIX_MODE, @MatrixMode);
With PMatrixes^ do begin
glMatrixMode(GL_PROJECTION);
glLoadMatrixF(@Proj);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixF(@Model);
glMatrixMode(GL_TEXTURE);
glLoadMatrixF(@Tex);
end;//With
glMatrixMode(MatrixMode);
end;
Fredy314 (2006-12-12 18:52:00) [32]Ну так пусть будут системные окошка в перспективе, красиво расставить их в 3-Д чтоб все думали что так надо, а чтоб поворачивались вместе с камерой думаю сможешь сделать.