我简单的c ++的一个领域并没有像其他领域那样发生变化

时间:2014-04-15 22:20:43

标签: c++

所以,我有这个:

class vector3f
{
public:

    float x;
    float y;
    float z;
    float w;

    vector3f(void)
    {
        x = 0.0f;
        y = 0.0f;
        z = 0.0f;
        w = 1.0f;
    }
};

此处还有其他功能,但我不会将它们用于导致问题的部分。 我有这个功能:

vector3f mult_matrix_vector(matrix4x4f m, vector3f v)
{
    vector3f result;
    result.x = m.m[0]*v.x + m.m[4]*v.y + m.m[8]*v.z  + m.m[12]*v.w;
    result.y = m.m[1]*v.x + m.m[5]*v.y + m.m[9]*v.z  + m.m[13]*v.w;
    result.z = m.m[2]*v.x + m.m[6]*v.y + m.m[10]*v.z + m.m[14]*v.w;
    result.w = m.m[3]*v.x + m.m[7]*v.y + m.m[11]*v.z + m.m[15]*v.w;
    return result;
}

函数在齐次坐标上接收矩阵4x4和向量(名称有3因为我之后只需要齐次坐标)。如果我尝试类似:v2 = mult_matrix_vector(m, v); xyz v2是乘法的正确结果,但w是总是1。有谁知道为什么会这样?

编辑:

更详细的例子:

我有一个像这样的矩阵m

1    0    0 -441
0    1    0  224
0    0   -1 1452
0    0   -1 1463

然后这段代码:

matrix4x4f m = mult_matrix(my_projection, my_modelview);
vector3f v, v2;
v2 = mult_matrix_vector(m, v);

m得到如上所示的乘法结果。 v10 0 0 1,因为我没有改变它。 v2应该是-441 224 1452 1463,但它会变为-441 224 1452 1

2 个答案:

答案 0 :(得分:1)

该行

result.w = m.m[3]*v.x + m.m[7]*v.y + m.m[11]*v.z + m.m[15]*v.w;

相当于:

result.w = m.m[15]*v.w;

如果v.xv.yv.z始终设置为0.0,就像您指示的那样。

答案 1 :(得分:0)

我的问题是,在添加w时我没有正确调整vector3f。 =不应该只是传递引用,所以vector3f有这个:

vector3f& vector3f::operator = ( const vector3f &other )
{
    x = other.x;
    y = other.y;
    z = other.z;

    return *this;
}

我修改了其他功能,但忘记了这一功能,因此w的值从未在=操作中传递。正确的是:

vector3f& vector3f::operator = ( const vector3f &other )
{
    x = other.x;
    y = other.y;
    z = other.z;
    w = other.w;

    return *this;
}

我过了2天试图找到我的程序出了什么问题然后超过2个小时试图找出为什么w没有改变只是为了找到这个。 Sory以我的愚蠢来打扰这里的人。