C++ 我的简单c+的一个字段+;不';不要像别人一样改变

C++ 我的简单c+的一个字段+;不';不要像别人一样改变,c++,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

所以,我有这个:

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\u矩阵\u向量(m,v)
v2的
x
y
z
是乘法的正确结果,但
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
get作为乘法的结果,如上所示
v1
01
,因为我没有更改它
v2
应该是
-441 224 1452 1463
,但它变成了
-441 224 1452 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.x
v.y
v.z
总是设置为
0.0
,就像您指出的那样。

我的问题是在添加
w
时没有正确调整向量3f。
=
不应该只传递引用,因此向量3f有以下功能:

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;
}

我花了两天的时间试图找出我的程序有什么问题,然后花了两个多小时试图找出为什么
w
没有仅仅为了找到这个而改变。我很抱歉用我的愚蠢来打扰这里的人们。

这不是应该的吗?你在使用什么输入?很难说它会如何转变。除非你试图在3D空间中平移一个对象,否则我不会期望向量的
w
参数改变……如果
m.m[15]==1
v.w==1
,那么
result.w==1
。不管你把结果向量传递回函数多少次,结果都是1,我想是时候给我们展示这个矩阵了。换句话说,你的呢?你是说你的m.m[3],[7],[11]和[15]的值导致w不是1。并在调试器结果中相应地设置.w,但返回时v2没有预期的w值?如果是这样的话,肯定有一些代码丢失了,因为粘贴的内容看起来应该可以工作。这对您能够确定问题的根源很好。