Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как рисовать 3D и 2D объекты в одной сцене? [Delphi, Windows]


Страницы:   1 2

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-Д чтоб все думали что так надо, а чтоб поворачивались вместе с камерой  думаю сможешь сделать.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо