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

如何为程序化挤出的圆柱实现正确的复杂UV映射?

圆柱侧面规整棋盘格UV的程序化映射方法

要解决这个问题,核心是把圆柱侧面的顶点坐标转换成柱面坐标系下的UV映射,而非直接沿用顶面的平面UV坐标。以下是具体实现步骤:

1. 转换顶点为柱面坐标

对于每个侧面顶点,先计算它在圆柱横截面(垂直于高度轴的平面)上的投影极坐标:

  • 假设圆柱高度轴为Y轴(可根据你的坐标系调整),顶点坐标为(x, y, z),那么绕Y轴的角度θ = atan2(z, x);如果顶面是X-Y平面,就改成atan2(y, x)。

2. 计算圆周方向的U坐标

把角度θ归一化到[0, 1]区间,对应棋盘格的横向重复:

if theta < 0:
    theta += 2 * PI
u = theta / (2 * PI)

绕圆柱一周,U从0平滑过渡到1,刚好匹配棋盘格的横向周期,不会出现扭曲。如果要对齐顶面的棋盘格原点,只要保证顶面的UV原点(比如(1,0))对应θ=0的位置即可。

3. 计算高度方向的V坐标

取顶点的高度值(比如Y坐标),归一化到[0,1]区间:

v = (y - y_bottom) / (y_top - y_bottom)

其中y_bottom是圆柱底部的高度,y_top是顶部高度。这样从底部到顶部,V从0到1,对应棋盘格的纵向周期。

4. 兼容顶面/底面的UV连续性

如果需要顶面的棋盘格和侧面无缝衔接,可以把顶面顶点的UV也用同样的柱面逻辑转换:顶面顶点的V固定为1(因为是顶部高度),U用顶面坐标计算的θ/(2π);底面顶点的V固定为0,U同理。这样侧面和顶/底面的UV在边缘处完全连续,不会出现接缝。

伪代码示例

// 假设圆柱高度轴为Y轴,顶面Y=1,底面Y=0,半径1
for each vertex in cylinder_vertices:
    x = vertex.x
    y = vertex.y
    z = vertex.z

    // 计算圆周角度
    theta = atan2(z, x)
    if theta < 0:
        theta += 2 * math.pi
    u = theta / (2 * math.pi)

    // 计算高度V
    v = y  // 此处Y范围正好是0-1,直接使用;范围不同则做归一化

    vertex.uv = (u, v)

为什么之前的方法失效?

  • 直接沿用顶面UV到底部:顶面的x/y是平面坐标,和侧面柱面的圆周/高度维度不匹配,拉伸时自然会导致纹理扭曲。
  • 方向向量调整底部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.29 14:17:33