有一个函数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
(库)中使用哪些函数来获得相同的结果?
答案 0 :(得分:2)
你可以使用以下内容来使用glm获得旋转,虽然它需要更多的输入:
glm::rotate(ModelViewProjectionMatrix4x4Here,angleToRotateHere,directionToRotate)
中列出的格式
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旋转。