如何修改旋转矩阵的一个轴?

时间:2016-06-19 15:37:34

标签: opengl matrix rotation

我正在为游戏引擎创建一个广告牌着色器,我想在此着色器中重置四边形的旋转。我正在编写GLSL中的着色器,这是顶点着色器:

#version 400 core

layout (location = 0) in vec3 in_position;
layout (location = 1) in vec2 in_texcoords;

out data
{
    vec2 tex_coords;
} vs_out;

uniform mat4 pr_matrix;
uniform mat4 ml_matrix = mat4(1.0);
uniform mat4 vw_matrix = mat4(1.0);

void main()
{
    gl_Position = pr_matrix * vw_matrix * ml_matrix * vec4(in_position, 1.0);
    vs_out.tex_coords = in_texcoords;
}

我知道我可以通过将左上角设置为

来重置模型矩阵的旋转
1 0 0
0 1 0
0 0 1

,但现在我希望四边形能够绕x和z轴旋转,但不能围绕y轴旋转。有人知道如何仅在一个轴上重置矩阵的旋转吗?

1 个答案:

答案 0 :(得分:0)

这可能会有所帮助。解决方案使用解决的旋转矩阵,除了移植到GLSL。根据您是否要回收trig函数(cos / sin),有许多版本的旋转矩阵。由于GFX在SIMD上更好,因此该功能就此编码。

mat4 rotationMatrix(vec3 axis, float angle)
{
    axis = normalize(axis);
    float s = sin(angle);
    float c = cos(angle);
    float oc = 1.0 - c;

    return mat4(oc * axis.x * axis.x + c,           oc * axis.x * axis.y - axis.z * s,  oc * axis.z * axis.x + axis.y * s,  0.0,
                oc * axis.x * axis.y + axis.z * s,  oc * axis.y * axis.y + c,           oc * axis.y * axis.z - axis.x * s,  0.0,
                oc * axis.z * axis.x - axis.y * s,  oc * axis.y * axis.z + axis.x * s,  oc * axis.z * axis.z + c,           0.0,
                0.0,                                0.0,                                0.0,                                1.0);
}

来源:http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/