如何在旋转纹理时消除失真

时间:2015-11-25 08:34:31

标签: algorithm opengl texture-mapping

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

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

剩下的一个简单问题如下 因为纹理空间在u和v轴上始终为[0,1](与真实纹理方面无关)​​,因此在旋转纹理时会出现纹理失真。

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

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

1 个答案:

答案 0 :(得分:0)

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,并通过应用上述转换的逆转换回纹理空间。净转换由下式给出:

[ 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  ]