You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

游戏开发中正方形区域内旋转纹理图像的缩放问题

解决非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

火山引擎 最新活动