Преобразования OpenGL (glScale, glTranslate и т. Д.) - PullRequest
4 голосов
/ 19 марта 2011

Я изучаю openGL и как выполнять преобразования, такие как перевод и масштабирование.Я знаю, что вы обычно должны переводить в начало координат, затем делать все, что хотите (скажем, в масштабе), а затем переводить обратно.Насколько я понимаю, это делается вручную, но вы можете сделать то же самое с glScale ().

Мой вопрос заключается в том, нужно ли мне по-прежнему переводить в исходное и обратно, если я использую функцию glScale?

Ответы [ 3 ]

15 голосов
/ 19 марта 2011

Вам, вероятно, не нужно делать никакого перевода к началу координат и обратно, просто выполните преобразования в требуемом порядке.Помните, что последнее примененное преобразование происходит в преобразованном пространстве предыдущих.Например:

// draw object centred on (1,2,3) and ten times bigger
glTranslatef(1,2,3);
glScalef(10,10,10);
drawObject();

против

// draw object centred on (10,20,30) and ten times bigger
glScalef(10,10,10);
glTranslatef(1,2,3);
drawObject();
3 голосов
/ 23 марта 2011

Вы должны думать о преобразованиях, происходящих в стеке. Другими словами, последнее указанное вами преобразование происходит первым. Таким образом,

glTranslatef(1,2,3);
glScalef(10,10,10);
glRotatef(45,1,0,0);
drawObject();

сначала повернет на 45 градусов вокруг оси x, затем масштабирует объект до (10,10,10), а затем переводит в (1,2,3). Однако вы также должны помнить, что любое применяемое преобразование влияет на преобразования в дальнейшем. Если мы изменим порядок вышеупомянутых преобразований, вращение будет вращаться вокруг другой точки.

3 голосов
/ 19 марта 2011

Все glScale умножает текущую матрицу на масштабную матрицу. Так что да, для того, что вы хотите сделать, вы хотели бы применить матрицу масштабирования перед применением перевода.

См. Также Ссылка glScale .

...