跳到正文
80 Level · 游戏美术与技术· 来源· Alina Ledeneva·· 4 小时前AI 评分70

UE5技术美术详解:用可平铺材质模拟球体行星

Faking a Spherical Planet with a Tileable Texture in UE5

正文 · AI 翻译

UE5 技术美术

2026年11月4日

Alina Ledeneva 探索了一种基于材质的伪球体技术,使得无需自定义球形 UV 映射即可使用常规的平铺纹理。

简介

如果我告诉你,这个星球实际上只是一张带有常规可平铺纹理的平面卡片呢?场景中不存在球形网格,也没有预先准备为球面贴图使用的纹理。几何体从未弯曲或变成半球体。整个体积感的错觉是在材质中实现的:World Position Offset 使平面卡片始终面向摄像机,而经过变换的 UV 则让图像看起来像是被映射到了曲面上。这一效果出自 Kamishibai Interactive 即将推出的单人叙事驱动射击游戏 TYBALT 的研发工作,该作灵感来源于《命运》《马拉松》《Witchfire》《SOMA》和《系统冲击》。

行星视觉效果的目标之一是让艺术家能够使用程序化和可平铺的纹理,而无需将其转换为球形贴图或为每个变体专门准备球形UV布局。在探索使该工作流更加灵活的方法时,我开发了这种基于材质的技术。在本文中,我将分解实验背后的材质和蓝图逻辑。

在材质中创建伪球体

为了扭曲纹理,我使用了半球体的立体投影。首先,将卡片的UV围绕卡片中心重新映射,并将其视为面向摄像头的半球体的X和Y坐标。从这两个坐标中,材质重建第三个坐标:该点在半球体上应有的深度。

随后,该3D半球位置通过立体投影映射到用于采样纹理的2D坐标中。在中心附近,坐标变化很小,但越靠近边缘,失真就越强烈。在边缘附近,这种效果会压缩图像,使其看起来像是包裹在一个向观察者弯曲凸出的表面上。网格本身并未发生形变。材质仅改变了用于采样常规可平铺2D纹理的坐标。仅此一点就足以营造出基本的体积感错觉。

世界位置偏移的作用

World Position Offset 只有一个任务:让平面卡片始终面向相机。该材质利用相机的朝向,在对应的相机基底下重建顶点位置。即使行星偏离画面中心,卡片仍保持扁平并与屏幕平行。我在文章 Material-Based Mesh Rotation in UE5: Math and Logic 中更详细地描述了这项技术。

处理纹理移动

相机需要围绕行星自由环绕,同时纹理表现得仿佛实际附着在一个3D表面上。行星本身也可以旋转,因此系统必须对相机运动和行星朝向的变化做出一致响应。

远离极点时,这种运动可以相当容易地分解为两个UV偏移量。沿赤道的运动可以用水平偏移来表示,而沿经线的运动则表现为垂直偏移。然而,在极点附近,仅靠偏移量已不再足够。图像还必须在卡片上旋转。

纹理运动使用偏移和旋转的组合。垂直偏移处理沿经线的运动。在赤道附近,水平运动也主要由偏移来处理,但随着相机接近极点,该偏移的影响逐渐减弱,而围绕计算出的枢轴点的旋转接管了控制。

为什么变换必须累积

相机可以沿两条不同的路径从A点移动到D点。

在第一种情况下,它直接沿赤道移动。水平偏移在整个路径上承担主要工作,在D点我们可以看到纹理的特定区域。

在第二种情况下,相机首先沿经线从A移动到B。这部分主要由垂直偏移表示,因此纹理逐渐变化。然后它沿靠近极点的上方平行线从B移动到C。在这里,围绕可见极点位置的旋转开始占据主导地位。最后,相机沿另一条经线从C向下移动到D。

尽管这一最后一节再次对应垂直运动,但纹理已经被路径的前几部分平移和旋转。新的垂直运动不能简单地应用于原始UV坐标。它必须在已经旋转的坐标系中添加,同时保持当前的纹理位置。

两条路径都以相机位于同一点D结束,但它们显示了纹理的不同部分。这并不是球体的真正3D旋转,而是由可平铺的2D纹理构建的近似效果。

由于最终的纹理状态取决于路径,系统必须记住当前状态,并在其上应用每一个新的变化。

材质不会在帧间保留这种状态,因此我将流程拆分为蓝图和材质两部分。蓝图负责保存移动历史,而材质接收最终累积的二维变换。

确定纹理移动

蓝图存储两类信息。首先是累积的纹理偏移量和旋转角度。其次是来自上一个相机位置相对于行星的数据:相机位于赤道上方或下方多远,以及它正在观察行星的哪一侧。在每次更新时,蓝图会比较先前状态与当前状态,确定视角发生了怎样的变化,并将相应的偏移量或旋转量添加到累积变换中。

Blueprint 首先计算从行星中心到摄像机的方向,并将其转换为角色的局部空间。这使得纹理移动不仅取决于摄像机位置,还取决于行星的当前朝向。随后将该方向分解为纬度和经度。

纬度基于摄像机方向相对于局部 +Z 轴向上或向下的程度。当前纬度与存储纬度之间的差值成为垂直纹理偏移量。

对于经度,首先通过将相机方向沿极轴的分量移除,将其投影到赤道平面上。剩余的是一个水平方向,指示相机从行星的哪一侧进行观察。Blueprint 将其与上一次更新的方向进行比较,并测量它们之间围绕局部 +Z 轴的夹角。该角度的符号给出运动方向,而其大小则给出经度的变化量。

