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