OpenGL:将单应变换应用于矩阵堆栈

时间:2015-02-08 02:58:44

标签: c++ opengl graphics homography

我是OpenGL的新手,在C ++中完全生锈了。对于学校作业,我必须修改一些C ++入门代码以创建基本的2D动画。

我想把一个单位正方形变成各种各样的梯形。我可以计算完成此操作的单应性,但我无法弄清楚如何将它们应用到矩阵堆栈。

表单的现有代码:

// Draw rectangle
glLoadIdentity();
glPushMatrix();
glScalef(HEIGHT, WIDTH, 1.0)
// C++ code to set colour
// C++ code to draw square
glPopMatrix()

按预期绘制一个用所选颜色缩放到HEIGHT和WIDTH的矩形。

其中一个单应性是:

1.0   0.0       0.0
0.0   9.0/4.0   3.0/4.0
0.0   1.0/12.0  1.0/4.0

它转换点:(1,1),(-1,1),( - 1,-1),(1,-1)到(3,9),( - 3,9),( -6,-9),(6,-9)。

我在列主要顺序中将其表示为:

float homographyBody[9] = {1.0, 0.0, 0.0, 0.0, 9.0/4.0, 1.0/12.0, 0.0, 3.0/4.0, 1.0/4.0}

但是,代以:

glMultMatrixf(homographyBody)

有:

glScalef(HEIGHT, WIDTH, 1.0)

没有达到预期的效果。

没有乘法和缩放的组合似乎能够渲染除了从靠近原点向上和向右的点延伸的长楔形以外的任何东西。

我怀疑我对一些基本概念一无所知。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

glMultMatrix()期望一个4x4矩阵作为参数。此外,正如您已经注意到的,OpenGL以列主要顺序存储矩阵。

要使这项工作,您必须将矩阵扩展到4x4。您需要一个4x4矩阵来转换以同质坐标表示的3D点,就像您的原始3x3矩阵在同质坐标中转换2D点一样。

对于3x3矩阵,转换应用为:

[ a00 a01 a02 ]   [ x ]   [ a00 * x + a01 * y + a02 ]
[ a10 a11 a12 ] * [ y ] = [ a10 * x + a11 * y + a12 ]
[ a20 a21 a22 ]   [ 1 ]   [ a20 * x + a21 * y + a22 ]

由此,在除以w(结果向量的第3个分量)之后,得到的结果为:

x' = (a00 * x + a01 * y + a02) / (a20 * x + a21 * y + a22)
y' = (a10 * x + a11 * y + a12) / (a20 * x + a21 * y + a22)

将其扩展为4x4矩阵,我们并不关心z坐标:

[ a00 a01 0.0 a02 ]   [ x ]   [ a00 * x + a01 * y + a02 ]
[ a10 a11 0.0 a12 ] * [ y ] = [ a10 * x + a11 * y + a12 ]
[ 0.0 0.0 1.0 0.0 ]   [ z ]   [ z                       ]
[ a20 a21 0.0 a22 ]   [ 1 ]   [ a20 * x + a21 * y + a22 ]

除以w(现在是结果向量的第4个分量)后,得到与之前相同的点。

对于您的示例,这是:

float homographyBody[16] = {
    1.0f, 0.0f,      0.0f, 0.0f,
    0.0f, 9.0f/4.0f, 0.0f, 1.0f/12.0f,
    0.0f, 0.0f,      1.0f, 0.0f,
    0.0f, 3.0f/4.0f, 0.0f, 1.0f/4.0f
};