旋转纹理时如何消除失真

How to eliminate distortion when rotating a texture

我的问题背景如下:
我画了一个简单的纹理贴图矩形。
矩形始终与纹理具有相同的外观。
因为我只是在角落使用纹理坐标 (0,0), (0,1), (1,0), (1,1) 来获得完整的纹理映射。
现在我已经实现了一个功能,通过改变 OpenGL 纹理矩阵来旋转矩形上的纹理。

通过简单地旋转纹理坐标,我会得到纹理重复或环绕的伪影,因为旋转的纹理坐标有时会超出有效范围 [0, 1]。
我已经解决了这个问题。我计算比例因子以确保可见纹理切口始终处于正确的间隔(放大纹理)。

剩下的一个可能很简单的问题如下。
由于纹理 space 在 u 轴和 v 轴上始终为 [0,1](独立于真实纹理方面),因此在旋转纹理时我会出现纹理失真。

你能帮我计算纹理坐标的比例因子(对于 x 和 y 可能是两个)以根据旋转角度和纹理方面(宽度和高度)校正这种失真

谢谢和最诚挚的问候 塞巴斯蒂安

wh 成为矩形的宽度和高度(或纹理,这里只有纵横比 w:h 重要)。然后我们组成总的纹理变换如下。

首先我们将uv坐标从(0,0)..(1,1)映射到(0,0)..(w,h):

[ w 0 0 ]
[ 0 h 0 ]
[ 0 0 1 ]

接下来,假设您想要围绕纹理 center 旋转和缩放,我们将其移动一半大小,以便 (0,0) 映射到 (-w/2,-h/2), (.5,.5) 到 (0,0), 和 (1,1) 到 (w/2,h/2):

[  1   0 -w/2 ]   [ w 0 0 ]   [  w   0 -w/2 ]
[  0   1 -h/2 ] x [ 0 h 0 ] = [  0   h -h/2 ]
[  0   0   1  ]   [ 0 0 1 ]   [  0   0   1  ]

然后我们从左侧应用缩放 S 和旋转 R,并通过应用上述变换的逆向转换回纹理 space。净变换由下式给出:

[ 1/w  0  1/2 ]     [  w   0 -w/2 ]
[  0  1/h 1/2 ] R S [  0   h -h/2 ]
[  0   0   1  ]     [  0   0   1  ]