OpenGL transformations (glScale, glTranslate, etc)
我正在学习有关openGL以及如何进行转换(例如翻译和缩放)的知识。 我知道您通常必须翻译成原语,然后做任何您想做的事情(让我们说规模),然后再翻译回来。 据我了解,这是手动完成的,但您可以使用glScale()做同样的事情。
我的问题是,如果我使用glScale函数,是否还需要转换为原点并返回?
您可能不需要对原点和原点进行任何转换,只需按照要求的顺序进行转换即可。请记住,最后一次应用的变换发生在前一个变换的空间中。例如:
1 2 3 4 | // draw object centred on (1,2,3) and ten times bigger glTranslatef(1,2,3); glScalef(10,10,10); drawObject(); |
与
1 2 3 4 | // draw object centred on (10,20,30) and ten times bigger glScalef(10,10,10); glTranslatef(1,2,3); drawObject(); |
在第二个示例中,平移和对象都按x10缩放,因为它们是在缩放之后完成的。 (此方案允许drawObject()包含转换,并且仍然表现得像单个单元一样。)
您必须考虑在堆栈上进行的转换。换句话说,您指定的最后一个转换首先发生。所以,
1 2 3 4 | glTranslatef(1,2,3); glScalef(10,10,10); glRotatef(45,1,0,0); drawObject(); |
将首先绕x轴旋转45度,然后将对象缩放到(10,10,10),然后平移到(1,2,3)。但是,您还必须记住,您应用的任何变换都会影响线下的变换。如果我们反转上述变换的顺序,则旋转将绕不同的点旋转。
另请参见glScale参考。