Matrix 如何更正矩阵';当纵横比不是1:1时旋转时s缩放

Matrix 如何更正矩阵';当纵横比不是1:1时旋转时s缩放,matrix,rotation,webgl,coordinate-transformation,Matrix,Rotation,Webgl,Coordinate Transformation,我有一个旋转矩阵,上面有纹理。当正交场景的纵横比为1:1(如600px和600px)时,它会完美地旋转。但是如果我把高度增加到1200,我会遇到一些问题。看起来好像矩阵的水平轴被缩放,就像它没有旋转一样 假设我有一个600x1200的sscene,我的矩阵是30x30。如果矩阵没有旋转,它的x刻度应该是0.05*600,也就是30px。如果我把矩阵旋转90度,它的x刻度应该是0.025*1200,也就是30px。但是我没有任何补偿,矩阵的比例总是一样的,好像它没有被旋转 我该如何补偿呢 以下是

我有一个旋转矩阵,上面有纹理。当正交场景的纵横比为1:1(如600px和600px)时,它会完美地旋转。但是如果我把高度增加到1200,我会遇到一些问题。看起来好像矩阵的水平轴被缩放,就像它没有旋转一样

假设我有一个600x1200的sscene,我的矩阵是30x30。如果矩阵没有旋转,它的x刻度应该是0.05*600,也就是30px。如果我把矩阵旋转90度,它的x刻度应该是0.025*1200,也就是30px。但是我没有任何补偿,矩阵的比例总是一样的,好像它没有被旋转

我该如何补偿呢

以下是我的顶点着色器代码:

void main()
{   

fragColor = vertColor;

vTextureCoord = (vec4(aTextureCoord.x, aTextureCoord.y, 0.0, 1.0)).xy * uvScale + uvOffset;
vTextureCoordBg = (vec4(aTextureCoord, 0.0, 1.0)).xy * uvScaleBg + uvOffsetBg;


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.x,         translation.y,          translation.z,  1.0));



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

}

当角度接近90度和270度时,我尝试使用Math.sin减小x比例,但没有达到预期效果。

通常,纵横比被编码到投影矩阵中。投影矩阵是应用于顶点坐标的最后一个变换

如果要在顶点着色器中应用纵横比,其工作原理如下:

方面矩阵:

float aspect = width / height;

mat4 aspect_mat = mat4(
    vec4(1.0/aspect, 0.0, 0.0, 0.0), 
    vec4(0.0,        1.0, 0.0, 0.0), 
    vec4(0.0,        0.0, 1.0, 0.0), 
    vec4(0.0,        0.0, 0.0, 1.0)); 

mat4 model_mat = 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.x,         translation.y,          translation.z,  1.0));

mat4 worldPosTrans = aspect_mat * model_mat;
这导致:

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