投影矩阵实施

时间:2014-12-08 17:52:14

标签: c++ opengl math matrix projection

我正在尝试从头开始构建自己的Rasteriser / Graphics管道(模仿OpenGL),我在实现工作透视投影矩阵时遇到了问题。这是我目前的尝试:

template<typename T>
Matrix<T,4,4> Perspective(T fov,T aspect, T near, T far)
{
    T mat00 = 1 / (aspect*tan(0.5f*fov));
    T mat11 = 1 / tan(0.5f*fov);
    T mat22 = (-near-far)/(near-far);
    T mat32 = (2*near*far)/(near-far);
    T data[] = 
    {
        mat00,     0,     0,    0,
        0    , mat11,     0,    0,
        0    ,     0, mat22,mat32,
        0    ,     0,     1,    0
    };
    return Matrix<T,4,4>(data);
}

然后将其传递给顶点处理,执行以下操作:

    printf("Vertex inital:");vert.Print();
    vert = vert* m_ModelMatrix;

    printf("Vertex model:");vert.Print();
    vert = vert* m_ProjectionMatrix;

    printf("Vertex projection:");vert.Print();

其输出是(对于随机选择的顶点):

Vertex inital:(1.000000,0.000000,-1.000000,1.000000)
Vertex model:(-1.900000,-2.300000,2.599999,1.000000)
Vertex projection:(-3.669604,-5.552692,2.405004,2.599999)

上面的顶点对应于此三角形中的一个顶点: enter image description here

我的问题是投影矩阵似乎完全错误。当我增加 Z平移时,三角形朝向右上角角对角移动,同时显得更小,当我减少 Z值时三角形移动对角线朝向左下角角,同时显得更大。还有其他人遇到过这个问题吗?

供参考,我实现了vector *矩阵运算:

template<typename T,unsigned int length>
Vector<T,length> Vector<T,length>::operator* (const Matrix<T,length,length> & matrix) const
{
    T temp[length];
    memset(temp,0,length*sizeof(T));
    const T * matrixData = matrix.GetData();
    //For each row in the matrix & in the returned vector...
    for(unsigned int iRow = 0; iRow < length; ++iRow)
    {
        //For each column in this vector & matrix...
        for(unsigned int iColumn = 0; iColumn < length; ++iColumn)
        {
            temp[iRow] += m_Data[iColumn]*matrixData[iRow*length + iColumn];
        }
    }
    return Vector<T,length>(temp);
}

1 个答案:

答案 0 :(得分:1)

所以我经过一段时间的休息后回到了这个项目,我意识到我的投影划分(aka / w)只是划分了xyz坐标。因此,当我应用屏幕空间矩阵时,翻译列乘以大于一的&#39;当Z减小时,W值导致三角形移动到右上角。