WPF 3D: MeshGeometry3D纹理坐标的正确定义

时间:2023-03-09 15:09:19
WPF 3D: MeshGeometry3D纹理坐标的正确定义

原文 WPF 3D: MeshGeometry3D纹理坐标的正确定义

为了使基于2D的纹理显示在3D对象中,我们必须定义3D Mesh对象的纹理贴图坐标。在WPF中,此项功能则通过MeshGeometry3D.TextureCoordinates属性。

2D纹理的对应坐标和WPF的LinearGradientBrush的StartPoint和EndPoint一样。

下图来自MSDN关于LinearGradientBrush的StartPoint的说明:

WPF 3D: MeshGeometry3D纹理坐标的正确定义

(0,0)代表整个图形的左上角,(1,1)则代表右下角。(0,1)则代表左下角……当然单位是相对的,可以用0到1之间的小数来代表中间的相对位置。

对于最简单的没有共享顶点的Mesh定义(MeshGeometry3D.Positions属性没有共享点),TextureCoordinates则对应Mesh中的每一个三角形的坐标相对应,当然这个和MeshGeometry3D.TriangleIndices属性定义相关。

比如定义一个简单的3D平面矩形,首先一次根据三角形分布定义MeshGeometry的外壳。此时纹理坐标要根据三角形的分布位置来定义纹理坐标位置,比如第一个点是0, 0, 0,显然对应3D空间内矩形的左下角,那么第一个对应的TextureCoordinates是0 1,以此类推,这样定义好整个平面。

<MeshGeometry3D Positions="0 0 0, 5 5 0, 0 5 0, 0 0 0, 5 0 0, 5 5 0"
TriangleIndices="0 1 2 3 4 5"
TextureCoordinates="0 1, 1 0, 0 0,
0 1, 1 1, 1 0"/>

最终纹理被正确显示:

WPF 3D: MeshGeometry3D纹理坐标的正确定义

WPF 3D: MeshGeometry3D纹理坐标的正确定义