旋转纹理时如何消除失真
Posted
技术标签:
【中文标题】旋转纹理时如何消除失真【英文标题】:How to eliminate distortion when rotating a texture 【发布时间】:2015-11-25 08:34:30 【问题描述】:我的问题的背景如下: 我画了一个简单的纹理映射矩形。 矩形始终与纹理具有相同的方面。 因为我只是在角落使用纹理坐标 (0,0)、(0,1)、(1,0)、(1,1) 来获得完整的纹理映射。 现在我已经实现了一个功能,通过改变 OpenGL 纹理矩阵来旋转矩形上的纹理。
通过简单地旋转纹理坐标,我会得到纹理重复或包裹伪影,因为旋转的纹理坐标有时会超出有效范围 [0, 1]。 我已经解决了这个问题。我计算了一个比例因子,以确保可见的纹理切口始终处于正确的间隔(放大纹理)。
剩下的一个可能很简单的问题如下。 由于纹理空间在 u 和 v 轴上始终为 [0,1](与真实纹理方面无关),因此在旋转纹理时会出现纹理失真。
您能帮我计算一下如何计算纹理坐标的比例因子(x 和 y 可能是两个),以根据旋转角度和纹理方面(宽度和高度)来纠正这种失真
感谢和最好的问候 塞巴斯蒂安
【问题讨论】:
我会搜索纹理旋转和/或收缩的通用算法。 没有人可以帮助我吗?问题不是很清楚吗?我应该更详细地解释一下吗 你有没有想过这个问题?您是否有任何示例代码可以让您接近您想要实现的目标? 【参考方案1】:让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 ]
【讨论】:
以上是关于旋转纹理时如何消除失真的主要内容,如果未能解决你的问题,请参考以下文章