You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将纹理UV坐标转换为单一U坐标以实现纹理对齐?

纹理对齐问题解决方案

核心思路

要让切割后侧面的棋盘格纹理与顶部对齐,关键是保证顶部切割线上所有点的UV,沿切片方向的纹理重复值与侧面墙体的U坐标一一对应。由于纹理是周期性重复的,只需基于切片方向计算统一的U值基准,就能实现对齐。

具体实现步骤

1. 计算统一的U值基准

不需要复杂的矩形相交判断,直接通过UV坐标沿切片方向的投影来计算:

  • 先将切片方向向量(theFacing)归一化,确保方向一致。
  • 对顶部任意UV点,计算其沿归一化切片方向的投影值,这个值就是侧面U坐标的基础。
  • 结合棋盘格的周期(从纹理图看是0.5),对投影值做周期偏移处理,保证黑白格连续对齐:
    float CheckerizeUV(Point theUV, Point theFacing)
    {
        // 归一化切片方向向量
        Point normalizedFacing = theFacing.Normalize();
        // 计算UV沿切片方向的投影值
        float proj = dot(theUV, normalizedFacing);
        // 棋盘格周期为0.5,处理周期偏移保证黑白格对齐
        const float cycle = 0.5f;
        float cycleCount = floor(proj / cycle);
        float unifiedU = fmod(proj, cycle);
        // 奇数周期反转U值,保证棋盘格纹理连续
        if ((int)cycleCount % 2 != 0) {
            unifiedU = cycle - unifiedU;
        }
        return unifiedU;
    }
    

2. 侧面墙体的UV赋值

生成侧面墙体时,每个顶点的UV按如下规则设置:

  • U值:使用上述计算出的unifiedU,确保与顶部对应点的纹理周期完全匹配。
  • V值:从0开始,按墙体高度线性递增(比如墙体高度对应UV的0~height区间,可根据纹理缩放比例调整)。

原代码问题分析

原代码通过矩形边界相交+硬编码0.25偏移的方式计算U值,这种方法依赖UV所在的矩形位置判断,容易因UV的位置误差导致偏移错误;且硬编码的数值不具备通用性,无法保证沿切片方向的纹理周期一致性,这就是纹理错位的根本原因。

补充说明

如果要实现完全无错位的精度,确实需要在每个棋盘格的边界处添加顶点,让切割段与纹理周期完全匹配。但即使暂时不添加顶点,上述投影方法也能保证起点和整体的纹理对齐效果,后续再优化顶点即可。


内容的提问来源于stack exchange,提问作者KiraHoneybee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:53:10