3D单位矩阵以正确设置顶点

时间:2013-09-26 14:08:33

标签: c matrix 3d

我正在玩矩阵,以期在GDI中进行3D转换(为了它的乐趣)。目前我正在检查我从单位矩阵中获得正确的值,给出了四个以正方形排列的顶点的表示。我一直在摸不着为什么它没有给出预期的输出。我做了我的研究,但不知道我在这里做错了什么。

这是我对矩阵的定义。

typedef struct m{
    float _m01, _m05, _m09, _m13;
    float _m02, _m06, _m10, _m14;
    float _m03, _m07, _m11, _m15;
    float _m04, _m08, _m12, _m16;
}mat;

struct m matIdentity(struct m *m1){
   m1->_m01 = 1.0; m1->_m05 = 0.0; m1->_m09 = 0.0; m1->_m13 = 0.0;
   m1->_m02 = 0.0; m1->_m06 = 1.0; m1->_m10 = 0.0; m1->_m14 = 0.0;
   m1->_m03 = 0.0; m1->_m07 = 0.0; m1->_m11 = 1.0; m1->_m15 = 0.0;
   m1->_m04 = 0.0; m1->_m08 = 0.0; m1->_m12 = 0.0; m1->_m16 = 1.0;
}

这里使用

矩阵
 struct m matrix;
 matIdentity(&matrix);

//represent 4 vertices(x,y,z,w);

float square[4][4] = {
        {0.0, 0.0, 0.0, 1.0},
        {0.0, 20.0, 0.0, 1.0},
        {20.0, 20.0, 0.0, 1.0},
        {20.0, 0.0, 0.0, 1.0}
    };

           float result[4][4];

           int i = 0;
           for(i = 0; i < 4; i++){
           result[i][1] = (matrix._m01 * square[i][0]) + (matrix._m05 * square[i][1]) +    (matrix._m09 * square[i][2]) + (matrix._m13 * square[i][3]);
           result[i][2] = (matrix._m02 * square[i][0]) + (matrix._m06 * square[i][1]) + (matrix._m10 * square[i][2]) + (matrix._m14 * square[i][3]);
           result[i][3] = (matrix._m03 * square[i][0]) + (matrix._m07 * square[i][1]) + (matrix._m11 * square[i][2]) + (matrix._m15 * square[i][3]);
           result[i][4] = (matrix._m04 * square[i][0]) + (matrix._m08 * square[i][1]) + (matrix._m12 * square[i][2]) + (matrix._m16 * square[i][3]);
           }


 char strOutput[500];
           sprintf(strOutput,"%f %f %f %f\n %f %f %f %f\n %f %f %f %f\n %f %f %f %f\n ", 
           result[0][0], result[0][1], result[0][2], result[0][3],
           result[1][0], result[1][1], result[1][2], result[1][3],
           result[2][0], result[2][1], result[2][2], result[2][3],
           result[3][0], result[3][1], result[3][2], result[3][3]
           );

我感觉这个问题与使用列主矩阵乘以基于行的顶点表示有关。任何人都可以建议我应该如何做到这一点。

2 个答案:

答案 0 :(得分:2)

  1. 我不明白你为什么不首先使用数组,然后开始使用数组和迭代,最后放弃迭代。请这样的程序只能引起混淆。
  2. 正确的公式为C(i, j)=sigma(A(i, k)*B(k, j), k=1..n),其中C = AB,n为4。 (例如,这一行应该像:result[i][0] = (matrix._m01 * square[0][i]) + (matrix._m02 * square[1][i]) + (matrix._m03 * square[2][i]) + (matrix._m04 * square[3][i]);)写一个简单的嵌套for-iteration来计算这个......
  3. 这不是一个矢量,而是n个矢量......

答案 1 :(得分:0)

这不是矩阵乘法。将矢量乘以矩阵如下:

float mat[4][4];
float vec_in[4];
float vec_out[4];
// todo: initialize values
for (int j = 0; j < 4; ++j)
{
    vec_out[j] = 0.0f;
    for (int i = 0; i < 4; ++i)
    {
        vec_out[j] += vec_in[i] * mat[i][j];
    }
}