【问题标题】:How to I modify one axis of a rotation matrix?如何修改旋转矩阵的一个轴?
【发布时间】:2016-06-19 15:37:34
【问题描述】:

我目前正在为游戏引擎创建广告牌着色器,我想在此着色器中重置四边形的旋转。我正在用 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 轴旋转。有人知道如何仅在一个轴上重置矩阵的旋转吗?

【问题讨论】:

    标签: opengl matrix rotation


    【解决方案1】:

    这可能会有所帮助。解决方案使用求解出的旋转矩阵,但移植到 GLSL 除外。旋转矩阵有许多版本,具体取决于您是否要回收三角函数(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/

    【讨论】:

    • 感谢您的回答,但是您知道如何将围绕y轴的欧拉角设置为0吗?因为这就是我要找的:/
    • @RagingRabbit:你能不能只乘以 y 轴的倒数来撤消特定的旋转?
    • 不,我只有变换矩阵,所以在所有轴上旋转。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多