在极点附近,赤道投影变得非常短,而在极点本身则完全消失。所有经线在那里交汇,因此无法再可靠地确定经度。在该区域,系统暂时停止更新经度,并保留最后一个有效的赤道方向。保留最后一个有效的方向可以防止相机穿过极地区域时纹理发生随机跳跃。

经度的变化根据纬度以不同方式使用。远离极点时,它产生一个主要是水平的偏移。随着相机接近极点,该偏移的影响减小,经度分量逐渐转变为纹理旋转。

垂直偏移符号

在当前版本中,本地+Z轴用作南北极轴,而本地+X轴定义初始经度方向。当摄像机绕行星顶部或底部运行时,其屏幕空间的上方向最终可能与行星的本地+Z轴相反。如果纬度变化的符号保持不变,纹理就会开始以错误的方向在屏幕上移动。

蓝图将CameraUp与行星本地+Z轴的世界空间方向进行比较。当它们指向相反方向时,它会反转垂直偏移量。这确保了摄像机越过极点之后,沿子午线的运动在视觉上保持连续。

寻找旋转枢轴

为了使纹理旋转看起来正确,系统需要知道极点在卡片上的位置。通过比较从行星中心到摄像机的方向与行星的局部Z轴,它确定摄像机所在的半球。由此,它选择可见的极点方向:即纹理应围绕其旋转的北极或南极。

选定的极点方向首先被转换到摄像机基坐标系中,该基坐标系直接由摄像机朝向构建,并且始终与屏幕平行。得到的点对应于极点在屏幕上的位置。然后,使用与材质创建伪球面UV时相同的立体投影原理,将其投影到卡片的二维空间中。

结果是表示卡片上可见杆当前位置的二维点,该点成为纹理旋转的枢轴。枢轴并非固定不变。随着相机移动或角色旋转,它会持续重新计算,并考虑累积的偏移和旋转。

组合偏移与旋转

新的偏移和旋转不能简单地独立叠加到之前的值上。如果纹理已经旋转,下一次偏移必须遵循其当前的方向。由于相机移动、角色旋转以及已累积的偏移,可见杆的位置也可能发生变化。

系统将完整的运动历史存储为单个累积的2D变换。它由相对于UV原点的总旋转角度和总平移组成。

例如,纹理可以围绕某点A旋转30°。相同的结果也可以通过围绕(0, 0)旋转30°,然后应用一个将其移回同一最终位置的平移来实现。

首先,系统在应用现有的旋转和平移后确定当前极点位于纹理中的位置。然后计算当前帧的小幅经度和纬度变化。

新的偏移量最初是在原始 UV 轴中计算的。由于纹理可能已经旋转,该偏移方向会在累加角度之后进行旋转,然后再添加到总平移量中。

如果经度变化的一部分需要在极点附近变为旋转,系统会添加一个小的旋转角度并同时调整平移量,使得旋转围绕计算出的极点位置发生。

每次更新后,结果再次以相同的统一形式存储,材质接收最终状态:

  • RotationTurns:围绕 UV 原点的总累积旋转;
  • Translation:总的二维偏移量,包括常规纹理移动以及由之前围绕不同极点位置的所有旋转引入的平移量。

简化版本

效果被拆分为几个独立的层级:

  • 世界位置偏移(World Position Offset)使平面卡片始终面向相机。
  • 材质中的 UV 变换营造出体积的错觉。
  • 蓝图负责连续的表面运动:它跟踪相机运动和角色旋转,存储累积的表面状态,并将局部偏移(LocalOffset)和旋转圈数(RotationTurns)传递给材质。

我还有一个简化版本,仅使用水平和垂直偏移。它不累积状态,不在极点附近旋转纹理,也不需要任何单独的蓝图逻辑。所有运动都在材质中直接计算。

简化版适用于远处的背景行星、装饰性物体、UI场景,以及相机在有限范围内移动且从不经过极点的其他情况。当你只需要轻微的表面运动感,而不需要纹理保留其精确的先前轨迹时,它也非常有用。

当相机可以围绕对象自由环绕、接近极点,或者旋转行星本身必须保持连续的纹理运动时,完整版更为合适。简化版的灵活性较低,但设置起来容易得多,并且完全位于材质内部。

此效果适用的场景

纹理无需预先准备为球面贴图。

对于普通球体,表面图像必须与球体的 UV 布局相匹配。在这里,材质可以使用任何常规的平铺式 2D 纹理。它不需要转换为等距柱状投影图(equirectangular map),也不需要针对极点和经线进行特殊适配。你可以直接使用现有的平铺纹理、程序化图案或快速构建的材质作为行星表面。

相机仍然可以围绕该对象旋转并从不同角度观看。随着纹理的移动和旋转,会产生一种错觉,仿佛图像实际上附着在 3D 表面上。

该效果通过移动纹理来模拟行星可见面的变化,但并不会生成真正的球体几何。因此最终纹理状态取决于相机运动的历史记录。两条不同的路径可能到达相同的相机位置,却显示纹理的不同区域。这种路径依赖性正是底层 2D 模拟的一部分。

Alina Ledeneva,UE5 技术艺术家

来源:80 Level · 游戏美术与技术 · 80.lv