使用 WPF 和 C# 绘制覆盖网格的 3D 表面

此示例展示了如何使用 C# 代码和 XAML 绘制覆盖有网格的 3D 表面。示例使用 WPF 和 C# 将纹理应用于三角形展示了如何将纹理应用于三角形。此示例只是使用该技术将包含大网格的位图应用于表面。

在类级别,程序使用以下代码来定义将点的 X 和 Z 坐标映射到 0.0 - 1.0 范围的比例因子。

cs 复制代码
private const double texture_xscale = (xmax - xmin);
private const double texture_zscale = (zmax - zmin);

下面的代码显示了程序如何向 3D 模型添加新点。

cs 复制代码
// A dictionary to hold points for fast lookup.
private Dictionary<Point3D, int> PointDictionary =
    new Dictionary<Point3D, int>();

// If the point already exists, return its index.
// Otherwise create the point and return its new index.
private int AddPoint(Point3DCollection points,
    PointCollection texture_coords, Point3D point)
{
    // If the point is in the point dictionary,
    // return its saved index.
    if (PointDictionary.ContainsKey(point))
        return PointDictionary[point];

    // We didn't find the point. Create it.
    points.Add(point);
    PointDictionary.Add(point, points.Count - 1);

    // Set the point's texture coordinates.
    texture_coords.Add(
        new Point(
            (point.X - xmin) * texture_xscale,
            (point.Z - zmin) * texture_zscale));

    // Return the new point's index.
    return points.Count - 1;
}

与前面的示例一样,代码定义了一个字典来保存Point,以便可以快速查找它们。AddPoint方法查找一个点,如果该点尚不存在,则添加它。然后,它使用该点的 X 和 Z 坐标将该点映射到对象纹理使用的 UV 坐标的 0.0 - 1.0 范围。换句话说,具有最小 X/Z 坐标的点被映射到 (0, 0) 附近的 U/V 坐标,具有最大 X/Z 坐标的点被映射到 (1, 1) 附近的 U/V 坐标。

创建三角形后,程序使用以下代码来创建其材质。

cs 复制代码
// Make the surface's material using an image brush.
ImageBrush grid_brush = new ImageBrush();
grid_brush.ImageSource =
    new BitmapImage(new Uri("Grid.png", UriKind.Relative));
DiffuseMaterial grid_material = new DiffuseMaterial(grid_brush);

文件 Grid.png 仅包含一个 513×513 像素的网格。或者,您也可以在代码中创建网格。第三种方法是使用偏导数来确定应该在哪里绘制线条,然后使用细长的矩形或框将它们绘制在表面上。(后面的帖子将解释如何绘制细长的框。)然而,这会需要做更多的工作。

|--------------------------------------------------------------------------|
| 我知道这些例子省略了大量细节。它们相互依存,所以您已经在之前的帖子中看到了关键点。细节也相当长,所以为了节省空间,我不会在每篇文章中都包含它们。 |

相关推荐
懒人Ethan18 小时前
解决一个C# 在Framework 4.5反序列化的问题
java·前端·c#
mysolisoft20 小时前
Avalonia+ReactiveUI实现记录自动更新
c#·avalonia·reactiveui·sourcegenerator
心疼你的一切21 小时前
使用Unity引擎开发Rokid主机应用的模型交互操作
游戏·ui·unity·c#·游戏引擎·交互
韩立学长21 小时前
【开题答辩实录分享】以《C#大型超市商品上架调配管理系统的设计与实现》为例进行答辩实录分享
开发语言·c#
夏婵语冰1 天前
C4D R20新功能实战指南:深度解析域、节点材质与OpenVDB,提升你的3D创作效率
3d·材质·动画制作·三维设计·c4d教程
玩泥巴的1 天前
.NET驾驭Word之力:数据驱动文档 - 邮件合并与自定义数据填充完全指南
c#·word·.net·com互操作
心疼你的一切1 天前
使用Unity引擎开发Rokid主机应用的全面配置交互操作
学习·游戏·unity·c#·游戏引擎·交互
椒颜皮皮虾྅1 天前
【DeploySharp 】基于DeploySharp 的深度学习模型部署测试平台:安装和使用流程
人工智能·深度学习·开源·c#·openvino
kalvin_y_liu2 天前
【MES架构师与C#高级工程师(设备控制方向)两大职业路径的技术】
开发语言·职场和发展·c#·mes
椒颜皮皮虾2 天前
基于DeploySharp 的深度学习模型部署测试平台:支持YOLO全系列模型
c#