3

我正在尝试为 OpenGL 创建一个透视投影矩阵。我知道如何使用 afloat[16]但为了一致性起见,我想使用 Eigen 矩阵。

公式为:

    [ xScale   0                 0                        0               ]
P = [   0    yScale              0                        0               ]
    [   0      0    -(zFar+zNear)/(zFar-zNear) -2*zNear*zFar/(zFar-zNear) ]
    [   0      0                -1                        0               ]

在哪里:

yScale = cot(fovY/2)
xScale = yScale/aspectRatio

由于公式是列优先且 c 数组定义为行优先,因此您将定义一个float[16]矩阵:

float P[16] = {
  xScale, 0, 0, 0,
  0, yScale, 0, 0,
  0, 0, -(zFar+zNear)/(zFar-zNear), -1
  0, 0, -2*zNear*zFar/(zFar-zNear), 0
};

那么我将如何使用 Eigen 创建这样的矩阵呢?我会使用一个Eigen::Affine3f还是一个Eigen::Matrix4f?查看文档 我不清楚如何设置单个单元格值。

4

2 回答 2

5

在您的情况下,最简单的是使用逗号初始化语法:

Eigen::Matrix4f pmat;
pmat << xScale, 0, 0, 0,
        0, yScale, 0, 0,
        0, 0, -(zFar+zNear)/(zFar-zNear), -1,
        0, 0, -2*zNear*zFar/(zFar-zNear), 0;
于 2013-02-20T08:17:43.487 回答
1

可以简单地使用括号来设置单个单元格值,例如 Matrix(0,0) = xScale; .

于 2013-02-20T03:25:50.010 回答