返回行业情报

UE5材质伪造球形行星表面技术

Faking a Spherical Planet with a Tileable Texture in UE5

UE5技术美术Alina Ledeneva分享一种基于材质的伪球体技术,用平面卡片配合可平铺纹理模拟行星表面。通过世界位置偏移保持卡片面向相机,利用立体投影变换UV制造曲面错觉,并在蓝图与材质间分工处理纹理累积变换,避免制作球形UV贴图。

深度解读

这篇文章最重要的判断是:在UE5里做一颗看起来有体积感、能自由环绕观察的行星,根本不需要球体网格、不需要球形UV、也不需要预先烘焙的球形贴图,只需要一张朝向相机的平面卡片加一套材质里的伪球面投影数学,就能用普通可平铺纹理骗过眼睛——而真正的难点不在投影本身,在于“纹理状态必须随路径累积”这件事,材质做不到,必须把状态机搬到Blueprint里。

投影:用半球立体投影把平面UV“掰弯”

Alina Ledeneva是Kamishibai Interactive的技术美术,这套技术出自他们未发售的单人叙事射击游戏TYBALT(灵感来源列了Destiny、Marathon、Witchfire、SOMA、System Shock)。行星视觉的核心诉求很实际:让美术能用程序化和可平铺纹理直接干活,不必把每张纹理都转成球形贴图、也不必为球形UV布局单独准备每个变体。

具体做法是把卡片UV先重映射到卡片中心周围,当作一个朝向相机的半球面的X、Y坐标,再由这两个坐标反推第三个坐标——也就是该点在半球上应有的深度。得到这个三维半球位置后,做一次立体投影(stereographic projection)压回二维,用这组坐标去采样纹理。效果是中心附近坐标变化极小、几乎不变形,越靠边缘畸变越强,图像被压缩,看上去就像裹在一个向观察者凸出、向远处弯走的曲面上。网格本身一个顶点都没动,材质只改了采样坐标。

整个体积感是材质造出来的幻觉,几何体从头到尾都是一张平板。

World Position Offset只干一件事:让卡片永远正对相机

World Position Offset在这套系统里的职责被刻意压到最小:用相机朝向重建顶点位置到相机基底下,保证卡片始终平铺且平行于屏幕,哪怕行星在画面里偏离中心也一样。这个技巧她在另一篇《Material-Based Mesh Rotation in UE5: Math and Logic》里详细写过。换句话说,WPO不参与“变圆”,它只负责“别让观众看出这是张纸”。

真正的难题:纹理运动必须区分偏移与旋转

相机要能自由绕行星转,行星自己也能转,纹理还得表现得像贴在三维表面上。赤道附近好办:沿赤道的移动是水平UV偏移,沿子午线的移动是垂直偏移,两个offset就能拆解。但靠近两极,光靠偏移不够了,图像必须在卡片上旋转。所以纹理运动是偏移与旋转的混合:垂直偏移管子午线方向,赤道附近水平移动也主要靠偏移,但随着相机逼近极点,偏移的影响力逐渐衰减,绕一个计算出的枢轴(pivot)的旋转逐步接管。

为什么变换必须累积:路径依赖是这套方案的死穴

这是全文最关键的洞察。相机从A点走到D点可以走两条路:第一条直接沿赤道走,全程几乎由水平偏移完成,到D点看到纹理的某个区域;第二条先沿子午线从A到B(主要是垂直偏移,纹理逐渐平移),再沿靠近极点的纬线从B到C(此时绕可见极点位置的旋转开始主导),最后沿另一条子午线从C下到D——虽然最后这段又对应垂直运动,但纹理已经被前两段平移和旋转过了,新的垂直运动不能直接加在原始UV上,必须加在已经旋转过的坐标系里,同时保持当前纹理位置。

两条路径终点都是D,但看到的纹理区域不同。这不是真正的三维球体旋转,而是用可平铺二维纹理搭出来的近似——正因为最终状态依赖路径,系统必须记住当前状态,把每次变化叠加在它之上。

材质不在帧与帧之间保存这种状态,所以流程被劈成两半:Blueprint保存运动历史,材质只接收最终累积好的二维变换。

Blueprint里到底存了什么、算了什么

Blueprint存两类信息:一是累积的纹理偏移与旋转;二是上一帧相机相对行星的状态——相机在赤道上方还是下方多远、从行星哪一侧观察。每次更新时对比前后状态,判断视点怎么变,把对应的偏移或旋转加进累积变换。

计算顺序是:先算行星中心指向相机的方向,变换到Actor局部空间——这一步让纹理运动不只依赖相机位置,也依赖行星当前朝向。然后把这个方向拆成纬度和经度:纬度看方向相对局部+Z向上或向下偏了多少,当前纬度与存储纬度的差就是垂直纹理偏移;经度则先把方向投影到赤道平面(去掉沿极轴的分量),剩下的水平方向表示相机从哪一侧看行星,与上一帧的方向比较,绕局部+Z量出夹角,符号给运动方向、大小给经度变化量。

极点附近必须“冻结经度”

靠近极点时赤道投影变得极短,到了极点本身完全消失——所有子午线在那里交汇,经度无法可靠确定。系统的处理是:在该区域暂停更新经度,保留最后一个有效的赤道方向。这个细节很要命,不这么做,相机穿过极区时纹理会随机跳变。

经度变化量的用法还随纬度而变:远离极点时它主要产生水平偏移,相机越接近极点,这个偏移的影响越小,经度分量逐渐转成纹理旋转。

垂直偏移的符号陷阱

当前版本用局部+Z作南北极轴、局部+X定义初始经度方向。当相机绕到行星顶部或底部上方时,它的屏幕空间up方向可能反过来指向行星局部+Z轴的反方向;如果纬度变化还保持原来的符号,纹理就会在屏幕上朝错误方向移动。Blueprint的解法是对比CameraUp与行星局部+Z轴的世界空间方向,两者反向时就把符号翻转过来。

所以呢

对做太空题材或任何需要“远景天体”的团队,这套方案的现实价值很直接:美术资产管线被彻底解耦——程序化噪声、可平铺岩石/云层纹理可以直接复用,不必为每颗行星维护球形UV变体和球形贴图,迭代成本从“重做贴图”降到“调材质参数”。代价是把复杂度从资产端转移到了逻辑端:一个路径依赖的累积状态机、一套极区退化处理、一个符号翻转的边界条件,任何一处写错都会表现为纹理跳变或反向漂移,而这类bug在静态截图里完全看不出来,只有相机连续运动时才暴露。

更值得记下的是这个方法论的普适性:当材质缺乏跨帧状态时,把“有状态的部分”上移到Blueprint、材质只做无状态的最终变换,是UE5里处理这类伪三维效果的通用解法。它同时也划出了边界——这是近似,不是真球体,极点附近的经度不可定义就是数学上的硬限制,靠工程手段只能掩盖、不能消除。TYBALT还没发售,这套行星方案最终在游戏里扛不扛得住玩家贴着边缘绕飞的检验,才是它真正的验收标准。

其
软件技术UE5材质伪球体UV变换技术美术