《OpenGL超级宝典》中有关缩放矩阵代码困惑
高手们来看看。
我学习OpenGL,使用的是《OpenGL超级宝典》(第四版),看源代码中有关缩放矩阵的代码,有点晕。
为什么两个相同的函数m3dScaleMatrix44实现却不同啊。比如说m3dScaleMatrix44( m, 2.0 )和m3dScaleMatrix44( m, 2.0, 2.0, 2.0 )效果完全不同。
opengl 矩阵
// Scale a matrix (I don't beleive in Scaling matricies ;-)
// Yes, it's faster to loop backwards... These could be
// unrolled... but eh... if you find this is a bottleneck,
// then you should unroll it yourself
……
inline void m3dScaleMatrix44(M3DMatrix44f m, float scale)
{ for(int i = 15; i >=0; i--) m[i] *= scale; }
inline void m3dScaleMatrix44(M3DMatrix44d m, double scale)
{ for(int i = 15; i >=0; i--) m[i] *= scale; }
……
// Scale matrix. Only 4x4 matrices supported
inline void m3dScaleMatrix44(M3DMatrix44f m, float x, float y, float z)
{ m[0] *= x; m[5] *= y; m[10] *= z; }
inline void m3dScaleMatrix44(M3DMatrix44d m, double x, double y, double z)
{ m[0] *= x; m[5] *= y; m[10] *= z; }
[解决办法]
m3dScaleMatrix44(M3DMatrix44* m, * scale) 就是一个简单的矩阵乘数计算啊
M2=M1*a 每个元素都乘以a
m3dScaleMatrix44(M3DMatrix44f m, float x, float y, float z) 这个函数只对对角线的前3个数字做了处理,不知有何用处
[解决办法]
// Scale matrix. Only 4x4 matrices supported
inline void m3dScaleMatrix44(M3DMatrix44f m, float x, float y, float z)
{ m[0] *= x; m[5] *= y; m[10] *= z; }
这个是沿着x,y,z坐标轴进行缩放。
inline void m3dScaleMatrix44(M3DMatrix44f m, float scale)
{ for(int i = 15; i >=0; i--) m[i] *= scale; }
这个应该是沿任意方向进行缩放。
矩阵不一定要是单位矩阵。矩阵式可以级联的,可以是单位矩阵经过旋转的矩阵。