旋转纹理时如何消除失真
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 可能是两个)以根据旋转角度和纹理方面(宽度和高度)校正这种失真
谢谢和最诚挚的问候
塞巴斯蒂安
让 w
和 h
成为矩形的宽度和高度(或纹理,这里只有纵横比 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 ]
我的问题背景如下:
我画了一个简单的纹理贴图矩形。
矩形始终与纹理具有相同的外观。
因为我只是在角落使用纹理坐标 (0,0), (0,1), (1,0), (1,1) 来获得完整的纹理映射。
现在我已经实现了一个功能,通过改变 OpenGL 纹理矩阵来旋转矩形上的纹理。
通过简单地旋转纹理坐标,我会得到纹理重复或环绕的伪影,因为旋转的纹理坐标有时会超出有效范围 [0, 1]。
我已经解决了这个问题。我计算比例因子以确保可见纹理切口始终处于正确的间隔(放大纹理)。
剩下的一个可能很简单的问题如下。
由于纹理 space 在 u 轴和 v 轴上始终为 [0,1](独立于真实纹理方面),因此在旋转纹理时我会出现纹理失真。
你能帮我计算纹理坐标的比例因子(对于 x 和 y 可能是两个)以根据旋转角度和纹理方面(宽度和高度)校正这种失真
谢谢和最诚挚的问候 塞巴斯蒂安
让 w
和 h
成为矩形的宽度和高度(或纹理,这里只有纵横比 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 ]