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值?如果是这样的话,肯定有一些代码丢失了,因为粘贴的内容看起来应该可以工作。这对您能够确定问题的根源很好。