OpenGL转换(glScale,glTranslate等)

问题描述 投票:4回答:3

我正在学习openGL以及如何进行转换,例如翻译和缩放。我知道您通常必须翻译成原语,然后做任何您想做的事情(让我们说规模),然后再翻译回来。据我了解,这是手动完成的,但您可以使用glScale()做同样的事情。

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

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


3
投票

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

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

首先将绕x轴旋转45度,然后将对象缩放为(10,10,10),然后平移为(1,2,3)。但是,您还必须记住,您应用的任何变换都会影响线下的变换。如果我们反转上述变换的顺序,则旋转将绕另一个点旋转。


3
投票

[glScale的全部作用是将当前矩阵乘以比例矩阵。因此,是的,对于您想做的事情,您需要在应用翻译之前应用比例矩阵。

另请参见glScale reference

© www.soinside.com 2019 - 2024. All rights reserved.