在着色器中的二维图像矩阵上旋转 Z 轴

rotate Z axis on 2d image's matrix in shader

我正在尝试在顶点着色器中旋转二维图像的矩阵。

我希望二维图像围绕我认为的 z 轴旋转。

但是我得到的收盘价是:

这是我在着色器中应用平移和缩放的矩阵:

mat4 worldPosTrans = mat4(vec4(scale.x * cos(rotateZ), 0, 0, 0),
                          vec4(0, scale.y, 0, 0),
                          vec4(0, 0, scale.z, 0),
                          vec4(translation, 1));

这是本应旋转所有内容的版本略有改动:

mat4 worldPosTrans = mat4(vec4(scale.x * cos(rotateZ), -sin(rotateZ), 0, 0),
                          vec4(sin(rotateZ), scale.y * cos(rotateZ), 0, 0),
                          vec4(0, 0, scale.z, 0),
                          vec4(translation, 1));

这是我的完整顶点着色器:

precision mediump float;

attribute vec3 vertPosition;
attribute vec3 vertColor;
attribute vec2 aTextureCoord;
varying vec3 fragColor;
varying highp vec2 vTextureCoord;

varying highp vec2 vTextureCoordBg;
uniform vec2 uvOffsetBg;
uniform vec2 uvScaleBg;

uniform mat4 uPMatrix;
uniform mat4 uMVMatrix;

uniform vec2 uvOffset;
uniform vec2 uvScale;

uniform vec3 translation;
uniform vec3 scale;
uniform float rotateZ;

void main()
{
    fragColor = vertColor;

    vTextureCoord =  (vec4(aTextureCoord, 0, 1)).xy * uvScale + uvOffset;
    vTextureCoordBg = (vec4(aTextureCoord, 0, 1)).xy * uvScaleBg + uvOffsetBg;

    mat4 worldPosTrans = mat4(
        vec4(scale.x * cos(rotateZ), 0, 0, 0),
        vec4(0, scale.y, 0, 0),
        vec4(0, 0, scale.z, 0),
        vec4(translation, 1));

    gl_Position = (uPMatrix * worldPosTrans) * vec4(vertPosition.x, vertPosition.y, vertPosition.z, 1.0);
}

编辑:

Rabbid76 在评论中解决了我的问题。

GLSL 中的 4*4 变换矩阵如下所示:

mat4 m44 = mat4(
    vec4( Xx, Xy, Xz, 0.0),
    vec4( Yx, Xy, Yz, 0.0),
    vec4( Zx  Zy  Zz, 0.0),
    vec4( Tx, Ty, Tz, 1.0) );

一般来说,围绕Z轴的旋转矩阵是这样设置的:

float angle;
mat4  rotation = mat4(
    vec4( cos(angle), -sin(angle), 0.0,  0.0 ),
    vec4( sin(angle), cos(angle),  0.0,  0.0 ),
    vec4( 0.0,        0.0,         1.0,  0.0 ),
    vec4( 0.0,        0.0,         0.0,  1.0 ) ); 

另见 Rotation matrix


这意味着您必须像这样设置 worldPosTrans 矩阵:

mat4 worldPosTrans = mat4( 
    vec4( scale.x * cos(rotateZ), scale.x * -sin(rotateZ), 0.0,     0.0), 
    vec4( scale.y * sin(rotateZ), scale.y *  cos(rotateZ), 0.0,     0.0),
    vec4( 0.0,                    0.0,                     scale.z, 0.0),
    vec4( translation.xyz,                                          1.0)
);