游戏开发中正方形区域内旋转纹理图像的缩放问题
解决非1:1纹理旋转后的缩放适配问题
嘿,这个问题我在做2D纹理映射的时候踩过坑,核心就是要先对齐纹理的宽高比,再处理旋转变换,这样才能保证旋转后的纹理在正方形区域里显示比例正确,不会拉伸变形,同时利用无限重复的特性填满整个区域。
下面一步步给你拆解方案:
1. 先明确核心参数
首先定义几个关键变量:
- 正方形的UV坐标范围:
[0, 1] × [0, 1](和你描述的一致) - 纹理的宽高比:
aspect = 纹理宽度 / 纹理高度(你的例子里aspect = 4) - 旋转角度:
θ(用弧度计算更方便,比如90度就是π/2)
2. 正确的坐标变换顺序
直接旋转正方形的UV坐标再采样纹理会导致拉伸,因为纹理的宽高比和正方形不一致。正确的流程是:
步骤1:将正方形UV映射到纹理比例空间
先把正方形的UV坐标按纹理的宽高比进行缩放,让坐标空间和纹理实际比例对齐:
u_texture = u * aspect v_texture = v
比如你的4:1纹理,这个步骤会把原来的1x1正方形UV,转换成4x1的纹理空间坐标,和纹理的实际比例匹配。
步骤2:对纹理空间坐标执行旋转变换
用标准的2D旋转变换公式处理缩放后的坐标:
u_rot = u_texture * cosθ - v_texture * sinθ v_rot = u_texture * sinθ + v_texture * cosθ
这个变换会让纹理空间里的“矩形”(原来的正方形缩放后的结果)旋转θ角度。
步骤3:用旋转后的坐标采样纹理
因为你的纹理支持无限重复包裹,直接用(u_rot, v_rot)作为纹理坐标采样即可。超出纹理原始范围的部分会自动重复填充,最终在正方形区域里显示的就是旋转后比例正确、无缝重复的纹理。
3. 举个实际例子验证(aspect=4,θ=90度)
- 原正方形UV的(0,0)经过步骤1变成(0,0),步骤2旋转90度后得到(0, 0)
- 原正方形UV的(1,0)经过步骤1变成(4,0),步骤2旋转后得到(0, 4)
- 采样时,
v_rot=4会让纹理在y方向重复4次,正好对应原纹理旋转90度后的1:4比例,在正方形里填充后不会有拉伸。
4. 额外调整:如果需要控制重复密度
如果你想调整纹理在正方形里的重复次数,只需要在步骤1里给缩放因子加一个倍率,比如想让x方向重复2次而不是4次,就改成u_texture = u * (aspect / 2),这样旋转后的纹理重复密度会相应变化,比例依然保持正确。
内容的提问来源于stack exchange,提问作者Steven2163712




