WPF 3d——理解纹理坐标

标签 wpf 3d 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>

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

最佳答案

通常,纹理坐标定义在 [0, 1] 范围内。但是,WPF 允许您使用任意倍数。但是让我们继续使用 [0, 1] 范围作为开始。然后你定义的渐变看起来像这样:

Gradient

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

TextureCoordinates="0.5 0.0,
                    0.5 0.0,
                    0.5 1.0" 

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

Triangle

纹理坐标被插入到三角形中,并从渐变中获取适当的颜色。左下角顶点的纹理坐标为 (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 方向变化。

关于WPF 3d——理解纹理坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18776406/

相关文章:

wpf - Datagrid 绑定(bind)文本框内存泄漏

c# - 类型 '' 不能用作泛型类型或方法 'T' 中的类型参数 ''。没有从 '' 到 '' 的隐式引用转换

java - 插件显示来自 VRML 或 X3D 的 3D 对象

java - Android OpenGL ES 2.0 : Cube model is not only distorted (perspective is wrong?),但面部加载不正确(顶点不正确?)

c++ - 如何为生成艺术目的在单个缓冲区上绘制

c# - 为什么 Line.Stroke.ToString() 返回 8 个符号的十六进制代码

WPF : Binding Order

c++ - 玛雅编程 : Separating attributes into sections in the attribute editor

c++ - 结合 GL_TEXTURE_BUFFER 和 GL_TEXTURE_1D 后片段着色器似乎失败

c++ - 在屏幕上绘制纹理