制作 3D 图形引擎,我的平移矩阵不适用于等于 0 的位置

Making a 3D graphics engine, my Translation matrix doesn't work for positions equal to 0

本文关键字:适用于 不适用 位置 引擎 图形 3D 我的 制作      更新时间:2023-10-16

嗨,我正在为今晚的作业制作一个3D图形引擎,除了我从。obj文件中加载一个立方体模型外,它目前进展顺利,位置从0开始。

我的变换矩阵适用于不等于0的数。我的意思是,如果X = 0我尝试在X轴上平移10,它返回0

矩阵*向量:

Vec4 Mat4::operator*(const Vec4& v) const
{
    Vec4 tmp(0, 0, 0, 0, 255, 255, 255, 255);
    tmp.x = (this->data[0] * v.x) + (this->data[4] * v.y) + (this->data[8] * v.z) + (this->data[12] * v.w);
    tmp.y = (this->data[1] * v.x) + (this->data[5] * v.y) + (this->data[9] * v.z) + (this->data[13] * v.w);
    tmp.z = (this->data[2] * v.x) + (this->data[6] * v.y) + (this->data[10] * v.z) + (this->data[14] * v.w);
    tmp.w = (this->data[3] * v.x) + (this->data[7] * v.y) + (this->data[11] * v.z) + (this->data[15] * v.w);
    return tmp;
}

翻译矩阵:

Mat4 Mat4::translate(float x, float y, float z)
{
    Mat4 tmp;
    tmp.data[12] = x;
    tmp.data[13] = y;
    tmp.data[14] = z;
    return tmp;
}

Mat4类默认是单位矩阵

现在太晚了,但是……了解以下内容可能会有所帮助:

严格等于0.0的向量(例如<<strong>0、000>)不能使用矩阵乘法进行转换,因此在这种情况下不应将其视为位置。事实上,这样的向量甚至不能代表一个方向,因为它的长度0。它只是;不能旋转或平移的向量没有很多用途。

可以0.0来旋转向量,但是W 的值0.0会阻止平移

通常你想要一个W坐标1.0对于空间()例如:位置)向量和0.0表示方向(例如:正常)。

如果您想更好地理解这一点,您需要考虑如何设置您的4x4矩阵。前3行或列(取决于您使用的约定)存储旋转,第4行存储翻译。

考虑当您将矩阵和向量相乘时如何应用平移:

x = ... + (this->data[12] * v.w);
y = ... + (this->data[13] * v.w);
z = ... + (this->data[14] * v.w);
w = ... + (this->data[15] * v.w);

如果v.w 0.0,那么对于所有坐标的翻译结果为0.0

相关文章: