关于缩放:OpenGL转换(glScale,glTranslate等)

OpenGL transformations (glScale, glTranslate, etc)

我正在学习有关openGL以及如何进行转换(例如翻译和缩放)的知识。 我知道您通常必须翻译成原语,然后做任何您想做的事情(让我们说规模),然后再翻译回来。 据我了解,这是手动完成的,但您可以使用glScale()做同样的事情。

我的问题是,如果我使用glScale函数,是否还需要转换为原点并返回?


您可能不需要对原点和原点进行任何转换,只需按照要求的顺序进行转换即可。请记住,最后一次应用的变换发生在前一个变换的空间中。例如:

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

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

在第二个示例中,平移和对象都按x10缩放,因为它们是在缩放之后完成的。 (此方案允许drawObject()包含转换,并且仍然表现得像单个单元一样。)


您必须考虑在堆栈上进行的转换。换句话说,您指定的最后一个转换首先发生。所以,

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

将首先绕x轴旋转45度,然后将对象缩放到(10,10,10),然后平移到(1,2,3)。但是,您还必须记住,您应用的任何变换都会影响线下的变换。如果我们反转上述变换的顺序,则旋转将绕不同的点旋转。


glScale所做的只是将当前矩阵乘以比例矩阵。所以是的,对于您想做的事情,您希望在应用翻译之前应用比例矩阵。

另请参见glScale参考。