我的问题的背景如下:
我画了一个简单的纹理映射矩形
矩形与纹理始终具有相同的外观
因为我只是在角落使用纹理坐标(0,0),(0,1),(1,0),(1,1)来获得完整的纹理映射。
现在我已经实现了一个功能,通过改变OpenGL纹理矩阵来旋转矩形上的纹理。
通过简单地旋转纹理坐标,我将得到纹理重复或包裹瑕疵,因为旋转的纹理坐标有时会超出有效范围[0,1]。 我已经解决了这个问题。我计算一个比例因子,以确保可见纹理切口始终处于正确的间隔(放大纹理)。
剩下的一个简单问题如下 因为纹理空间在u和v轴上始终为[0,1](与真实纹理方面无关),因此在旋转纹理时会出现纹理失真。
你能帮我解决一下如何计算纹理坐标的比例因子(对于x和y可能是两个)来根据旋转角度和纹理方面(宽度和高度)来校正这种失真
谢谢和最诚挚的问候 塞巴斯蒂安
答案 0 :(得分:0)
让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
,并通过应用上述转换的逆转换回纹理空间。净转换由下式给出:
[ 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 ]