所以,我有这个:
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);
x
,y
和z
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
得到如上所示的乘法结果。 v1
是0 0 0 1
,因为我没有改变它。 v2
应该是-441 224 1452 1463
,但它会变为-441 224 1452 1
。
答案 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.x
,v.y
和v.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以我的愚蠢来打扰这里的人。