我正在学习openGL以及如何进行转换和缩放等转换。我知道你必须经常翻译到原点,然后做你想做的任何事情(比如缩放),然后翻译回来。根据我的理解,这是手动完成的,但你可以用glScale()做同样的事情。
我的问题是,如果我使用glScale函数,我还需要转换为原点吗?
答案 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
确实将当前矩阵乘以比例矩阵。所以是的,对于您想要做的事情,您可能希望在应用翻译之前应用比例矩阵。
答案 2 :(得分:3)
你必须考虑堆栈上发生的转换。换句话说,您指定的最后一个转换首先发生。所以,
glTranslatef(1,2,3);
glScalef(10,10,10);
glRotatef(45,1,0,0);
drawObject();
首先围绕x轴旋转45度,然后将对象缩放到(10,10,10),然后转换为(1,2,3)。但是,您还必须记住,您应用的任何转换都会影响转换。如果我们颠倒上述变换的顺序,则旋转将围绕不同的点旋转。