ПрограммированиеФорумГрафика

glTranslatef glScalef использование вместе в glOrtho

#0
19:13, 30 окт 2009

Здравствуйте!
Вот столкнулся с проблемой и хочу понять в чем ее суть.
Рисую квад в 2Д пространстве дисплея после чего хочется изменять его положение и размер без изменения вершинного буфера.
Делаю это с помошью функций glTranslatef glScalef, но при изменение маштаба смещяется и позиция по соответствуюшей оси.

Вот пример кода при котором я говорю что положение квада должно быть по x=10 и маштаб по x=0.5 в итоге маштаб 0.5, а
положение меньше 10 по иксу получается
если же убрать glScalef то все работает правильно.

//Переход в режим 2Д
            glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glLoadIdentity();
  glOrtho(0, 800, 0, 600,0,1);
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
  glLoadIdentity();

glPushMatrix();

glTranslatef(10,0,0);
glScalef(0.5f,0.0f,0.0f)

DrawQuad();

glPopMatrix();

//возврашение в 3Д
  glPopMatrix();
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();
  glMatrixMode(GL_MODELVIEW);
#1
19:43, 30 окт 2009

glScalef(0.5f,1.0f,1.0f)
glTranslatef(10,0,0);

?

#2
20:03, 30 окт 2009

Пробовал так не помогает почему то.. хотя в DX9 именно так работает отлично.

#3
20:41, 30 окт 2009

Именно так? Тогда попробуй z брать не 1.0f, а -1.0f.

#4
20:45, 30 окт 2009

Хм.. впринцыпе нашел в чем проблема.

интересно почему в DX нужно сначала scale потом Translate, а в OpenGL наоборот, и самое главное как сделать чтобы везде было одинаково

#5
20:50, 30 окт 2009

В принципе, в серьёзных проектах как правило используются glLoadMatrix и иногда glMultMatrix, а матрицы составляются вручную. Так что это возможно и может быть решением проблемы. :)

#6
20:59, 30 окт 2009

Да, но если я хочу сделать 2 рендера но при этом чтобы был один класс камеры например и в нем создавалась матрица вида (LookAt) одна на 2 рендера.. скажу ис практики у меня не получилось использовать look at матрицу которая отлично работает с OGL в DX9 пришлось использовать D3DXMatrixLookAtRH в итоге вид разный в обоих рендерах. Может кто нибудь знает как решить эту проблему?

#7
22:01, 30 окт 2009

lebron
> Хм.. впринцыпе нашел в чем проблема.

И в чём была проблема?

> Может кто нибудь знает как решить эту проблему?

Используй свой матричный функционал...

#8
22:09, 30 окт 2009

Executor
Проблема была в том что используя одну и туже матрицу я получал непонятное раположение камеры в d3d9
Может я как то не так загружал в d3d9 матрицу.. какой аналог glLoadMatrix в d3d9

#9
10:13, 31 окт 2009

IDirect3DDevice9::SetTransform. Ну там как получается... Это аналог двух функций

OpenGL

glMatrixMode(GL_MODELVIEW);
glLoadMatrix(&matrix);

Direct3D

pD3DDevice->SetTransform(D3DTS_WORLD, &matrix);

Получается два в одном, задаётся и тип матрицы, и сама матрица. Ну понятно, что pD3DDevice типа IDirect3DDevice9* или LPDIRECT3DDEVICE9. :)

#10
10:42, 31 окт 2009

K.V.
Спасибо попробую.

ПрограммированиеФорумГрафика

Тема в архиве.