我正在学习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 reference。