OpenGL转换(glScale,glTranslate等)

时间:2011-03-19 06:37:12

标签: opengl scale transformation translate

我正在学习openGL以及如何进行转换和缩放等转换。我知道你必须经常翻译到原点,然后做你想做的任何事情(比如缩放),然后翻译回来。根据我的理解,这是手动完成的,但你可以用glScale()做同样的事情。

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

3 个答案:

答案 0 :(得分:14)

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

// 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();

答案 1 :(得分:3)

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

另见glScale reference

答案 2 :(得分:3)

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

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

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