TranslatedWorld数据

简单来说,平移世界空间(Translated World Space) ,可以理解为UE为了渲染精度而引入的一个以摄像机为浮动原点的临时坐标系统。

它的核心价值在于解决大世界场景中的浮点精度问题,避免了因坐标数值过大导致的模型"抖动"或渲染错误。

空间 原点 轴方向 获取方式
绝对世界空间 关卡绝对原点 (0,0,0) 世界轴 (X,Y,Z) GetAbsoluteWorldPosition (不常用)
平移世界空间 (TranslatedWorld) 当前相机位置 世界轴 (X,Y,Z) GetTranslatedWorldPosition(Parameters)
相机局部空间 (View Space) 当前相机位置 相机右、上、前方向 TransformWorldToView

平移世界坐标 = 绝对世界坐标 - 摄像机偏移

其中,"摄像机偏移"就是 PreViewTranslation

复制代码
// 示例:在HLSL中获取并转换坐标
// 1. 获取材质节点的世界位置偏移并转换
float3 WorldPositionOffset = ... // 在绝对世界空间中计算偏移
float3 TranslatedWorldPositionOffset = WorldPositionOffset - ResolvedView.PreViewTranslation;

// 2. 获取绝对世界空间坐标并转换
float3 TranslatedWorldPos = GetTranslatedWorldPosition(Parameters);
float3 AbsoluteWorldPos = TranslatedWorldPos + ResolvedView.PreViewTranslation;

浮点数精度的本质

浮点数(float)能表示的数值越大 ,相邻两个可表示数值之间的**间距(步长)**就越大。

  • 在 0 附近,步长大约 1e-45 到 1e-38,非常密集。

  • 在 1,000 附近,步长大约是 0.00006。

  • 在 1,000,000 附近,步长大约是 0.125(即 1/8)。

  • 在 10,000,000 附近,步长大约是 1.0。

这意味着:当物体距离世界原点很远(比如 100 万单位)时,float 无法区分两个相距 0.1 单位 的顶点 ------ 因为它们会被舍入到同一个浮点值。结果就是:模型表面出现抖动、裂缝或错误的深度值。

问题:一个远距离的不精细的值减去一个相机位置难道,最后数据就很精细吗

  1. CPU 侧(游戏逻辑/场景管理) :物体的世界坐标使用 双精度浮点数(double) 存储,例如 (1000000.123456789, ...)。这个值非常精确。

  2. 每帧渲染前:CPU 计算出相机位置(也是 double),然后计算每个物体相对于相机的偏移:

    text

    复制代码
    TranslatedPos_Double = AbsWorldPos_Double - CameraPos_Double

    这个减法是在 double 下完成的,结果是一个小数值(例如 (10.123456789, ...))。

  3. GPU 数据上传 :将这个 double 结果 转换为 float 后传给 GPU。因为此时数值已经很小(通常 ≤ 几千),float 在该范围内的步长非常小(例如 10 附近步长约 1.19e-6),能够精确表示 0.000001 量级的差异,所以不会丢失精度。

结论 :用来做减法的原始数据是 double,它本身就精确,减法结果也是精确的。转换为 float 是在数值变小之后才发生的,因此精度得以保留。


类比理解

想象你有一把只能精确到厘米的尺子(float),要去量一张桌子距离墙的长度。墙在 10000.123 米处,桌子在 10000.234 米处。

  • 如果用这把尺子直接量两个大数:你只能读到 10000.12 和 10000.23,相减得 0.11 米(实际 0.111 米),误差 1 毫米。

  • 正确做法:先用更精密的仪器(double)测出两者精确位置,计算差值 0.111 米,再用厘米尺去量这个 0.111 米 ------ 尺子精度完全够,因为数值小。

GPU 就是那个"厘米尺",CPU 就是"精密仪器"。


LocalToWorld 和 PreViewTranslation 都是 CPU 每帧传给 GPU 的

  • LocalToWorld :物体的局部到世界变换矩阵。CPU 侧维护的是高精度的 double 矩阵,但在上传到 GPU 时会被转换为 float4x4(为了性能)。为了补偿转换后的精度损失,UE 引擎采用了"平移世界空间"策略,即另外提供 PreViewTranslation。

  • PreViewTranslation :即当前帧相机位置的负值(-CameraPos),也是 CPU 用 double 计算后转为 float 传给 GPU。

相关推荐
FLJwu5 天前
存储与固件量产实战01:运动相机TF卡量产翻车实录!V30≠4K可用,90%OEM踩中的隐形售后坑
经验分享·数码相机·相机
FLJwu6 天前
整机可靠性测试实战 03:防水密封可靠性|IP67/IP68 结构设计、密封胶圈选型与泡水测试量产翻车整改
经验分享·数码相机·相机
FLJwu10 天前
传感器与图像 ISP 实战 03:运动相机图像量产一致性|批次色差、白平衡漂移、整机标定与出厂图像质检方案|20 年源头工厂量产经验
图像处理·经验分享·数码相机·相机·isp
蓝宝石的傻话11 天前
MiBee Eye Notebook:把闲置笔记本变成一台带麦克风的网络摄像头
数码相机·rust
大熊背12 天前
《Color constancy by characterization of illumination chromaticity》之色度色域最大化算法(一)
数码相机·算法·白平衡·色度色域
xwz小王子12 天前
【通用世界模型】把机器人动作变成像素流!NVIDIA 提出 Hydra-0:跨人类、单臂与双臂统一预测和控制
数码相机·机器人
菩提树下的凡夫13 天前
激光振镜双目结构光3D相机丢点问题
数码相机·3d
YMWM_13 天前
查看realsense相机序列号脚本
开发语言·python·数码相机
视觉工程师070614 天前
工业相机选择CCD 还是 CMOS
数码相机·视觉检测
FLJwu15 天前
运动相机 ID 外观与壳体开模实战 02:壳体注塑缺陷|缩水、气泡、披风、熔接痕量产改善方案|20 年源头工厂量产经验
经验分享·数码相机·相机