了解GLM 4x4矩阵功能

时间:2015-01-09 12:29:58

标签: c++ math matrix glm-math

我无法理解GLM Matrix函数的某个元素,同时尝试复制它的一些数学运算来完成我的Matrix4类的赋值。采用此旋转功能。

    tmat4x4<T, P> const & m,
    T angle,
    tvec3<T, P> const & v

    T const a = angle;
    T const c = cos(a);
    T const s = sin(a);

    tvec3<T, P> axis(normalize(v));
    tvec3<T, P> temp((T(1) - c) * axis);

    tmat4x4<T, P> Rotate(uninitialize);
    Rotate[0][0] = c + temp[0] * axis[0];
    Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];
    Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];

    Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
    Rotate[1][1] = c + temp[1] * axis[1];
    Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];

    Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
    Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
    Rotate[2][2] = c + temp[2] * axis[2];

    tmat4x4<T, P> Result(uninitialize);
    Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
    Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];
    Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];
    Result[3] = m[3];

或翻译功能(v是向量)

    tmat4x4<T, P> const & m,
    tvec3<T, P> const & v

    Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];

我无法理解的部分是矩阵Result [1]或m [0]访问的哪一部分。结果[1] =结果[1] [1]?它用在很多功能中,这是我遇到麻烦的这些功能的最后一部分。

他们如何处理使用单个数字来访问2D数组中的元素,以及该单个数字访问的元素是什么?

2 个答案:

答案 0 :(得分:1)

定义模板tmat4x4<T,P>的代码,其类型为T,精确度为Pthat is available here,可以回答您的问题。

正如您可以看到第60行,tmat4x4的实际数据内容被定义为4个col_type元素的数组,并访问m[i](定义的第96行为返回{{ 1}})returns the full i-th column

col_type &col_type的类型定义,其代码is available here以及defines a [] access operator返回类型tvec4<T,P>,因此当您编写{{1}时你说“给我一列a,其中就是元素b”。

T &defines a binary * operator,因此有必要采用整个向量并将其乘以m[a][b]类型的标量,即multiplying each element of the vector by that scalar

因此,为了回答您的问题,tvec4<T,P>不是U而是Result[1](即使这不是正确的C ++)。

答案 1 :(得分:0)

有两个名为tmat4x4<T, P>::operator[]的函数。一个返回类型为tmat4x4<T>::col_type&,另一个返回类型为tmat4x4<T>::col_type const&。所以m[1]不表示矩阵的单个元素;相反,它表示矩阵的整个列(四个元素),您可以对其执行数学列向量运算。