WPF 3d - 理解纹理坐标

use*_*635 5 3d wpf textures

在我尝试理解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>
Run Code Online (Sandbox Code Playgroud)

我期待的是红色三角形,因为纹理的所有y坐标都是0.0,但我得到的是绿色的!有人可以解释一下这种行为,以便我能够纠正我的理解,然后转向更大的模型吗?谢谢!

Nic*_*ler 6

通常,纹理坐标定义在[0,1]范围内.但是,WPF允许您使用任何倍数.但是让我们保持开头的[0,1]范围.然后您定义的渐变如下所示:

梯度

如果我们将纹理坐标更改为以下内容:

TextureCoordinates="0.5 0.0,
                    0.5 0.0,
                    0.5 1.0" 
Run Code Online (Sandbox Code Playgroud)

然后我们在三角形上得到一个很好的渐变:

三角形

纹理坐标在三角形中插值,并从梯度中提取适当的颜色.左下顶点具有纹理坐标(0.5,0),在渐变中为红色.顶部顶点具有纹理坐标(0.5,1),在渐变中为绿色.

正如我所说,纹理坐标可以相对使用.它们通过边界框缩放.因此我们还可以定义以下坐标以获得相同的结果(按2缩放并移动(0.5,0.5)):

TextureCoordinates="1.5 0.5,
                    1.5 0.5,
                    1.5 2.5"
Run Code Online (Sandbox Code Playgroud)

这正是重点,为什么你得到一个纹理坐标的绿色三角形.因为所有坐标都相同,所以边界框宽0个单位,高0个单位.没有合理的方法可以将任意纹理坐标拟合到此简并边界框中.我不知道为什么WPF会选择绿色边缘.可能是未定义的行为.

总而言之,始终定义不会导致退化边界框的正确纹理坐标.

您可能已经注意到替代纹理坐标会生成宽度为零的边界框.但是,在这种情况下这是可以的,因为梯度不会沿着u方向变化.