在我尝试理解WPF 3D中的纹理坐标时,我从一个非常简单的例子开始:一个三角形,一个线性渐变画笔和纹理坐标,如下所示:
<Viewport3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<GeometryModel3D>
<!-- Geometry -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="10 10 0,
20 10 0,
15 15 0"
TriangleIndices="0 1 2"
TextureCoordinates="0.5 0.0,
0.5 0.0,
0.5 0.0" />
</GeometryModel3D.Geometry>
<!-- Foreground and background brushes -->
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0.5 0" EndPoint="0.5 1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Red" Offset="0.0"/>
<GradientStop Color="Yellow" Offset="0.50"/>
<GradientStop Color="Green" Offset="1.0"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.BackMaterial>
<DiffuseMaterial Brush="Blue" />
</GeometryModel3D.BackMaterial>
</GeometryModel3D>
<!-- Lighting -->
<AmbientLight Color="White" />
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
<!-- Camera -->
<Viewport3D.Camera>
<PerspectiveCamera Position="15 12 10"
LookDirection="0 0 -1"
UpDirection="0 1 0"
FieldOfView="90">
</PerspectiveCamera>
</Viewport3D.Camera>
</Viewport3D>
我期待的是一个红色三角形,因为纹理的所有y坐标都是0.0,但我得到的是绿色一个!有人可以解释一下这种行为,以便我能够纠正我的理解,然后转向更大的模型吗?谢谢!
答案 0 :(得分:6)
通常,纹理坐标定义在[0,1]范围内。但是,WPF允许您使用任何倍数。但是让我们保持开头的[0,1]范围。然后您定义的渐变如下所示:
如果我们将纹理坐标更改为以下内容:
TextureCoordinates="0.5 0.0,
0.5 0.0,
0.5 1.0"
然后我们在三角形上得到一个很好的渐变:
纹理坐标在三角形中插值,并从渐变中提取适当的颜色。左下顶点具有纹理坐标(0.5,0),在渐变中为红色。顶部顶点具有纹理坐标(0.5,1),在渐变中为绿色。
正如我所说,纹理坐标可以相对使用。它们通过边界框缩放。因此,我们还可以定义以下坐标以获得相同的结果(按2缩放并移动(0.5,0.5)):
TextureCoordinates="1.5 0.5,
1.5 0.5,
1.5 2.5"
这正是关键所在,为什么你会得到一个带纹理坐标的绿色三角形。因为所有坐标都相同,所以边界框为0个单位宽,0个单位高。没有合理的方法可以将任意纹理坐标拟合到此简并边界框中。我不知道为什么WPF会选择绿色边缘。可能是未定义的行为。
总之,始终定义不会导致退化边界框的正确纹理坐标。
您可能已经注意到替代纹理坐标会生成宽度为零的边界框。但是,在这种情况下这是可以的,因为渐变不会沿着u方向变化。
答案 1 :(得分:1)
请参阅 Daniel Lehenbauer's blog 有关WPF中2D到3D映射过程的有用描述。