Ue5.2 数字孪生(3)——地形材质基于WorldPosition绝对世界位置高度混合草地和泥土图层

WorldPosition绝对世界位置:

  • WorldPosition绝对世界位置节点,通过Mask节点获取B通道(Z轴)数值对草地和泥土两张贴图进行插值;
    两张贴图纹理进行混合,上面(高出)显示草地,下面(低处)显示泥土纹理;
  • 用减法添加控制草地和泥土过渡高度的参数;
  • 由于两个纹理过渡太过生硬不自然;这里可以使用除法来控制混合的强度;
  • 这里同样可以使用噪波纹理,使两个纹理再过渡过程中出现不规则的锯齿效果,更贴近现实;
  • 将草地和泥土贴图基于世界高度混合的结果连接基础颜色;再游戏视口中调整,混合高度以及混合强度等参数,即可获得基于地形高度自动生成草地和泥土纹理的地形材质;
    需要注意地形再世界场景中的位置;
  • 这里,我们只对草地和泥土贴图中的颜色贴图进行了高度的混合,其余的高光和法线贴图同样需要进行混合才能到正确的地形纹理信息;
    由于多张贴图需要进行混合,这里我们引入材质函数来简化材质图表连线;

材质函数:

  • 将代表草地的颜色、高光、法线贴图合并成只有一个输出节点的材质函数;
  • 创建材质贴图函数:
  • 设置颜色、高光、法线三个输入向量
  • 将材质贴图函数拖到地形材质中,分别连接代表草地和泥土的三张贴图;
    在将材质贴图函数进行Lerp插值时,出现数值属性不兼容的情况;
  • 系统自带Lerp函数只支持浮点数值,这里我们需要单独创建一个专门用于插值贴图函数的Lerp函数;
  • 同样的方式创建Lerp函数,将两个材质中的基础颜色、粗糙度、法线分别进行插值,再合成新的材质;
    需要注意的是,我们的输入值是两个材质属性,和一个Alpha浮点数值;
  • 最后将Lerp材质插值函数拖到地形材质图表中,基于世界高度将地形和草地两个贴图函数进行插值,最后输出,查看草地和泥土混合效果;
  • 需要将地形材质结果节点转换成材质属性节点,才能进行连接;
  • 最终效果:基于地形高度自动生草地纹理和泥土纹理;
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将MediaPipe Landmark3D坐标转换为UE5世界坐标,需要进行以下步骤: 1. 获取相机的内参和外参矩阵。 2. 将MediaPipe Landmark3D坐标转换为相机坐标系下的坐标。 3. 将相机坐标系下的坐标转换为UE5世界坐标系下的坐标。 具体操作如下: 1. 获取相机内参和外参矩阵 在UE5中,可以通过相机Actor的GetCameraCacheEntry()函数获取相机的内参和外参矩阵。具体操作如下: ```cpp FMinimalViewInfo ViewInfo; GetCameraCacheEntry(ViewInfo); // 相机内参矩阵 FMatrix ProjectionMatrix = ViewInfo.ComputeProjectionMatrix(); // 相机外参矩阵 FMatrix ViewMatrix = ViewInfo.ViewMatrix; ``` 2. 将MediaPipe Landmark3D坐标转换为相机坐标系下的坐标 MediaPipe Landmark3D坐标系的原点位于相机的光心,x轴指向相机的右侧,y轴指向相机的上方,z轴指向相机的前方。因此,将MediaPipe Landmark3D坐标转换为相机坐标系下的坐标,可以使用以下公式: ```cpp FVector CameraPosition = FVector(0, 0, 0); // 相机位置 FVector LandmarkPosition = FVector(Landmark3D.x, Landmark3D.y, Landmark3D.z); // Landmark3D坐标 // 将Landmark3D坐标转换为相机坐标系下的坐标 FVector CameraPositionInLandmarkCoord = LandmarkPosition - CameraPosition; FVector CameraPositionInCameraCoord = ViewMatrix.TransformPosition(CameraPositionInLandmarkCoord); ``` 3. 将相机坐标系下的坐标转换为UE5世界坐标系下的坐标 将相机坐标系下的坐标转换为UE5世界坐标系下的坐标,可以使用以下公式: ```cpp // 将相机坐标系下的坐标转换为UE5世界坐标系下的坐标 FVector WorldPositionInCameraCoord = ProjectionMatrix.InverseTransformPosition(CameraPositionInCameraCoord); FVector WorldPosition = ViewMatrix.InverseTransformPosition(WorldPositionInCameraCoord); ``` 至此,MediaPipe Landmark3D坐标已经成功转换为UE5世界坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值