旋转纹理时如何消除失真

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】:

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  ]

【讨论】:

以上是关于旋转纹理时如何消除失真的主要内容,如果未能解决你的问题,请参考以下文章

如何帮助编译器消除循环和数组?

如何让 SKSpriteNode 不旋转纹理

如何更正我的旋转平台脚本并修复 Unity 中的错误纹理?

如何使用 OpenCV 从图像中去除径向失真?

three.js中场景模糊纹理失真的问题

bitmap图片用matrix旋转会失真,怎么同时旋转而不失真!