我正在学习 openGL 以及如何进行转换和缩放等转换。我知道你通常必须翻译到原点,然后做任何你想做的事情(比如说缩放),然后翻译回来。据我了解,这是手动完成的,但您可以使用 glScale() 执行相同的操作。
我的问题是,如果我使用 glScale 函数,我还需要转换到原点并返回吗?
我正在学习 openGL 以及如何进行转换和缩放等转换。我知道你通常必须翻译到原点,然后做任何你想做的事情(比如说缩放),然后翻译回来。据我了解,这是手动完成的,但您可以使用 glScale() 执行相同的操作。
我的问题是,如果我使用 glScale 函数,我还需要转换到原点并返回吗?
您可能不需要对原点和返回进行任何转换,只需按所需顺序进行转换即可。请记住,最后应用的变换发生在先前变换的变换空间中。例如:
// 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();
在第二个示例中,平移和对象都缩放 x10,因为它们是在缩放之后完成的。(此方案允许 drawObject() 包含转换并且仍然像单个单元一样运行。)
您必须考虑在堆栈上发生的转换。换句话说,您指定的最后一个转换首先发生。所以,
glTranslatef(1,2,3);
glScalef(10,10,10);
glRotatef(45,1,0,0);
drawObject();
将首先围绕 x 轴旋转 45 度,然后将对象缩放到 (10,10,10),然后平移到 (1,2,3)。但是,您还必须记住,您应用的任何转换都会影响后续的转换。如果我们颠倒上述变换的顺序,旋转将围绕不同的点旋转。
所做glScale
的只是将当前矩阵乘以比例矩阵。所以是的,对于听起来你想做的事情,你会想在应用翻译之前应用比例矩阵。
另请参阅glScale 参考。