放弃cglm自研数学库时mat4平移函数异常,旋转缩放功能正常如何解决
问题分析与修复方案
你遇到的平移失效问题核心是两个常见的矩阵实现不匹配问题,和你定义的二维数组存储顺序、矩阵乘法顺序直接相关:
问题1:平移分量存储位置错误
你当前将平移值写入了translation_mat[0][3]、translation_mat[1][3]、translation_mat[2][3],这个是行主序矩阵的平移分量存储位置。
而绝大多数图形场景下的矩阵实现(包括你之前用的cglm库默认)采用的是列主序存储,和OpenGL/WebGL等API兼容,这种场景下4x4矩阵的平移分量需要放在第四列的前三个位置,对应你定义的m4[4][4]类型,索引应该是[3][0]、[3][1]、[3][2]。
既然你的旋转、缩放函数都可以正常运行,说明你的基础矩阵逻辑是按照列主序实现的,平移分量的位置写反了自然会失效。
问题2:矩阵乘法顺序错误
你当前的乘法逻辑是m4_mul(model, translation_mat, dest),对应的变换顺序是:先应用平移,再应用原有model矩阵里的旋转、缩放,这会导致平移量被后续的旋转缩放改变,出现平移方向偏移、距离不对的问题。
正常的模型变换顺序是先做缩放、旋转,最后做平移,所以乘法顺序应该调换为平移矩阵在前,原有model矩阵在后。
修复后代码
void m4_translate(m4 model, v2 v, float z_index, m4 dest){ m4 translation_mat; m4_identity(translation_mat, 1.0f); // 列主序下平移分量放在第四列前三个元素 translation_mat[3][0] = v.x; translation_mat[3][1] = v.y; translation_mat[3][2] = z_index; // 变换顺序:先应用原有model的旋转缩放,再应用平移 m4_mul(translation_mat, model, dest); }
补充验证
如果你确认自己的矩阵实现是行主序,只需要把乘法顺序保留原有写法,同时检查你的m4_mul函数是不是符合行主序的乘法逻辑即可。
内容的提问来源于stack exchange,提问作者NongusStudios
相关产品推荐
相关产品推荐

