制作 3D 图形引擎,我的平移矩阵不适用于等于 0 的位置
Making a 3D graphics engine, my Translation matrix doesn't work for positions equal to 0
嗨,我正在为今晚的作业制作一个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、0、0、0>)不能使用矩阵乘法进行转换,因此在这种情况下不应将其视为位置。事实上,这样的向量甚至不能代表一个方向,因为它的长度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
相关文章:
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字
- 选择排序C++(已修改)并非适用于所有情况
- 无法让"std::enable_if"适用于无作用域枚举
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 确定夏令时是否适用于特定日期
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- 使用程序集嵌入数据时"Undefined reference"错误,使用适用于窗口的 mingw-w64 编译(COFF 而不是 ELF)
- 为什么 std::vector 适用于类定义中的不完整类型?
- 为什么哈希<常量字符*>适用于字符串而不是字符串变量?
- Lambda适用于最新的Visual Studio,但在其他地方不起作用
- 我该如何文档文档以使文档适用于类成员而不是匿名类型
- 计算 c# 中二进制文件符号的频率不起作用,但适用于等效的 c++ 代码
- 为什么 fstream.open(文件名) 适用于文字而不是生成的字符串?
- 模板重载和 SFINAE 仅适用于函数而不是类
- 为什么链接器不抱怨多个函数定义(仅适用于模板化函数)
- 我可以使用' == '来比较两个向量吗?我试过了,似乎工作正常。但我不知道它是否适用于更复杂的情况
- 延长临时的生命周期,适用于块范围的聚合,但不是通过"新";为什么?