4

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

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

4

3 回答 3

16

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

// 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() 包含转换并且仍然像单个单元一样运行。)

于 2011-03-19T08:49:59.720 回答
3

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

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

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

于 2011-03-23T14:27:47.843 回答
3

所做glScale的只是将当前矩阵乘以比例矩阵。所以是的,对于听起来你想做的事情,你会想在应用翻译之前应用比例矩阵。

另请参阅glScale 参考

于 2011-03-19T06:49:07.863 回答