在glm中使用什么函数来获得与此函数相同的结果

时间:2013-12-14 15:54:47

标签: opengl glm-math

有一个函数GLRotation

inline const mat4 GLRotation(float x, float y, float z)
{
    const float cx = cosf(x * math_radians), sx = sinf(x * math_radians),
                cy = cosf(y * math_radians), sy = sinf(y * math_radians),
                cz = cosf(z * math_radians), sz = sinf(z * math_radians);

    // rotationX * rotationY * rotationZ
    return mat4(cy * cz, -cy * sz, sy, 0,
                cx * sz + sx * cz * sy, cx * cz - sx * sy * sz, -cy * sx, 0,
                sx * sz - cx * cz * sy, cz * sx + cx * sy * sz, cx * cy, 0,
                0, 0, 0, 1);
}

使用可以像GLRotation(v.rotation)那样调用v.rotation - vector(x,y,z)。

我需要在glm(库)中使用哪些函数来获得相同的结果?

2 个答案:

答案 0 :(得分:2)

你可以使用以下内容来使用glm获得旋转,虽然它需要更多的输入:

glm::rotate(ModelViewProjectionMatrix4x4Here,angleToRotateHere,directionToRotate)

遵循the glm api page

中列出的格式
rotate (detail::tmat4x4< T > const &m, T angle, T x, T y, T z)

所以你可以传递你需要操作的矩阵,旋转的角度和旋转的矢量。

glm::rotate(yourMatrixHere, angle_in_degrees, glm::vec3(x, y, z)); // where x, y, z is axis of rotation (e.g. 0 1 0 is rotate around the y-axis)

如果确切的函数定义与您需要的不匹配,则同一网页上的其他函数定义会以不同的方式接受参数。

如果您需要更多信息,请与我们联系:)

答案 1 :(得分:1)

您的函数GLRotation()指定在每个主轴上以弧度旋转的角度。另一方面,glm::rotate(angle, axis)指定围绕提供的轴的旋转。因此,严格来说,您可以按如下方式定义GLRotation

inline mat4 
GLRotation(float x, float y, float z)
{
    return 
        glm::rotate(x, 1, 0, 0) * 
        glm::rotate(y, 0, 1, 0) * 
        glm::rotate(z, 0, 0, 1);
}

虽然我不建议这样做,因为用这种方式描述旋转会导致Gimbal lock(当你在一个轴上旋转时它会与另一个轴对齐,失去一个自由度)。

最好调查Axis-Angle representations轮换,这是glm::rotate使用的内容。它们不易受万向节锁定的影响,并且可以表示围绕穿过原点的轴的任何3D旋转。